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


文章目录

  • 项目地址
  • 一、结构化日志
    • [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

  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
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
  }

3. 注册配置和服务

相关推荐
北极光SD-WAN组网15 小时前
某光伏电力监控系统网络安全监测项目:智能组网技术优化方案实践
大数据·网络·分布式
EndingCoder15 小时前
Electron 新特性:2025 版本更新解读
前端·javascript·缓存·electron·前端框架·node.js·桌面端
a5876915 小时前
Spring Cloud Gateway:下一代API网关的深度解析与实战指南
java·分布式·网关
潘达斯奈基~15 小时前
kafka:【2】工作原理
大数据·分布式·kafka
励志成为糕手15 小时前
Kafka架构:构建高吞吐量分布式消息系统的艺术
分布式·架构·kafka·消息中间件·数据流处理
小句16 小时前
RabbitMQ对接MQTT消息发布指南
分布式·rabbitmq·ruby
u01040583616 小时前
霸王餐返利app的分布式架构设计:基于事件驱动的订单处理系统
分布式
鼠鼠我捏,要死了捏16 小时前
Caffeine 本地缓存最佳实践与性能优化指南
缓存·性能优化·caffeine
JAVA学习通16 小时前
【RabbitMQ】高级特性:持久性·发送方确认·重试机制·TTL·死信队列·延迟队列·事务·消息分发
分布式·rabbitmq
海阔天空在前走17 小时前
MQ防止重复消费的四种方法
分布式·rabbitmq