.NET Core开发实战(第32课:集成事件:解决跨微服务的最终一致性)--学习笔记
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,我们应用程序的版本控制,比如说我们发布新版本的时候,新旧版本的事件的发布和订阅都会受到影响,这个时候我们没办法使我们的应用程序成为一个单纯的无状态的程序,在更新新版本的时候,那么就会带来新的负担,兼容性方面我们会需要做更多的工作
GitHub源码链接:
https://github.com/witskeeper/geektime



本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。
如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。
.NET Core开发实战(第32课:集成事件:解决跨微服务的最终一致性)--学习笔记的更多相关文章
- 2月送书福利:ASP.NET Core开发实战
大家都知道我有一个公众号“恰童鞋骚年”,在公众号2020年第一天发布的推文<2020年,请让我重新介绍我自己>中,我曾说到我会在2020年中每个月为所有关注“恰童鞋骚年”公众号的童鞋们送一 ...
- Taurus.MVC 微服务框架 入门开发教程:项目集成:6、微服务间的调用方式:Rpc.StartTaskAsync。
系统目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...
- 在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务
在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务 https://procodeguide.com/programming/polly-in-aspnet-core ...
- [ASP.NET Core开发实战]开篇词
前言 本系列课程文章主要是学习官方文档,再输出自己学习心得,希望对你有所帮助. 课程大纲 本系列课程主要分为三个部分:基础篇.实战篇和部署篇. 希望通过本系列课程,能让大家初步掌握使用ASP.NET ...
- 分享一个集成.NET Core+Swagger+Consul+Polly+Ocelot+IdentityServer4+Exceptionless+Apollo+SkyWalking的微服务开发框架
集成.NET Core+Swagger+Consul+Polly+Ocelot+IdentityServer4+Exceptionless+Apollo的微服务开发框架 Github源代码地址 htt ...
- TensorFlow实战第七课(dropout解决overfitting)
Dropout 解决 overfitting overfitting也被称为过度学习,过度拟合.他是机器学习中常见的问题. 图中的黑色曲线是正常模型,绿色曲线就是overfitting模型.尽管绿色曲 ...
- SpringCloud Alibaba实战(7:nacos注册中心管理微服务)
源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 在上一节我们已经完成了Nacos Server的本地部署,这一节我们学习如何将Nac ...
- .NET Core Community 第四个千星项目诞生:微服务框架 Surging
本文所有打赏将全数捐赠于 NCC(NCC 的资金目前由 倾竹大人 负责管理),请注明捐赠于 NCC.捐赠情况将由倾竹大人在此处公示. 提及 .NET 微服务,我们脑海中浮现的一系列印象中,总有 Sur ...
- .NET Core开发实战(第11课:文件配置提供程序)--学习笔记
11 | 文件配置提供程序:自由选择配置的格式 文件配置提供程序 Microsoft.Extensions.Configuration.Ini Microsoft.Extensions.Configu ...
- 2、SpringBoot接口Http协议开发实战8节课(1-6)
1.SpringBoot2.xHTTP请求配置讲解 简介:SpringBoot2.xHTTP请求注解讲解和简化注解配置技巧 1.@RestController and @RequestMapping是 ...
随机推荐
- 分享Go书籍-《Go Web编程》
大家好,我是沙漠尽头的狼. 最近几天在看一本Go的书籍,看了100来页,感觉不错,分享给大家. 书籍基本信息 书籍信息: 书名:Go Web编程 作 者:(新加坡)郑兆雄(Sau Sheong C ...
- 分享这位大神的WPF界面设计系列视频
本文结构: 前言 视频详情 搬运详情 总结 4.1 国内推荐WPF资源 4.2 B站是学习的天堂 4.3 去外面看看 4.4 个人给C/S同学建议 1. 前言 今天介绍油管上一个大佬发的WPF设计系列 ...
- Java项目配置Maven依赖时不知需要的最低jdk版本?(报错java: 错误: 无效的目标发行版:17)
1.问题 在配置SpringBoot项目依赖时,使用了最新的spring-boot-starter-parent 3.1.5,但是出现了java: 错误: 无效的目标发行版:17的报错 2.解决 经过 ...
- Vue2 - 配置跨域
在根目录下创建 vue.config.js 文件 . 即可 vue.config.js : // vue.config.js 配置说明 //官方vue.config.js 参考文档 https://c ...
- Java基础篇(05):函数式编程概念和应用
目录 一.函数式概念 二.函数与方法 三.JDK函数基础 1.Lambda表达式 2.函数式接口 四.Optional类 1.Null判断 2.Optional应用 五.Stream流 一.函数式概念 ...
- [转帖]一文看懂Linux内核页缓存(Page Cache)
https://kernel.0voice.com/forum.php?mod=viewthread&tid=629 玩转Linux内核 发布于 2022-8-9 22:19:08 阅读 ...
- [转帖]基于Fuse的用户态文件系统性能优化几点建议
https://zhuanlan.zhihu.com/p/68085075 目前很多文件系统基于Fuse( http://fuse.sourceforge.net/ )开发,在较为深入钻研Fuse实现 ...
- [转帖][译]ARM大小核架构白皮书
https://zhuanlan.zhihu.com/p/33411449 ARM big.LITTLE Processing with ARM Cortex-A15 & Cortex-A7 ...
- BPF的简单学习
BPF的简单学习 前言 本来规划过年期间学习一下bpf相关的内容 但是因为自己没有坚持学习,所以到最后一天才开始整理. 本来想深入学习一下相关内容,但是已经感觉已经无法完成. 最近大半年进行了很多性能 ...
- 【0基础学爬虫】爬虫基础之HTTP协议的基本原理介绍
大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶.逆向相关文章,为实现从易到难全方位覆盖,特设[0基础学爬 ...