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

33 | 集成事件:使用RabbitMQ来实现EventBus

这一节我们来讲解如何通过 CAP 组件和 RabbitMQ 来实现 EventBus

要实现 EventBus,我们这里借助了 RabbitMQ,它的整个安装和使用的体验是非常人性化的,如果是在 Windows 下开发的话,它可以有 Windows 的 installer,也可以在其它的操作系统下安装和使用,当然它也支持 Docker 的模式,我们可以在以下的地址获取到安装包和安装方法的说明

https://www.rabbitmq.com/download.html

另一个就是在 .NET Core 社区比较知名的 CAP 框架,这个框架是由我们国人开发的,它实现了开箱即用的 EventBus 的实现,我们可以通过简单的配置,就能把 RabbitMQ 集成进来,并且实现我们的集成事件的处理

https://github.com/dotnetcore/CAP

我们来看一下 CAP 框架的实现架构

它实际上实现了一个叫 OutBox 的设计模式,就是在我们的每个微服务,比如说微服务 A 的数据库 A,在这个数据库内部它建立了两张表,一张叫 publish 事件表和一张叫 receiver 事件表,这两张事件表用来记录微服务 A 发出的和微服务 A 收到的事件

当我们要发出事件时,我们会把事件的存储逻辑与我们的业务逻辑的事务合并,在同一个事务里提交,也就意味着当我们的业务逻辑提交成功时,我们的事件表里面的事件是一定存在的,它是与我们的业务逻辑的事务是强绑定的

如果说我们的业务逻辑失败了,事务回滚了,这条事件是不会出现在我们的事件表里的,这样子就可以做到说我们要发送的事件一定是与业务逻辑是一致的

接下来由我们组件来负责将事件表里的事件全部都发送到 EventBus,比如说 RabbitMQ 消息队列里面去,由接收方订阅

对于订阅的事件的话,设计的模式也是同理,当我们的应用程序在消息队列获取到信息的时候,它就会将这些消息持久化到我们的数据库的 Receive 事件表里,这样我们就可以在本地进行事件的处理,失败重试等操作,这些都是由 CAP 框架完成的,我们仅需要去做简单的配置,关注发布和订阅的业务逻辑即可

我们看一下代码,刚才有提到 CAP 的架构,关键的一点是需要事件的存储与我们的业务逻辑在同一个事务里,所以说我们在处理事务的逻辑部分的话,需要嵌入 CAP 的一部分代码,我们看一下 EFContext 的定义

public EFContext(DbContextOptions options, IMediator mediator, ICapPublisher capBus) : base(options)
{_mediator = mediator;_capBus = capBus;
}

之前有关注到有一个叫 ICapPublisher 这个入参,关键的是这一行代码我们需要关注一下

_currentTransaction = Database.BeginTransaction(_capBus, autoCommit: false);

这一行代码的作用是创建事务,我们可以看到创建事务的过程中,我们把 ICapPublisher 也传入给了这个方法的构造函数,实际上这个方法是由 CAP 的组件提供的,它的核心作用就是将我们要发送的事件与我们的业务的存储都放在同一个事务内部,这样子我们就可以使得事务提交时或者回滚时,我们的事件与业务逻辑的存取都是一致的

然后我们再来看一下配置的部分,写在 ServiceCollectionExtensions 下面

