(五)毛子整洁架构(分布式日志/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. 注册配置和服务

相关推荐
CodeWithMe2 小时前
【Note】《Kafka: The Definitive Guide》 第8章: Cross-Cluster Data Mirroring
分布式·kafka
Alaia.3 小时前
【kafka 3.9.1】单机版集群部署并配置kafka的SASL认证
分布式·kafka
夜斗小神社3 小时前
【黑马点评】(二)缓存
缓存
勤奋的知更鸟4 小时前
Kettle + 大数据实战:从数据采集到分布式处理的完整流程指南
大数据·分布式
Kookoos4 小时前
ABP VNext + Cosmos DB Change Feed:搭建实时数据变更流服务
数据库·分布式·后端·abp vnext·azure cosmos
Hello.Reader10 小时前
Redis 延迟监控深度指南
数据库·redis·缓存
Hello.Reader15 小时前
Redis 延迟排查与优化全攻略
数据库·redis·缓存
掘金-我是哪吒17 小时前
分布式微服务系统架构第156集:JavaPlus技术文档平台日更-Java线程池使用指南
java·分布式·微服务·云原生·架构
亲爱的非洲野猪18 小时前
Kafka消息积压的多维度解决方案:超越简单扩容的完整策略
java·分布式·中间件·kafka