当前位置:   article > 正文

.NET 7.0+WebAPI 后端架构实战

webapi高并发

前言

从实习到现在回想自己已经入行四年了,很庆幸自己一直还是从事着开发的工作。

这几年不管是工作还是生活都有很多不甘与失落还有收获,从学校出来之后有时候觉得自己的心态受不了小小的打击,可能就像平凡的世界中的孙少平一样,有着一颗敏感而脆弱的自尊心。

春种一粒粟,秋收万颗子。从2021年1月份到现在一直没有更新过博客,在这个播种的季节我想我应该要总结一下过去的技术经验,对自己是提升,对别人可能或多或少都有帮助。

阿里巴巴大神毕玄曾说过,"一个优秀的工程师和一个普通工程师的区别,不是满天飞的架构图,他的功底体现在所写的每一行代码上"。这句话我与诸君共思共勉!

分层目标

  • 大道至简:能提高开发效率,让刚进公司的实习生也能快速上手CRUD

  • 结构清晰:不仅要遵循DIP原则(降低耦合),而且也要保证每一层或每一个类库职责单一,减少后期维护成本

  • 扩展/复用:分层之后有很高的复用性和更方便的横向扩展性

传统三层架构

传统的三层架构:表现层、业务逻辑层和数据访问层,如下图所示:

b19edc1b3509aa72ce0465ee70610a46.png


DDD四层架构

基于DDD的四层架构:用户接口层、应用层、领域层和基础设施层,如下图所示:

05565581f4b83018ae5560b48656fb9a.png

与传统的三层架构相比DDD的分层架构将业务逻辑层拆为了应用层与领域层

678744e757d1dee3018950f03176adc9.png

下方左图为传统四层架构,右图为依赖倒置后的四层架构。应用层与领域层提供接口,基础设施层提供实现。

领域层不依赖任何一层,只专注与业务。个人认为基础设施层迭代频率要低于接口层,抽象程度高于表现层。所以让表现层依赖基础设施层更合适。

d7ed96b76bbfe4870c02b3ef304eacc4.png

我的本系列博客对应的项目也是基于DDD的架构思想,当然也会加入自己的一些想法在其中。

想学习领域驱动设计的同学可移步《DDD 实战课》


项目结构

整体项目结构如下方三张图所示:

d33fec7694e0276080e22709b23f5360.png d737e27772f828cc934abcef219f2b34.png 627f0636e4a791eca00179aa10751bc7.png


层级介绍

1、ICore.WebApi这一层主要构建 RESTful 应用程序,提供HTTP服务。管道中间件、过滤器、跨域、路由、模型验证等都在此配置。

2、ICore.Application这一层很薄,不会包含任何与业务有关的逻辑信息,将使用CQRS的设计模式。安全认证、权限校验、事务控制、发送或订阅领域事件等都可在此层做处理。

3、ICore.Task这一层主要用于处理系统内小型定时任务。繁多、复杂的定时任务建议用第三方调度平台,例如:XXL-JOB。

4、ICore.Domain.Core这一层主要用于实现核心的业务逻辑!内部主要包含Entity(实体)、Domain Event(领域事件)、Domain Service(领域服务)等。

5、ICore.Domain.Abstractions这一层主要用于定义一些基类的接口和领域事件的接口。例如:IAggregateRoot聚合根接口、IEntity、IEntity< TKey> 实体接口等。

6、ICore.Infrastructure.Core这一层主要对整个应用程序提供基础实现,例如仓储的实现、工作单元模式的实现、Redis缓存、队列服务等。

7、ICore.Test这一层主要用于对整个程序的单元测试,减少不必要的BUG以及提高测试效率。

其它规范

编码、格式规范

我强烈建议大家看阿里巴巴Java开发手册,以上面的规范来约束自己的编码。

第1章  编程规约

本章是传统意义上的代码规范,包括变量命名、代码风格、控制语句、代码注释、前后端规约等基本的编程习惯,以及从高并发场景中提炼出来的集合处理技巧与并发多线程的注意事项。

配置文件规范
  • 全部采用json格式文件

  • 建立映射类,使用IOptions< T>方式读取配置信息

  • 数据库连接字符串、数据传输的加密密钥等不建议写在配置文件中,应放到分布式配置中心中

安全规范(只列举部分)
  • 加入恶意请求IP黑名单

  • 防SQL注入攻击

  • 日志应记录请求时间、操作人ID、IP地址、是否成功等重要信息

  • CORS策略应加上白名单限制

  • 生产环境的接口文档不对外暴露

启动项目

首先.Net Core同Spring Boot一样都是自宿主程序,其不是必需在IIS内部托管。实现跨平台离不开.Net Core内置的kestrel高性能服务器,如下图所示(图片来自官网):

ab00287601e4267d6dc70c6af9e0949f.png


修改端口

1、在launchSettings.json文件中修改站点信息,把IIS Express节点删掉

efe4fe2f3de3e60ecb62fdf7bcc41373.png

2、在appsettings.json中设置启动端口

  1. "Kestrel": {
  2.   "Endpoints": {
  3.     "Https": {
  4.       "Url""https://*:8000"
  5.     },
  6.     "Http": {
  7.       "Url""http://*:8001"
  8.     }
  9.   }
  10. }

3、在Program中设置启动端口

ab8eed93329b9302804b6ed15b956117.png
app.Run("http://*:8001");
加入Startup.cs

从.NET 6.0开始已去除了Startup.cs 文件,依赖注入服务和Middleware全在Program.cs中配置。

我从写.NET Core 2.0开始一直到现在,Startup.cs文件我觉得还是有必要存在,个人使用习惯而已

改造Program.cs

  1. using ICore.WebApi;
  2. var builder = WebApplication.CreateBuilder(args);
  3. var startup = new Startup(builder.Configuration);
  4. startup.ConfigureServices(builder.Services);
  5. startup.Configure(builder.Build());
重写Startup.cs
  1. namespace ICore.WebApi
  2. {
  3.     public class Startup
  4.     {
  5.         public IConfiguration Configuration { get; }
  6.         public Startup(IConfiguration configuration) => Configuration = configuration;
  7.         // This method gets called by the runtime. Use this method to add services to the container.
  8.         public void ConfigureServices(IServiceCollection services)
  9.         {
  10.             services.AddControllers();
  11.             // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
  12.             services.AddEndpointsApiExplorer();
  13.             services.AddSwaggerGen();
  14.         }
  15.         // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
  16.         public void Configure(WebApplication app)
  17.         {
  18.             if (app.Environment.IsDevelopment())
  19.             {
  20.                 app.UseSwagger();
  21.                 app.UseSwaggerUI();
  22.             }
  23.             app.UseAuthorization();
  24.             app.MapControllers();
  25.             app.Run("http://*:8001");
  26.         }
  27.     }
  28. }
Run起来!

使用命令行启动dotnet ICore.WebApi.dll --urls="http://*:8001" --ip="127.0.0.1" --port=8001

8eb66a5046853a5e24f3fb7cc9bd0c1f.png 3ccd938b72440dc88cc6ec5ec3861f22.png

这一节就到这里,后面会继续上新!

转自:江北

链接:cnblogs.com/zhangnever/p/17093919.html

- EOF -

技术群:添加小编微信dotnet999

公众号:dotnet讲堂

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/624716
推荐阅读
相关标签
  

闽ICP备14008679号