简介
写一个从零写一个 C#微服务解决方案,尽量加入功能
创建一个微服务项目
注:C#里的解决方案对标Java的项目,C#的项目对标Java的模块
Program.cs 是整个文件的入口。其中的 builder,app概念值得梳理。
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
可以看到builder是WebApplication的构建者。这里做的事是把的映射关系作为配置信息载入,可以类比 Spring 中把Bean的注册信息加入BeanFectory,但此时的服务都没有被实例化。
var app = builder.Build();
这一步使得 WebApplication实例化。类比BeanFactory里的类全部实例化。
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
这些 app.UseXXX 是在构建 middleware 管道,就是请求进来先走管道,再执行,平时可以加一些限流,鉴权中间件。
到了这里完整的对比一下 Spring 和 ASP.Net 的区别。
首先从设计哲学上spring遵从约定大于配置,启动就是一句简单的 SpringApplication.run()。而ASP.Net在启动时,由配置加载,实例,到中间件链编排全部需要开发者实现,需要开发者对启动流程有一定的了解。
再来看一下 WebApplication 和 ApplicationContext。WebApplication 的功能包括 启动服务,注册单例,编排中间件。
| ASP. | Spring | |
|---|---|---|
| 加载配置(无感) | WebApplication.Configuration | Environment |
| 注册 bean | builder.Services.AddXXX() | @Bean/Compoment 注解+扫描注册 |
| 服务实例化,依赖注入,生命周期 | WebApplication.Services->IServiceProvider | BeanFactory,常用ApplicationContext |
| 中间件管道 | WebApplication.UseXXX() | Tomcat的Servlet,Filter |
| 应用启动 | app.run() | SpringApplication.run() |
配置文件
ASP.Net 配置文件由两个,appSettings.json,Property/launchSettings.json。
appSettings.json提供应用运行时配置,比如数据库连接,服务地址,这些配置服务器也生效。
Property/launchSettings.json负责启动参数配置,本地启动用的地址、端口。
| 运行时配置 | 启动配置 | |
|---|---|---|
| ASP | appSettings.json | launchSettings.json |
| Spring | application.yml:mysql | application.yml:spirng:port:8080 |