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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/905693.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue.js 全局导航守卫:深度解析与应用

在 Vue.js 开发中&#xff0c;导航守卫是一项极为重要的功能&#xff0c;它为开发者提供了对路由导航过程进行控制的能力。其中&#xff0c;全局导航守卫更是在整个应用的路由切换过程中发挥着关键作用。本文将深入探讨全局导航守卫的分类、作用以及参数等方面内容。 一、全局…

使用FastAPI和React以及MongoDB构建全栈Web应用05 FastAPI快速入门

一、FastAPI概述 1.1 什么是FastAPI FastAPI is a modern, high-performance Python web framework designed for building APIs. It’s rapidly gaining popularity due to its ease of use, speed, and powerful features. Built on top of Starlette, FastAPI leverages a…

如何查看打开的 git bash 窗口是否是管理员权限打开

在 git bash 中输入&#xff1a; net session >nul 2>&1 && (echo Ok) || (echo Failed) 显示 OK 》是管理员权限&#xff1b; 显示 Failed 》不是管理员权限。 如何删除此步生成的垃圾文件&#xff1a; 新建一个 .txt 文件&#xff0c;输入以下代码…

得物0509面试手撕题目解答

题目 使用两个栈&#xff08;一个无序栈和一个空栈&#xff09;将无序栈中的元素转移到空栈&#xff0c;使其有序&#xff0c;不允许使用其他数据结构。 示例&#xff1a;输入&#xff1a;[3, 1, 6, 4, 2, 5]&#xff0c;输出&#xff1a;[6, 5, 4, 3, 2, 1] 思路与代码 如…

基于 Nexus 在 Dockerfile 配置 yum, conda, pip 仓库的方法和参考

在 Nexus 配置代理仓库的方法&#xff0c;可参考 pypi 的配置博客&#xff1a;https://hellogitlab.com/CI/docker/create_your_nexus_2 更多代理格式&#xff0c;参考官方文档&#xff0c;如 pypi&#xff1a;https://help.sonatype.com/en/pypi-repositories.html 配置 yum…

[6-8] 编码器接口测速 江协科技学习笔记(7个知识点)

1 2 在STM32微控制器的定时器模块中&#xff0c;CNT通常指的是定时器的计数器值。以下是CNT是什么以及它的用途&#xff1a; 是什么&#xff1a; • CNT&#xff1a;代表定时器的当前计数值。在STM32中&#xff0c;定时器从0开始计数&#xff0c;直到达到预设的自动重装载值&am…

RabbitMQ ③-Spring使用RabbitMQ

Spring使用RabbitMQ 创建 Spring 项目后&#xff0c;引入依赖&#xff1a; <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp --> <dependency><groupId>org.springframework.boot</groupId><artifac…

海外IP被误封解决方案

这里使用Google Cloud和Cloudflare来实现&#xff0c;解决海外服务器被误封IP&#xff0c;访问不到的问题。 这段脚本的核心目的&#xff0c;是自动监测你在 Cloudflare 上管理的 VPS 域名是否可达&#xff0c;一旦发现域名无法 Ping 通&#xff0c;就会帮你更换IP&#xff1a…

一个基于 Spring Boot 的实现,用于代理百度 AI 的 OCR 接口

一个基于 Spring Boot 的实现&#xff0c;用于代理百度 AI 的 OCR 接口 BaiduAIController.javaBaiduAIConfig.java在 application.yml 或 application.properties 中添加配置&#xff1a;application.yml同时&#xff0c;需要在Spring Boot应用中配置RestTemplate&#xff1a;…

GPT-4o 遇强敌?英伟达 Eagle 2.5 视觉 AI 王者登场

前言&#xff1a; 在人工智能领域&#xff0c;视觉语言模型的竞争愈发激烈。GPT-4o 一直是该领域的佼佼者&#xff0c;但英伟达的 Eagle 2.5 横空出世&#xff0c;凭借其 80 亿参数的精简架构&#xff0c;在长上下文多模态任务中表现出色&#xff0c;尤其是在视频和高分辨率图像…

