32 | 集成事件:解决跨微服务的最终一致性

首先看一下集成事件的工作原理

它的目的时为了实现系统的集成,它主要是用于系统里面多个微服务之间相互传递事件

集成事件的实现方式有两种,一种是图上显示的发布订阅的方式,通过 EventBus,还有一种方式是通过观察者模式,由观察者将事件发送给关注事件的人

接着看一下代码上的定义

在 Application 目录下面定义了一个集成事件的目录 IntegrationEvents

OrderCreatedIntegrationEvent

namespace GeekTime.API.Application.IntegrationEvents
{public class OrderCreatedIntegrationEvent{public OrderCreatedIntegrationEvent(long orderId) => OrderId = orderId;public long OrderId { get; }}
}

得益于基础设施的发展,现在实际上可以借助一些开源框架,很轻松的实现集成事件的发布和订阅的能力

在发布端可以看一下这里的代码

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));}}
}

这里我们定义了一个领域事件,它的作用就是将我们的集成事件发送出去,具体是要发送到 RabbitMQ 还是 kafka 这些消息队列中间件里面是可配置的,对于业务逻辑来讲的话,它是透明的

这里有一个 ICapPublisher 接口,这个接口实际上是由中国的开源社区开发的一个框架,借助这个框架,我们可以轻松的实现消息的发布和订阅

那我们如何来订阅其他微服务发出的消息呢?

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}}
}

我们可以通过订阅服务,它同样也是借助了 Cap 的组件,我们实现了 ICapPublisher 这个接口,就可以将服务标记成我们的订阅服务

另外我们的订阅方法,订阅的处理函数上面,标记 CapSubscribe 这个属性,将我们要订阅的事件名放在这里,我们就可以订阅到这个事件了

namespace GeekTime.API.Application.IntegrationEvents
{public class OrderPaymentSucceededIntegrationEvent{public OrderPaymentSucceededIntegrationEvent(long orderId) => OrderId = orderId;public long OrderId { get; }}
}

我们可以看到集成事件定义的话,它是没有接口和基类的约束的,因为在异构的系统里面,对于集成事件来讲的定义是相对比较灵活的,我们的建议是用这种简单的类型来承载它即可

总结一下

集成事件实际上也是由领域的业务逻辑驱动的,它本质上也是领域事件,只是说它是跨服务的领域事件

另外一个集成事件大部分场景是领域事件驱动的,也有可能是一些比如说定时任务触发的,由于集成事件是跨微服务来传递信息的,所以我们没办法通过事务来处理,那就需要借助 Cap 这样的框架来实现最终的一致性

当然我们建议仅在必要的情况下定义和使用集成事件,因为一旦引入集成事件,比如 EventBus,我们应用程序的版本控制,比如说我们发布新版本的时候,新旧版本的事件的发布和订阅都会受到影响,这个时候我们没办法使我们的应用程序成为一个单纯的无状态的程序,在更新新版本的时候,那么就会带来新的负担,兼容性方面我们会需要做更多的工作

