文章目录
- 项目地址
- 一、结构化日志
-
- [1.1 使用Serilog](#1.1 使用Serilog)
-
- [1. 安装所需要的包](#1. 安装所需要的包)
- [2. 注册服务和配置](#2. 注册服务和配置)
- [3. 安装Seq服务](#3. 安装Seq服务)
- [1.2 添加分布式id中间件](#1.2 添加分布式id中间件)
-
- [1. 添加中间件](#1. 添加中间件)
- [2. 注册服务](#2. 注册服务)
- [3. 修改Application的LoggingBehavior](#3. 修改Application的LoggingBehavior)
- 二、Redis缓存
-
- [2.1 添加缓存](#2.1 添加缓存)
-
- [1. 创建接口ICaching接口](#1. 创建接口ICaching接口)
- [2. 实现ICaching接口](#2. 实现ICaching接口)
- [3. 注册Caching服务](#3. 注册Caching服务)
- [4. 添加Docker](#4. 添加Docker)
- [2.2 服务使用Caching](#2.2 服务使用Caching)
- [2.3 查询使用Caching](#2.3 查询使用Caching)
-
- [1. 添加ICachingQuery接口](#1. 添加ICachingQuery接口)
- [2. 给查询添加缓存](#2. 给查询添加缓存)
- [3. 添加缓存的Pipeline Behaviors](#3. 添加缓存的Pipeline Behaviors)
- [4. 注册管道行为](#4. 注册管道行为)
- [5. 管道行为和中间件的区别](#5. 管道行为和中间件的区别)
- 三、HealthCheck
-
- [3.1 安装healthCheck包](#3.1 安装healthCheck包)
- [3.2 配置HealthCheck](#3.2 配置HealthCheck)
-
- [1. 添加注册服务](#1. 添加注册服务)
- [2. program里添加服务](#2. program里添加服务)
- [四、Api Versioning](#四、Api Versioning)
-
- [4.1 创建版本控制](#4.1 创建版本控制)
-
- [1. 安装需要的包](#1. 安装需要的包)
- [2. 给controller添加版本 控制](#2. 给controller添加版本 控制)
- [4.2 让Swagger支持api](#4.2 让Swagger支持api)
- [五、OutBox Pattern](#五、OutBox Pattern)
-
-
- [5.1 创建OutboxMessage类](#5.1 创建OutboxMessage类)
- [5.2 修改事件发布为Outbox发布](#5.2 修改事件发布为Outbox发布)
- [5.3 创建OutBox表](#5.3 创建OutBox表)
- [5.4 OutBox设置](#5.4 OutBox设置)
- [1. 创建配置类OutboxOptions](#1. 创建配置类OutboxOptions)
- [2. 添加配置](#2. 添加配置)
- [3. 注册配置和服务](#3. 注册配置和服务)
-
项目地址
- 教程作者:
- 教程地址:
- 代码仓库地址:
-
所用到的框架和插件:
dbt
airflow
一、结构化日志
1.1 使用Serilog
1. 安装所需要的包
cs
<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
cs
<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. 安装需要的包
cs
<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类
- 用于实例化消息
cs
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
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
创建配置类``
cs
public sealed class OutboxOptions
{
// 发送到消息队列的间隔时间
public int IntervalInSeconds { get; init; }
// 批量大小
public int BatchSize { get; init; }
}
2. 添加配置
- 在appsettings里添加
cs
"Outbox": {
"IntervalInSeconds": 5,
"BatchSize": 10
}