将语言融入医学视觉识别与推理:一项综述|文献速递-深度学习医疗AI最新文献

Title 题目 Integrating language into medical visual recognition and reasoning: A survey 将语言融入医学视觉识别与推理&#xff1a;一项综述 01 文献速递介绍 检测以及语义分割&#xff09;是无数定量疾病评估和治疗规划的基石&#xff08;利特延斯等人&#xff0c…

Ubuntu24.04版本解决RK3568编译器 libmpfr.so.4: cannot open shared object

问题描述 在Ubuntu24.04版本上编译RK3568应用程序关于libmpfr.so.4: cannot open shared object问题&#xff0c;如下所示&#xff1a; /tools/ToolsChain/rockchip/rockchip_rk3568/host/bin/../libexec/gcc/aarch64-buildroot-linux-gnu/9.3.0/cc1plus: error while loadin…

产线视觉检测设备技术方案:基于EFISH-SCB-RK3588/SAIL-RK3588的国产化替代赛扬N100/N150全场景技术解析

一、核心硬件选型与替代优势‌ ‌1. 算力与AI加速能力‌ ‌异构八核架构‌&#xff1a;采用4Cortex-A76&#xff08;2.4GHz&#xff09;4Cortex-A55&#xff08;1.8GHz&#xff09;设计&#xff0c;支持视觉算法并行处理&#xff08;如模板匹配、缺陷分类&#xff09; 相机采…

python如何合并excel单元格

在Python中合并Excel单元格&#xff0c;常用openpyxl库实现。以下是详细步骤和示例代码&#xff1a; 方法一&#xff1a;使用 openpyxl 库 步骤说明&#xff1a; 安装库&#xff1a; pip install openpyxl导入库并加载文件&#xff1a; from openpyxl import load_workbook# …

高考备考1-集合

高考数学知识点总结—快手视频讲解 高考数学集合—快手视频讲解

Rust 数据结构:Vector

Rust 数据结构&#xff1a;Vector Rust 数据结构&#xff1a;Vector创建数组更新数组插入元素删除元素 获取数组中的元素迭代数组中的值使用枚举存储多个类型删除一个数组会删除它的元素 Rust 数据结构&#xff1a;Vector vector 来自标准库&#xff0c;在内存中连续存储相同类…

深度学习入门:深度学习(完结)

目录 1、加深网络1.1 向更深的网络出发1.2 进一步提高识别精度1.3 加深层的动机 2、深度学习的小历史2.1 ImageNet2.2 VGG2.3 GoogleNet2.4 ResNet 3、深度学习的高速化3.1 需要努力解决的问题3.2 基于GPU的高速化3.3 分布式学习3.4 运算精度的位数缩减 4、深度学习的应用案例4…

如何利用 Python 爬虫按关键字搜索京东商品:实战指南

在电商领域&#xff0c;京东作为国内知名的电商平台&#xff0c;拥有海量的商品数据。通过 Python 爬虫技术&#xff0c;我们可以高效地按关键字搜索京东商品&#xff0c;并获取其详细信息。这些信息对于市场分析、选品上架、库存管理和价格策略制定等方面具有重要价值。本文将…

‌JMeter聚合报告中的任务数和并发数区别

‌JMeter聚合报告中的任务数和并发数有本质的区别。‌ 任务数&#xff08;样本数&#xff09; 任务数或样本数是指在性能测试中发出的请求数量。例如&#xff0c;如果模拟20个用户&#xff0c;每个用户发送100次请求&#xff0c;那么总的任务数或样本数就是2000次请求‌ 并发…

Java 框架配置自动化:告别冗长的 XML 与 YAML 文件

在 Java 开发领域&#xff0c;框架的使用极大地提升了开发效率和系统的稳定性。然而&#xff0c;传统框架配置中冗长的 XML 与 YAML 文件&#xff0c;却成为开发者的一大困扰。这些配置文件不仅书写繁琐&#xff0c;容易出现语法错误&#xff0c;而且在项目规模扩大时&#xff…