(五)毛子整洁架构(分布式日志/Redis缓存/OutBox Pattern)

发布于:2025-05-13 ⋅ 阅读:(8) ⋅ 点赞:(0)


项目地址

  • 教程作者:
  • 教程地址:
  • 代码仓库地址:
  • 所用到的框架和插件:
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

  1. 添加Redis在docker-compose里

  2. 在配置文件里,添加缓存的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.csStartup.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
  }

3. 注册配置和服务


网站公告

今日签到

点亮在社区的每一天
去签到