重新整理 .net core 实践篇—————微服务的桥梁EventBus[三十一]
前言
简单介绍一下EventBus.
正文
EventBus 也就是集成事件,用于服务与服务之间的通信。
比如说我们的订单处理事件,当订单处理完毕后,我们如果通过api马上去调用后续接口。
比如说订单完成给用户通知的话,如果是大量订单,即使我们使用异步async await 这种模式,在这个订单服务中将会大量占用资源,因为async await 本身是线程池。
因为里面的资源是有限的,如果创建订单还有完成订单占用大量资源的话,发送邮件还加入到竞争中,那么可以想象,机器掉入资源用尽就更大了。如果是订单完成之后要调用多个服务,那么可想而知,压力多大。
那么EventBus 就是通过发布订阅这种模式来缓存起来,EventBus 发布一个事件,然后其他微服务可以进行订阅,这样就缓解了机器的负担。
.net core 实现EventBus 的框架如下:https://github.com/dotnetcore/CAP
可以去看下上面这个地址,这里就不详细介绍了,因为没有什么比文档更加详细了。
在.net core 中加入EventBus:
// 注册 EventBus
services.AddEventBus(Configuration);
AddEventBus 如下:
/// <summary>
/// 注册EventBus(集成事件处理服务)
/// </summary>
/// <param name="services"></param>
/// <param name="configuration"></param>
/// <returns></returns>
public static IServiceCollection AddEventBus(this IServiceCollection services, IConfiguration configuration)
{
// 注入集成事件订阅服务
services.AddTransient<ISubscriberService, SubscriberService>();
// 注入CAP服务
services.AddCap(options =>
{
// 指定CAP组件所使用的数据库上下文,当前设置表示EventBus与领域驱动共享数据库链接
options.UseEntityFramework<DomainContext>();
// package: DotNetCore.CAP.RabbitMQ
// 指定RabbitMQ作为我们EventBus的消息队列的存储,并注入配置
options.UseRabbitMQ(options =>
{
configuration.GetSection("RabbitMQ").Bind(options);
});
// options.UseDashboard();
});
return services;
}
可以看到上面使用RabbitMQ作为Eventbus的消息队列处理。当然除了RabbitMq,这个框架还支持其他的,如Kafka, AzureService, AmazonSQS等,看公司或者项目需要什么就行。
因为使用了RabbitMq,那么上面的写了加载RabbitMq:configuration.GetSection("RabbitMQ").Bind(options),配置RabbitMQ:
"RabbitMQ": {
"HostName": "127.0.0.1",
"UserName": "mq",
"Password": "123456",
"VirtualHost": "blog",
"ExchangeName": "blog_queue"
}
那么看一下EventBus发布:
/// <summary>
/// 创建Order领域事件处理
/// </summary>
public class OrderCreatedDomainEventHandler : IDomainEventHandler<OrderCreatedDomainEvent>
{
ICapPublisher _capPublisher;
public OrderCreatedDomainEventHandler(ICapPublisher capPublisher)
{
_capPublisher = capPublisher;
}
/// <summary>
/// 领域事件处理
/// </summary>
/// <param name="notification"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public async Task Handle(OrderCreatedDomainEvent notification, CancellationToken cancellationToken)
{
// 当创建新订单时,向 EventBus 发布一个事件
await _capPublisher.PublishAsync("OrderCreated", new OrderCreatedIntegrationEvent(notification.Order.Id));
}
}
前面订单创建完毕的时候,经过调用相关的领域事件,然后向EventBus 发送了一个事件。那么先看下这个事件。
/// <summary>
/// 集成事件:订单创建完成
/// </summary>
public class OrderCreatedIntegrationEvent
{
public long OrderId { get; }
public OrderCreatedIntegrationEvent(long orderId)
{
OrderId = orderId;
}
}
这样就创建了一个集成事件,并且发布出去了。
然后创建订阅服务:
/// <summary>
/// 集成事件订阅服务
/// </summary>
public class SubscriberService : ISubscriberService, ICapSubscribe
{
IMediator _mediator;
public SubscriberService(IMediator mediator)
{
_mediator = mediator;
}
/// <summary>
/// 订阅订单创建成功集成事件
/// </summary>
/// <param name="event"></param>
[CapSubscribe("OrderCreated")]
public void OrderCreatedSucceeded(OrderCreatedIntegrationEvent @event)
{
// do something...
}
/// <summary>
/// 订阅订单支付成功集成事件
/// </summary>
/// <param name="event"></param>
[CapSubscribe("OrderPaymentSucceeded")]
public void OrderPaymentSucceeded(OrderPaymentSucceededIntegrationEvent @event)
{
// do something...
}
}
这样即可,框架会帮我们处理。
总结
集成事件是跨服务的事件,在领域模式中,集成事件也是跨服务的领域事件
在领域模型中,集成事件一般由领域事件驱动触发
集成事件可以实现一致性,补充事务不能跨服务
集成事件会有一些额外的负担,使用的时候思考是否有必要
结
因为这个文档比较清晰,直接看文档更加通常,就不演示具体运行。
再次放一下文档:https://github.com/dotnetcore/CAP
下一节HttpClientFactory,以上只是个人整理一下,如有错误,望请指出。
重新整理 .net core 实践篇—————微服务的桥梁EventBus[三十一]的更多相关文章
- 重新整理 .net core 实践篇—————配置系统之简单配置中心[十一]
前言 市面上已经有很多配置中心集成工具了,故此不会去实践某个框架. 下面链接是apollo 官网的教程,实在太详细了,本文介绍一下扩展数据源,和简单翻翻阅一下apollo 关键部分. apollo 服 ...
- .Net Core 商城微服务项目系列(三):Ocelot网关接入Grafana监控
使用网关之后我们面临的一个问题就是监控,我们需要知道网关的实时状态,比如当前的请求吞吐量.请求耗费的时间.请求峰值甚至需要知道具体哪个服务的哪个方法花费了多少时间.网关作为请求的中转点是监控品牌的要塞 ...
- 重新整理 .net core 实践篇————配置应用[一]
前言 本来想整理到<<重新整理.net core 计1400篇>>里面去,但是后来一想,整理 .net core 实践篇 是偏于实践,故而分开. 因为是重新整理,那么就从配置开 ...
- .Net Core with 微服务 - Consul 注册中心
上一次我们介绍了 Ocelot 网关的基本用法.这次我们开始介绍服务注册发现组件 Consul 的简单使用方法. 服务注册发现 首先先让我们回顾下服务注册发现的概念. 在实施微服务之后,我们的调用都变 ...
- 手把手教你使用spring cloud+dotnet core搭建微服务架构:服务治理(-)
背景 公司去年开始使用dotnet core开发项目.公司的总体架构采用的是微服务,那时候由于对微服务的理解并不是太深,加上各种组件的不成熟,只是把项目的各个功能通过业务层面拆分,然后通过nginx代 ...
- spring cloud+dotnet core搭建微服务架构:服务发现(二)
前言 上篇文章实际上只讲了服务治理中的服务注册,服务与服务之间如何调用呢?传统的方式,服务A调用服务B,那么服务A访问的是服务B的负载均衡地址,通过负载均衡来指向到服务B的真实地址,上篇文章已经说了这 ...
- spring cloud+dotnet core搭建微服务架构:Api网关(三)
前言 国庆假期,一直没有时间更新. 根据群里面的同学的提问,强烈推荐大家先熟悉下spring cloud.文章下面有纯洁大神的spring cloud系列. 上一章最后说了,因为服务是不对外暴露的,所 ...
- spring cloud+dotnet core搭建微服务架构:配置中心(四)
前言 我们项目中有很多需要配置的地方,最常见的就是各种服务URL地址,这些地址针对不同的运行环境还不一样,不管和打包还是部署都麻烦,需要非常的小心.一般配置都是存储到配置文件里面,不管多小的配置变动, ...
- spring cloud+dotnet core搭建微服务架构:配置中心续(五)
前言 上一章最后讲了,更新配置以后需要重启客户端才能生效,这在实际的场景中是不可取的.由于目前Steeltoe配置的重载只能由客户端发起,没有实现处理程序侦听服务器更改事件,所以还没办法实现彻底实现这 ...
- spring cloud+dotnet core搭建微服务架构:Api授权认证(六)
前言 这篇文章拖太久了,因为最近实在太忙了,加上这篇文章也非常长,所以花了不少时间,给大家说句抱歉.好,进入正题.目前的项目基本都是前后端分离了,前端分Web,Ios,Android...,后端也基本 ...
随机推荐
- 学习ASP.NET MVC 编程系列文章目录
学习ASP.NET MVC(一)--我的第一个ASP.NET MVC应用程序 学习ASP.NET MVC(二)--我的第一个ASP.NET MVC 控制器 学习ASP.NET MVC(三)--我的第一 ...
- uni-app实现公众号登陆实现
公众号实现登陆流程思路: 1. 创建一个页面用于登陆,页面上需要有输入账号和密码的表单,以及登陆按钮.2. 在登陆按钮的点击事件中,调用后端接口进行账号密码校验.如果校验通过,则将后端返回的用户信息保 ...
- 使用 Docker 部署 GLPI 资产管理系统
1)GLPI 介绍 GLPI 简介 参考: https://github.com/glpi-project/glpi 官方文档:https://glpi-project.org/documentati ...
- USB数据传输与手机授权:充电宝常规使用不需要授权
概述 此篇为解答充电宝骗局问题,骗局概述:两个人做局,以充测试充电宝是否损坏为由,插到受骗者手机上,受骗者允许了手机弹出的授权请求后,偷偷将病毒注入手机. Q:什么情况下手机会弹出授权? A:手机用数 ...
- vscode 批量函数前加const 正则表达式替换
需求 有200多个函数,我要在前面加const devService_importCertificate_result = function (args) { 方案 vscode 替换 打开正则的图标 ...
- Pod的优先级(priorityClass)和抢占策略(preemptionPolicy)
Pod优先级 Pod优先级是一个用于指示Pod相对重要程度的整数值.优先级高的Pod在调度时会优先被考虑,并且在资源不足时,优先级较低的Pod可能会被驱逐以释放资源给优先级较高的Pod.Pod优先级的 ...
- Oracle 字符串拆分成一个一个字符
SELECT (REGEXP_SUBSTR('LW112190', '[A-Z0-9]', 1, ROWNUM)) test FROM DUAL CONNECT BY ROWNUM <= LEN ...
- 为什么医疗保健需要MFT来帮助保护EHR文件传输
毫无疑问,医疗保健行业需要EHR技术来处理患者,设施,提供者等之间的敏感患者信息.但是,如果没有安全的MFT解决方案,您将无法安全地传输患者文件,从而使您的运营面临遭受数据泄露,尴尬,声誉损失以及随之 ...
- P9966 [THUPC 2024 初赛] 机器人 题解
细节大模拟. 题意 一堆机器人在一起,每个人有左右手和一些指令,依次执行并输出结果. 做法 首先这种指令的执行还算是比较简单的大模拟,一个个实现即可,在此给出我的定义. struct Robot{ i ...
- 福州大学MEM 备考总结
自己的基本情况 2022年8月2日,当天觉得休息的差不多了,思来想去,觉得考研是个不错的选择,和女朋友聊了一下,得到她的支持,于是乎定下目标.接着就是开始在网络上查找相关的材料,先把要报考高校和专业的 ...