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

相关推荐
运维小杨16 分钟前
Redis哨兵模式搭建
数据库·redis·缓存
weixin_4398280944 分钟前
kafka 消息队列
分布式·kafka
巴里巴气7 小时前
zookeeper基本概念介绍
linux·分布式·zookeeper
lixzest12 小时前
Redis实现数据传输简介
数据库·redis·缓存
lang2015092812 小时前
如何使用 Apache Ignite 作为 Spring 框架的缓存(Spring Cache)后端
spring·缓存·apache·ignite
Linux技术支持工程师12 小时前
二十八、【Linux系统域名解析】DNS安装、子域授权、缓存DNS、分离解析、多域名解析
linux·运维·服务器·缓存·centos
appearappear13 小时前
防止飞书重复回调通知分布式锁
分布式·飞书
梦想养猫开书店16 小时前
36、spark-measure 源码修改用于数据质量监控
大数据·分布式·spark
Chase_______16 小时前
redis快速入门及使用
java·数据库·redis·学习·spring·缓存
椿融雪20 小时前
分布式搜索和分析引擎Elasticsearch实战指南
大数据·分布式·elasticsearch