.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,我们应用程序的版本控制,比如说我们发布新版本的时候,新旧版本的事件的发布和订阅都会受到影响,这个时候我们没办法使我们的应用程序成为一个单纯的无状态的程序,在更新新版本的时候,那么就会带来新的负担,兼容性方面我们会需要做更多的工作

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

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

相关文章

[观察,找规律]算法题目训练

[蓝桥杯2019初赛]旋转-找规律蓝桥杯2017初赛-打印大X-找规律[蓝桥杯2018初赛]分数-找规律[蓝桥杯2019初赛]矩形切割-找规律[蓝桥杯2018初赛]方格计数-巧妙枚举&#xff0c;找规&#xff0c;数论[蓝桥杯2016初赛]煤球数目-找规律

mysql多实例复制,Mysql实例使用Rotate Master实现MySQL 多主复制的实现方法

搜索热词《MysqL实例使用Rotate Master实现MysqL 多主复制的实现方法》要点&#xff1a;本文介绍了MysqL实例使用Rotate Master实现MysqL 多主复制的实现方法&#xff0c;希望对您有用。如果有疑问&#xff0c;可以联系我们。当然,5.6的GUID功能的出现也带来了multi-master的无…

Dapper操作MySQL数据库获取JSON数据中文乱码

在项目中利用Dapper将JSON数据存储到MySQL数据库&#xff0c;结果发现JSON数据中的中文乱码&#xff0c;特此记录&#xff0c;希望对存储JSON的童鞋能有所帮助&#xff0c;文中若有错误之处&#xff0c;还望批评指正。为了引出最终问题出在什么地方&#xff0c;我们重头开始进行…

C++set容器去重法

给出一个10位数&#xff0c;它如果每个位的数都把0-9这10个数都只用了一次&#xff0c;就输出yes&#xff0c;否则输出no #include <iostream> #include <set> using namespace std; set<int>s; typedef long long LL;int main() {LL n;while (cin >>…

django mysql connector,MySQL Connector / python在Django中不起作用

我正在学习以MySQL为后端的Django。 我安装了Oracle的mysql连接器以与mysql连接。 但是&#xff0c;当我运行python manage.py时&#xff0c;出现此错误Traceback (most recent call last):File"C:\Python33\lib\site-packages\django\db\backends\mysql\base.py", l…

流传在程序员中的传说,你知道几个?

在号称从事高薪新 科技工作的程序员周遭流传着许多与他们单纯气质不符的传说在这些被神秘面纱笼罩的人群中即使是从事着同一工种都有着许许多多科学无法解释的差异老程序员们对此讳莫如深新程序员们却有时感到惶恐不安...这背后究竟是道德的扭曲还是人性的沦丧倒是都并不至于只…

C++关于getline()和getchar()的小点

getchar只能“吃”一个字符&#xff0c;而getline可以“吃”一行字符 代码如下: #include <iostream> #include <cstring> using namespace std;int main() {char c;cin>>c;string line;getline(cin,line);cout<<c<<endl;cout<<line<…

php 如何生成二级目录json,使用PHP根据已解码的JSON创建文件夹/文件结构

例如,我下面有一个build.json文件.包含我在JSON中创建的基本文件夹/文件结构.{"folders": [{"name": "folder-a","files": [{"name": "file-a.html"},{"name": "file-b.html"}],"folder…

谁说docker-compose不能水平扩展容器、服务多实例?

❝虽说我已经从docker-compose走上了docker swarm的邪门歪道&#xff0c;目前被迫走在k8s这条康庄大道&#xff0c; 但是我还是喜欢docker-compose简洁有效的部署方式。❞曾其何时docker-compose非常适合开发、测试、快速验证原型&#xff0c;这个小工具让单机部署容器变得简洁…

C++substr()用法

substr()用法: string 需要截取的字符串 a 截取字符串的开始位置&#xff08;注&#xff1a;当a等于0或1时&#xff0c;都是从第一位开始截取&#xff09; b 要截取的字符串的长度 注意:第3个参数是要截取字符串的长度

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

33 | 集成事件&#xff1a;使用RabbitMQ来实现EventBus这一节我们来讲解如何通过 CAP 组件和 RabbitMQ 来实现 EventBus要实现 EventBus&#xff0c;我们这里借助了 RabbitMQ&#xff0c;它的整个安装和使用的体验是非常人性化的&#xff0c;如果是在 Windows 下开发的话&#…

nginx php iconv,Nginx +PHP部署一

Nginx PHP部署一Alvin.zeng目录一、安装PHP1、Yum安装需要的包yum -y install gcc gcc-c autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurs…

递归算法训练

[蓝桥杯]字母组串-递归[蓝桥杯][基础练习VIP]FJ的字符串-递归

以Blog.Core的方式来打开Abp.vNext

&#xff08;发现Abp这个logo真像佐助写轮眼&#xff09;最近自己的框架已经基本的成型了&#xff0c;当然还有很多质疑的地方&#xff0c;比如这些人是这么说的&#xff0c;基本都是原文&#xff1a;你的教程太乱了&#xff0c;和框架代码都不一样&#xff08;&#xff1f;&am…

算法题目中常见的几种输入小点-gets,cin,scanf,getline,sstream

cin,scanf遇到空格都会停下来。gets可读入空格 例如: 在这里由于要读入空格&#xff0c;我们用gets来读入。 const int N 8; char g[N][N];while(gets(g[0])!NULL) {gets(g[1]);}C关于getline()和getchar()的小点C stringstream输入方式下面这两段代码要注意一下: const in…

php+换行+php+eol,PHP PHP_EOL 换行符

换行符unix系列用 \nwindows系列用 \r\nmac用 \rPHP中可以用PHP_EOL来替代&#xff0c;以提高代码的源代码级可移植性如&#xff1a;echoPHP_EOL;//windows平台相当于 echo "\r\n";//unix\linux平台相当于 echo "\n";//mac平台相当于 echo "…

如何做好一个开源项目(一)

做好一个开源项目其实是一件比较费时费力费心的工作&#xff0c;它的最大难点除了代码维护之外&#xff0c;还包括后期的维护和持续的跟进。我曾经做过不少开源项目&#xff0c;但是坚持下来的&#xff0c;目前有信心能够持续维护的也只有Magicodes.IE。这里请允许我来一波硬广…

量子力学问题matlab求解,一个关于量子力学中的matlab的问题

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼syms E U x U1 a a1 a2 k k1 k2 k3 b c d e f g h l S%其中&#xff0c;b c d e f g h l是为计算简明而引入的字符&#xff0c;S为透射系数D与反射系数R之和。Einput(请输入入射电子能量E);Uinput(请输入势垒函数U);a1input(请输入…

洛谷 P1506 拯救oibh总部-dfs染色法

题目背景 oibh总部突然被水淹没了&#xff01;现在需要你的救援…… 题目描述 oibh被突来的洪水淹没了>.<还好oibh总部有在某些重要的地方起一些围墙&#xff0c;用号表示&#xff0c;而一个封闭的号区域洪水是进不去的……现在给出oibh的围墙建设图&#xff0c;问oibh…

Abp商业版 - Identity Server模块

该模块提供了Identity Server的集成和管理功能.建立在IdentityServer4类库之上.管理系统中的客户端,身份资源和API资源(Clients, Identity resources, API resources)设置客户端(Clients)权限.轻松创建标准的身份资源(例如role, profile)创建自定义身份资源(identity resources…