文章目錄
- 項目地址
- 一、結構化日志
- 1.1 使用Serilog
- 1. 安裝所需要的包
- 2. 注冊服務和配置
- 3. 安裝Seq服務
- 1.2 添加分布式id中間件
- 1. 添加中間件
- 2. 注冊服務
- 3. 修改Application的LoggingBehavior
- 二、Redis緩存
- 2.1 添加緩存
- 1. 創建接口ICaching接口
- 2. 實現ICaching接口
- 3. 注冊Caching服務
- 4. 添加Docker
- 2.2 服務使用Caching
- 2.3 查詢使用Caching
- 1. 添加ICachingQuery接口
- 2. 給查詢添加緩存
- 3. 添加緩存的Pipeline Behaviors
- 4. 注冊管道行為
- 5. 管道行為和中間件的區別
- 三、HealthCheck
- 3.1 安裝healthCheck包
- 3.2 配置HealthCheck
- 1. 添加注冊服務
- 2. program里添加服務
- 四、Api Versioning
- 4.1 創建版本控制
- 1. 安裝需要的包
- 2. 給controller添加版本 控制
- 4.2 讓Swagger支持api
- 五、OutBox Pattern
- 5.1 創建OutboxMessage類
- 5.2 修改事件發布為Outbox發布
- 5.3 創建OutBox表
- 5.4 OutBox設置
- 1. 創建配置類OutboxOptions
- 2. 添加配置
- 3. 注冊配置和服務
項目地址
- 教程作者:
- 教程地址:
- 代碼倉庫地址:
- 所用到的框架和插件:
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}