项目地址
- 教程作者:
- 教程地址:
- 代码仓库地址:
- 所用到的框架和插件:
dbt
airflow
一、结构化日志
1.1 使用Serilog
1. 安装所需要的包
<PackageReference Include="Serilog" Version="4.2.0" />
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
<PackageReference Include="Serilog.Sinks.Seq" Version="9.0.0" />
2. 注册服务和配置
3. 安装Seq服务
1.2 添加分布式id中间件
1. 添加中间件
2. 注册服务
3. 修改Application的LoggingBehavior
二、Redis缓存
2.1 添加缓存
1. 创建接口ICaching接口
- 在Application层
2. 实现ICaching接口
- 在Infrastructure层
3. 注册Caching服务
- 在Infrastructure里注册
4. 添加Docker
添加Redis在docker-compose里
在配置文件里,添加缓存的connection string
2.2 服务使用Caching
- 给非常耗时的服务添加缓存,这里我们给获取用户的Permision进行缓存
2.3 查询使用Caching
1. 添加ICachingQuery接口
- 表示给查询添加缓存
2. 给查询添加缓存
- 给之前的
3. 添加缓存的Pipeline Behaviors
- 管道行为只会
4. 注册管道行为
5. 管道行为和中间件的区别
对比项 | 中间件(Middleware) | 管道行为(Pipeline Behavior) |
---|---|---|
所属框架 | ASP.NET Core | MediatR |
作用范围 | 整个 HTTP 请求生命周期 | 只作用于 MediatR 的请求(IRequest / INotification) |
使用位置 | 配置在 Program.cs 或 Startup.cs |
配置在 AddMediatR(...) 注册过程中 |
执行顺序 | 多个中间件按注册顺序包裹整个请求 | 多个行为按注册顺序包裹 MediatR 的请求处理器 |
核心接口 | RequestDelegate |
IPipelineBehavior<TRequest, TResponse> |
通常用途 | 日志、异常处理、认证、跨域、安全、请求上下文等 | MediatR 请求的日志、验证、缓存、事务处理等 |
是否与控制器耦合 | 不耦合:作用于请求最外层 | 只在你使用 MediatR.Send(...) 时生效 |
是否能终止请求 | ✅ 是:中间件可以选择不调用 next() 终止请求 |
✅ 是:行为也可以选择不调用 next() ,终止链条 |
三、HealthCheck
3.1 安装healthCheck包
- 有什么服务就安装对应的包,这里我们有postgrsql/redis/uris
<PackageReference Include="AspNetCore.HealthChecks.NpgSql" Version="8.0.0" />
<PackageReference Include="AspNetCore.HealthChecks.Redis" Version="8.0.0" />
<PackageReference Include="AspNetCore.HealthChecks.Uris" Version="8.0.0" />
3.2 配置HealthCheck
1. 添加注册服务
2. program里添加服务
四、Api Versioning
4.1 创建版本控制
1. 安装需要的包
<PackageReference Include="Asp.Versioning.Mvc" Version="8.1.0" />
<PackageReference Include="Asp.Versioning.Mvc.ApiExplorer" Version="8.1.0" />
- 添加服务
2. 给controller添加版本 控制
4.2 让Swagger支持api
五、OutBox Pattern
将要发送的消息,先存入数据库的“Outbox 表”中(和业务数据一起在同一个事务中提交)。
另一个后台进程/服务定期扫描 Outbox 表,将消息发送到消息队列(如 Kafka、RabbitMQ)。
发送成功后更新 Outbox 表状态(如标记为已发送)。
5.1 创建OutboxMessage类
- 用于实例化消息
public sealed class OutboxMessage
{
public OutboxMessage(Guid id, DateTime occurredOnUtc, string type, string content)
{
Id = id;
OccurredOnUtc = occurredOnUtc;
Content = content;
Type = type;
}
public Guid Id { get; init; }
public DateTime OccurredOnUtc { get; init; }
public string Type { get; init; }
public string Content { get; init; }
public DateTime? ProcessedOnUtc { get; init; }
public string? Error { get; init; }
}
5.2 修改事件发布为Outbox发布
- 修改之前的事件发布
5.3 创建OutBox表
OutboxMessageConfiguration.cs
internal sealed class OutboxMessageConfiguration : IEntityTypeConfiguration<OutboxMessage>
{
public void Configure(EntityTypeBuilder<OutboxMessage> builder)
{
builder.ToTable("outbox_messages");
builder.HasKey(outboxMessage => outboxMessage.Id);
builder.Property(outboxMessage => outboxMessage.Content).HasColumnType("jsonb");
}
}
5.4 OutBox设置
1. 创建配置类OutboxOptions
创建配置类``
public sealed class OutboxOptions
{
// 发送到消息队列的间隔时间
public int IntervalInSeconds { get; init; }
// 批量大小
public int BatchSize { get; init; }
}
2. 添加配置
- 在appsettings里添加
"Outbox": {
"IntervalInSeconds": 5,
"BatchSize": 10
}