public static IServiceCollection AddEventBus(this IServiceCollection services, IConfiguration configuration)
{services.AddTransient<ISubscriberService, SubscriberService>();services.AddCap(options =>{options.UseEntityFramework<DomainContext>();options.UseRabbitMQ(options =>{configuration.GetSection("RabbitMQ").Bind(options);});//options.UseDashboard();});return services;
}

我们这里定义了一个 AddEventBus,可以看到将我们之前演示的代码订阅服务注入进来,然后 Services 最重点的代码是 AddCap,我们需要告诉 CAP 框架我们是针对 DomainContext 来实现我们的 EventBus,EventBus 与 DomainContext 共享我们的数据库连接,下面一行代码是指我们要用 RabbitMQ 来作为我们 EventBus 的消息队列的存储,这里可以看到使用了一个 Bind 的方法将我们的配置绑定到 RabbitMQ 的 options 上面去

我们可以看一下我们的配置

  "RabbitMQ": {"HostName": "localhost","UserName": "admin","Password": "123456","VirtualHost": "geektime","ExchangeName": "geek_queue"}

这里可以看到我们定义了一个 RabbitMQ 的配置,然后这里面会有我们的 host,因为是本地安装的,所以访问地址就是 localhost,VirtualHost 是 RabbitMQ 一个比较特殊的设置,它的作用是将 RabbitMQ 的空间区分为不同的空间,你可以认为这是一个租户,相同的 VirtualHost,大家都可以认为是一个 RabbitMQ 的集群,最下面的 ExchangeName 就是队列需要订阅的 Exchange 的名称,消息的发布和订阅都是通过这个 Exchange 来的

然后我们在 Startup 这里添加一行

services.AddEventBus(Configuration);

这样我们就配置完成了

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

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

相关文章

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…

以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…

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

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

Abp商业版 - Identity Server模块

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

洛谷 P1162 填涂颜色-dfs染色法

输入: 6 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 1 1 1 1 1 1 1输出: 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 2 2 1 1 1 2 2 2 1 1 2 2 2 2 1 1 1 1 1 1 1代码如下: #include <iostream> using namespace std; const int N 40; int mp[N][N], mps[N][N…

15个基本的C#面试问题

原文来自互联网&#xff0c;由长沙DotNET技术社区【笑语】编译。原文来自&#xff1a;https://www.toptal.com/c-sharp/top-10-mistakes-that-c-sharp-programmers-make1、给定一个int数组&#xff0c;编写方法以统计所有偶数的值。有很多方法可以做到这一点&#xff0c;但是最…

洛谷 P1122 最大子树和-求树的最大子树权值和

输入: 7 -1 -1 -1 1 1 1 0 1 4 2 5 3 6 4 7 5 7 6 7输出: 3代码如下: #include <iostream> #include <vector> using namespace std; const int N 100010; typedef long long LL; LL ans; vector<LL>t[N]; LL w[N];void dfs(int root, int fa) {for (int…

玩转控件:封装Dev的LabelControl和TextEdit

缘由俗话说的好&#xff1a;"工欲善其事必先利其器"&#xff0c;作为软件攻城狮也是同样道理&#xff0c;攻城狮开发的软件目的是简化客户的操作&#xff0c;让客户动动手指就可以完成很多事情&#xff0c;减少人力成本。这也是系统/软件存在的目的。那对于攻城狮来说…

洛谷 P1958 上学路线-dfs

输入: 5 4 3 2 2 2 3 4 2输出: 5注意点:这题目输入的时候先输入列&#xff0c;再输入行&#xff0c;这点要注意&#xff0c;然后这个图跟我们二维数组是反过来的&#xff0c;所以题目说得向北走要变成向南走&#xff0c;注意一下细节就好了。 代码如下: #include <io…

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

33 | 集成事件&#xff1a;使用RabbitMQ来实现EventBus为了演示我们的发布和订阅的话&#xff0c;我们在这里的代码做一些稍微的调整namespace GeekTime.API.Application.DomainEventHandlers {public class OrderCreatedDomainEventHandler : IDomainEventHandler<OrderCre…

文本框赋值guide matlab,科学网-Matlab: 学习GUI (使用GUIDE时需注意的几个问题)-刘磊的博文...

在博文《Matlab&#xff1a;学习GUI(一个简单的例子)》(介绍的方法是完全用代码来建立一个GUI&#xff0c;实际上Matlab本身有一个设计GUI的交互系统——GUIDE&#xff0c;用户可以使用该系统更方便的建立自己的GUI.本文将介绍使用GUIDE时常常遇到的几个问题。本文将通过一个简…

洛谷 P1294 高手去散步-邻接矩阵+dfs-求无向图的一条最长路径

输入: 4 6 1 2 10 2 3 20 3 4 30 4 1 40 1 3 50 2 4 60输出: 150邻接矩阵&#xff1a; 代码如下: #include <iostream> using namespace std;int ans -1; const int N 25; int mp[N][N]; bool vis[N]; int n, m; void dfs(int u, int sum) {ans max(ans, sum);for …

论ORM框架—EntityFrameworkCore

欢迎大家阅读《朝夕Net社区技术专刊》我们致力于.NetCore的推广和落地&#xff0c;为更好的帮助大家学习&#xff0c;方便分享干货&#xff0c;特创此刊&#xff01;很高兴你能成为忠实读者&#xff0c;文末福利不要错过哦&#xff01;01PARTORM框架ORM&#xff08;Object Rela…

苏老师首播3小时!超500人观看!录屏!源码!PPT……你要的都在这里!

点击视频 ☝ 回顾直播现场2020年3月25日晚18&#xff1a;30&#xff0c;“盛派周三分享”首次直播交流会&#xff0c;由盛派技术团队带头人Jeffrey&#xff0c;苏震威老师主持、分享&#xff0c;主题是《SCF 框架介绍快速创建项目演示》。此次直播历时3个多小时&#xff0c;500…

[蓝桥杯][算法提高VIP]数的划分-dp

题目描述 一个正整数可以划分为多个正整数的和&#xff0c;比如n3时&#xff1a; 3&#xff1b;1&#xff0b;2&#xff1b;1&#xff0b;1&#xff0b;1&#xff1b; 共有三种划分方法。 给出一个正整数&#xff0c;问有多少种划分方法。 输入 一个正整数n 数据规模和约定 …

十问十答 GPL 许可证

GPL 是 GNUs General Public License 的缩写&#xff0c;翻译成中文叫 GNU 的通用公共许可证&#xff0c;是最受欢迎的开源许可证之一。它由理查德斯托曼&#xff08;Richard Stallman&#xff09;创建&#xff0c;目的是保护 GNU 软件免于被专有&#xff0c;是基于他「版权向左…

oracle consistent gets,oracle构建一致性读

对于实际的业务系统&#xff0c;通常有一些热点的表&#xff0c;insert和delete的量非常大&#xff0c;这个时候就会发现一些查询语句的逻辑读比较偏高&#xff0c;这时可能就是oracle在构建一致性块的进行的consistentread。下面做一个测试看下&#xff1a;第一步准备数据&…

解析“60k”大佬的19道C#面试题(上)

解析“60k”大佬的19道C#面试题&#xff08;上&#xff09;先略看题目&#xff1a;请简述 async函数的编译方式请简述 Task状态机的实现和工作机制请简述 await的作用和原理&#xff0c;并说明和 GetResult()有什么区别Task和 Thread有区别吗&#xff1f;如果有请简述区别简述 …

通过极简模拟框架让你了解ASP.NET Core MVC框架的设计与实现[上篇]

《200行代码&#xff0c;7个对象——让你了解ASP.NET Core框架的本质》让很多读者对ASP.NET Core管道有了真实的了解。在过去很长一段时间中&#xff0c;有很多人私信给我&#xff1a;能否按照相同的方式分析一下MVC框架的设计与实现原理&#xff0c;希望这篇文章能够满足你们的…