33:集成事件:使用RabbitMQ来实现EventBus(下)-开发实战
.NET Core开发实战前文传送门:
- 第1课:课程介绍
- 第2课:内容综述
- 第3课:.NET Core的现状、未来以及环境搭建
- 第4课:Startup:掌握ASP.NET Core的启动过程
- 第5课:依赖注入:良好架构的起点(上)
- 第5课:依赖注入:良好架构的起点(中)
- 第5课:依赖注入:良好架构的起点(下)
- 第6课:作用域与对象释放行为(上)
- 第6课:作用域与对象释放行为(下)
- 第7课:用Autofac增强容器能力(上)
- 第7课:用Autofac增强容器能力(下)
- 第8课:配置框架:让服务无缝适应各种环境
- 第9课:命令行配置提供程序
- 第10课:环境变量配置提供程序
- 第11课:文件配置提供程序
- 第12课:配置变更监听
- 第13课:配置绑定:使用强类型对象承载配置数据
- 第14课:自定义配置数据源:低成本实现定制化配置方案
- 第15课:选项框架:服务组件集成配置的最佳实践
- 第16课:选项数据热更新:让服务感知配置的变化
- 第17课:为选项数据添加验证:避免错误配置的应用接收用户流量
- 第18课:日志框架:聊聊记日志的最佳姿势(上)
- 第18课:日志框架:聊聊记日志的最佳姿势(下)
- 第19课:日志作用域:解决不同请求之间的日志干扰
- 第20课:结构化日志组件Serilog:记录对查询分析友好的日志
- 第21课:中间件:掌控请求处理过程的关键(上)
- 第21课:中间件:掌控请求处理过程的关键(下)
- 第22课:异常处理中间件:区分真异常与逻辑异常(上)
- 第22课:异常处理中间件:区分真异常与逻辑异常(下)
- 第23课:静态文件中间件:前后端分离开发合并部署骚操作(上)
- 第23课:静态文件中间件:前后端分离开发合并部署骚操作(下)
- 第24课:文件提供程序:让你可以将文件放在任何地方
- 第25课:路由与终结点:如何规划好你的Web API(上)
- 第25课:路由与终结点:如何规划好你的Web API(下)
- 第26课:工程结构概览:定义应用分层及依赖关系
- 第27课:定义Entity:区分领域模型的内在逻辑和外在行为
- 第28课:工作单元模式(UnitOfWork):管理好你的事务
- 第29课:定义仓储:使用EF Core实现仓储层
- 第30课:领域事件:提升业务内聚,实现模块解耦
- 第31课:APIController:定义API的最佳实践
- 第32课:集成事件:解决跨微服务的最终一致性
- 第33课:集成事件:使用RabbitMQ来实现EventBus(上)
33 | 集成事件:使用RabbitMQ来实现EventBus(下)
为了演示我们的发布和订阅的话,我们在这里的代码做一些稍微的调整
namespace GeekTime.API.Application.DomainEventHandlers { public class OrderCreatedDomainEventHandler : IDomainEventHandler<OrderCreatedDomainEvent> { ICapPublisher _capPublisher; public OrderCreatedDomainEventHandler(ICapPublisher capPublisher) { _capPublisher = capPublisher; } public async Task Handle(OrderCreatedDomainEvent notification, CancellationToken cancellationToken) { await _capPublisher.PublishAsync("OrderCreated", new OrderCreatedIntegrationEvent(notification.Order.Id)); } } }
这里我们发布了一个 OrderCreated 的集成事件,然后订阅一个 OrderCreated
namespace GeekTime.API.Application.IntegrationEvents { public class SubscriberService : ISubscriberService, ICapSubscribe { IMediator _mediator; public SubscriberService(IMediator mediator) { _mediator = mediator; } [CapSubscribe("OrderPaymentSucceeded")] public void OrderPaymentSucceeded(OrderPaymentSucceededIntegrationEvent @event) { //Do SomeThing } [CapSubscribe("OrderCreated")] public void OrderCreated(OrderCreatedIntegrationEvent @event) { //Do SomeThing } } }
通过标注属性,我们就可以完成订阅
也就是说我们创建一个订单的时,我们会触发订单创建的领域事件,订单创建的领域事件又发送了一个订单创建的集成事件,然后我们在订阅服务里面订阅了订单创建的集成事件
在发布和订阅的地方分别打上一个断点,启动程序,可以看到整个流程
我们再梳理一下整个流程,首先我们创建了一个订单,这个订单触发了我们的 OrderCreated 的领域事件,OrderCreated 的领域事件的处理器像我们的 EventBus 发布了一个 OrderCreated 的集成事件,我们在订阅服务的地方订阅了这个事件,所以我们可以接收到并且做出相应的处理
我们观察一下数据库的表,一共有四张表,cap.publish 和 cap.received 这两张表分别对应发送事件表和接收事件表,order 和 user 这两张表是我们的领域模型表
整个 CAP 的框架,它的实现原理其实有两个关键点,一个是事件表,一个就是事务控制,也就是说将事件的存储嵌入到我们的业务逻辑的事务里面去,这样子我们就可以保证我们的业务与事件是要么都能存储成功,要么都失败
整个 CAP 框架它的应用性是非常强的,非常建议在处理集成事件的时候使用这个框架

原文出处:微信公众号【郑子铭 DotNet NB】
原文链接:https://mp.weixin.qq.com/s/Mea2FVePXFItZTybwRy69A
本文观点不代表Dotnet9立场,转载请联系原作者。