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

相关推荐
纪元A梦30 分钟前
分布式拜占庭容错算法——PBFT算法深度解析
java·分布式·算法
不凡的凡2 小时前
鸿蒙图片缓存(一)
缓存
潘yi.5 小时前
Redis哨兵模式
数据库·redis·缓存
TCChzp6 小时前
Kafka入门-消费者
分布式·kafka
唐墨1239 小时前
LRU 和 DiskLRU实现相册缓存器
缓存
FakeOccupational9 小时前
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 & 定向转发机制
笔记·分布式·p2p
IT_Octopus9 小时前
多线程下使用缓存+锁Lock, 出现“锁失效” + “缓存未命中竞争”的缓存击穿情况,双重检查缓存解决问题
java·spring·缓存
·云扬·11 小时前
【PmHub面试篇】性能监控与分布式追踪利器Skywalking面试专题分析
分布式·面试·skywalking
MuYiLuck11 小时前
【redis实战篇】第八天
数据库·redis·缓存