.NET Core开发实战(第32课:集成事件:解决跨微服务的最终一致性)--学习笔记...相关推荐

  1. .NET Core开发实战(第33课:集成事件:使用RabbitMQ来实现EventBus)--学习笔记(上)...

    33 | 集成事件:使用RabbitMQ来实现EventBus 这一节我们来讲解如何通过 CAP 组件和 RabbitMQ 来实现 EventBus 要实现 EventBus,我们这里借助了 Rabb ...

  2. .NET Core开发实战(第33课:集成事件:使用RabbitMQ来实现EventBus)--学习笔记(下)...

    33 | 集成事件:使用RabbitMQ来实现EventBus 为了演示我们的发布和订阅的话,我们在这里的代码做一些稍微的调整 namespace GeekTime.API.Application.D ...

  3. spring5企业级开发实战 pdf_终于总结出Spring全家桶+微服务设计模式+Netty+MySQL调优PDF...

    Spring源码深度解析(2020年1月第二版) Spring是一个源码开放的轻量级Java开发框架,旨在解决业务逻辑层和其他各层的松耦合问题! 自从2003年推出以来,Spring 逐渐发展成为事实 ...

  4. 《物联网开发实战》09 边缘中心:物联网网关有多重要?(学习笔记)

    仅作为本人学习<物联网开发实战>的学习笔记,原课程链接:极客时间<物联网开发实战>--郭朝斌 不是所有的设备都使用 Wi-Fi 这类可以直接接入互联网从而与云平台通信的通信技术 ...

  5. .NET Core开发实战(第5课:依赖注入:良好架构的起点)--学习笔记(上)

    05 | 依赖注入:良好架构的起点 为什么要使用依赖注入框架 借助依赖注入框架,我们可以轻松管理类之间的依赖,帮助我们在构建应用时遵循设计原则,确保代码的可维护性和可扩展性 ASP.NET Core ...

  6. .NET Core开发实战(定义API的最佳实践)Source Generators版

    前言 极客时间上的<.NET Core开发实战>是一门非常好的课程,作者肖伟宇在第31课(https://time.geekbang.org/course/detail/100044601 ...

  7. 第 6 讲 SpringBoot集成Cros解决跨域问题

    第六讲 SpringBoot集成Cros解决跨域问题 文章目录 第六讲 SpringBoot集成Cros解决跨域问题 1.开发RestFul类型接口 1.1 配置pom.xml,引入依赖 1.2 ap ...

  8. 在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务

    在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务 https://procodeguide.com/programming/polly-in-aspnet-core ...

  9. .NET Core开发实战(第26课:工程结构概览:定义应用分层及依赖关系)--学习笔记...

    26 | 工程结构概览:定义应用分层及依赖关系 从这一节开始进入微服务实战部分 这一节主要讲解工程的结构和应用的分层 在应用的分层这里定义了四个层次: 1.领域模型层 2.基础设施层 3.应用层 4. ...

最新文章

  1. main方法为什么是静态的
  2. 即将 50 岁的雷军,重新回到手机战场
  3. cisco交换机Telnet配置
  4. C++ 十字链表图转java版
  5. Android7.0适配方案
  6. boost::detail::lexical_cast_stream_traits用法的测试程序
  7. Pycharm下将py文件打包成exe文件
  8. 周志华任大会首个华人程序主席!
  9. python finally语句里面出现异常_Python异常处理中的else和finally
  10. 淘宝美工实用素材|轻松交作业过稿
  11. 社区发现(二)--GN
  12. pytorch数据集
  13. 02 . 在 Linux 上安装Oracle11g 数据库
  14. ssh连接openwrt_如何将SSH无密码连接到OpenWrt路由器?
  15. 测试人员用的专业截图软件,8款免费好用的截图软件工具
  16. java第三课:原生数据类型是用陷阱(pitfall of Primitive Data Type)
  17. 长沙哪个服务器网速最快,5G网络湖南长沙首秀?网速是4G的60倍,快的让人无法想象...
  18. Java中关于数组的初始化方式
  19. ubuntu 18.04 安装caffe
  20. 微信获取信息用户登录报错redirect_uri域名与后台配置不一致,错误码10003

热门文章

  1. poj2632 累死了
  2. [ACM_图论] The Perfect Stall 完美的牛栏(匈牙利算法、最大二分匹配)
  3. JSFL:导入Png图片导出swf
  4. JavaScript自动设置IFrame高度(兼容各主流浏览器)
  5. 用回溯法找出n个自然数中取r个数的全排列
  6. 去除HTML标签--SQL写法
  7. 如何在Microsoft Word中插入签名
  8. Spring下载地址
  9. 为何Windows版QuickTime突然寿终正寝?
  10. [杭电ACM]1012u Calculate e