当前位置: 首页 > news >正文

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


文章目录

  • 项目地址
  • 一、结构化日志
    • 1.1 使用Serilog
      • 1. 安装所需要的包
      • 2. 注册服务和配置
      • 3. 安装Seq服务
    • 1.2 添加分布式id中间件
      • 1. 添加中间件
      • 2. 注册服务
      • 3. 修改Application的LoggingBehavior
  • 二、Redis缓存
    • 2.1 添加缓存
      • 1. 创建接口ICaching接口
      • 2. 实现ICaching接口
      • 3. 注册Caching服务
      • 4. 添加Docker
    • 2.2 服务使用Caching
    • 2.3 查询使用Caching
      • 1. 添加ICachingQuery接口
      • 2. 给查询添加缓存
      • 3. 添加缓存的Pipeline Behaviors
      • 4. 注册管道行为
      • 5. 管道行为和中间件的区别
  • 三、HealthCheck
    • 3.1 安装healthCheck包
    • 3.2 配置HealthCheck
      • 1. 添加注册服务
      • 2. program里添加服务
  • 四、Api Versioning
    • 4.1 创建版本控制
      • 1. 安装需要的包
      • 2. 给controller添加版本 控制
    • 4.2 让Swagger支持api
  • 五、OutBox Pattern
      • 5.1 创建OutboxMessage类
      • 5.2 修改事件发布为Outbox发布
      • 5.3 创建OutBox表
      • 5.4 OutBox设置
      • 1. 创建配置类OutboxOptions
      • 2. 添加配置
      • 3. 注册配置和服务


项目地址

  • 教程作者:
  • 教程地址:
  • 代码仓库地址:
  • 所用到的框架和插件:
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 CoreMediatR
作用范围整个 HTTP 请求生命周期只作用于 MediatR 的请求(IRequest / INotification)
使用位置配置在 Program.csStartup.cs配置在 AddMediatR(...) 注册过程中
执行顺序多个中间件按注册顺序包裹整个请求多个行为按注册顺序包裹 MediatR 的请求处理器
核心接口RequestDelegateIPipelineBehavior<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. 注册配置和服务

相关文章:

  • 不定长滑动窗口---初阶篇
  • 科技快讯 | 字节跳动开源一款Deep Research项目;全球首个氮化镓量子光源芯片发布
  • 图论拓扑排序
  • Spring Boot动态配置修改全攻略
  • 神经符号推理系统:研究进展与应用前景
  • MCP 入门实战:用 C# 开启 AI 新篇章
  • 文本数据可视化
  • 【软件工程】软件缺陷 基于组合的优化方法
  • Python爬虫实战:研究ajax异步渲染加密
  • keil 解决 Error: CreateProcess failed, Command: ‘XXX\ARM\ARMCC\bin\fromelf.exe
  • 自动驾驶技术栈——DoIP通信协议
  • 如何让rabbitmq保存服务断开重连?保证高可用?
  • tryhackme——Lateral Movement and Pivoting
  • 学习threejs,使用Physijs物理引擎,加载各种几何体网格对象
  • 【Web前端开发】CSS基础
  • vue2关闭eslint
  • 通义千问席卷日本!开源界“卷王”阿里通义千问成为日本AI发展新基石
  • Kotlin 懒初始化值
  • Cabot:开源免费的 PagerDuty 替代品,让系统监控更简单高效
  • 力扣 旋转图像
  • 最高降九成!特朗普签署降药价行政令落地存疑,多家跨国药企股价收涨
  • 训练孩子的科学思维,上海虹口推出“六个一百”旗舰工程
  • 长沙通报一出租房疑存非法代孕:查封涉事场所,相关人员被控制
  • 今起公开发售,宁德时代将于5月20日在港股上市
  • 普京提议恢复直接谈判,泽连斯基:望俄明日停火,乌愿谈判
  • 首映丨纪录电影《滚烫年华》:献给所有奋斗者