重新整理.netcore实践篇—————微服务的桥梁eventbus[三十一](代码片段)

你永远想象不到,一个光鲜亮丽的Application,有多么 你永远想象不到,一个光鲜亮丽的Application,有多么肮脏的Code     2022-12-02     719

关键词:

前言

简单介绍一下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...
	

这样即可,框架会帮我们处理。

总结

  1. 集成事件是跨服务的事件,在领域模式中,集成事件也是跨服务的领域事件

  2. 在领域模型中,集成事件一般由领域事件驱动触发

  3. 集成事件可以实现一致性,补充事务不能跨服务

  4. 集成事件会有一些额外的负担,使用的时候思考是否有必要

因为这个文档比较清晰,直接看文档更加通常,就不演示具体运行。

再次放一下文档:https://github.com/dotnetcore/CAP

下一节HttpClientFactory,以上只是个人整理一下,如有错误,望请指出。

重新整理.netcore实践篇—————应用层[三十](代码片段)

前言简单介绍一下应用层。正文应用层用来做什么的呢?应用层用来做处理api请求的。[HttpPost]publicTask<long>CreateOrder([FromBody]CreateOrderVeiwModelviewModel) varmodel=viewModel.ToModel(); returnawaitorderService.CreateOrder(model); 查看详情

重新整理.netcore实践篇—————工作单元模式[二十六](代码片段)

前言简单整理一下工作单元模式。正文工作单元模式有3个特性,也算是其功能:使用同一上下文跟踪实体的状态保障事务一致性工作单元模式主要关注事务,所以重点在事务上。在共享层的基础建设类库中加入:///<summary>///工... 查看详情

重新整理.netcore实践篇—————静态中间件[二十一](代码片段)

前言简单整理一下静态中间件。正文我们使用静态文件调用:app.UseStaticFiles();那么这个默认会将我们根目录下的wwwroot作为静态目录。这个就比较值得注意的,可能刚开始学.netcore的小伙伴,会直接把脚本写在更目录script这样是访... 查看详情

重新整理.netcore实践篇—————仓储层的具体实现[二十七](代码片段)

前言简单整理一下仓储层。正文在共享层的基础建设类库中:///<summary>///泛型仓储接口///</summary>///<typeparamname="TEntity">实体类型</typeparam>publicinterfaceIRepository<TEntity>whereTEntity:Entity,IAggregate 查看详情

重新整理.netcore实践篇—————路由和终结点[二十三](代码片段)

前言简单整理一下路由和终节点。正文路由方式主要有两种:1.路由模板方式2.RouteAttribute方式路由约束:1.类型约束2.范围约束3.正则表达式4.是否必选5.自定义IRootConstaintURL生成1.LinKGenerator2.IUrlHelper先搭建一个swagger:services.AddSwaggerGen(... 查看详情

重新整理.netcore实践篇—————应用分层[二十四](代码片段)

前言简单整理一下分层。正文应用程序分层,分为:1.领域模型层2.基础设施层3.应用层4.共享层共享层共享层一般包括下面几个类库。有一个Core的类库,比如说BLog.Core.这个类库用来,主要用来承载一些基础简单的类型,比如说一... 查看详情

重新整理.netcore实践篇—————entity的定义[二十五](代码片段)

前言简单介绍一下实体模型的设计。正文前文提及了我们的应用分为:共享层基础设施层领域层应用层今天来介绍领域模型层。前文提及到领域模型在共享层有一个领域模型抽象类库。里面有这些类:先分别介绍一下这些类是做... 查看详情

重新整理.netcore实践篇—————日志系统之结构化[十八](代码片段)

前言什么是结构化呢?结构化,就是将原本没有规律的东西进行有规律话。就比如我们学习数据结构,需要学习排序然后又要学习查询,说白了这就是一套,没有排序,谈如何查询是没有意义的,因为查询算法就是根据某种规律... 查看详情

重新整理.netcore实践篇—linux上排查问题实用工具[外篇]

前言介绍下面几个工具:Lldbcreatedumpdotnet-dumpdotnet-gcdumpdotnet-symbolProcdump该文的前置篇为:https://www.cnblogs.com/aoximin/p/16839812.html献给初学者,这篇就只介绍下看下日志和lldb,毕竟东西太多了。正文我以官网的例子作为演示:... 查看详情

.netcore微服务容器系列基础目录篇

...今天只是先把目录列出来,后面的每篇文章这两天会进行重新修改的,目前先将就看下)。简单介绍一下,博主目前就职于某电商公司,目前工作用的是.netcore,业余时间也会看下Java,公司内部目前也是多语言并存,毕竟很多工... 查看详情

winserver的consul部署实践与.netcore客户端使用(附demo源码)(代码片段)

 前言随着微服务兴起,服务的管理显得极其重要。都知道微服务就是”拆“,把臃肿的单块应用,拆分成多个轻量级的服务,每个服务可以在短周期内重构、迭代、交付。随着微服务的数量增多,因量变引起了质量,... 查看详情

winserver的consul部署实践与.netcore客户端使用(附demo源码)(代码片段)

前言随着微服务兴起,服务的管理显得极其重要。都知道微服务就是”拆“,把臃肿的单块应用,拆分成多个轻量级的服务,每个服务可以在短周期内重构、迭代、交付。随着微服务的数量增多,因量变引起了质量,带来... 查看详情

c#微服务必学清单

...、开发和部署微服务的指导和实践经验。3.《Microservicesin.NETCore》(ChristianHorsdalGammelgaard):本书重点介绍了如何在.NETCore中构建微服务应用程序,以及如何将其组织和部署到Docker容器中。微服务开源框架:1.Ocelot:Ocelot是一个基... 查看详情

winserver的consul部署实践与.netcore客户端使用(附demo源码)(代码片段)

原文:winserver的consul部署实践与.netcore客户端使用(附demo源码)前言随着微服务兴起,服务的管理显得极其重要。都知道微服务就是”拆“,把臃肿的单块应用,拆分成多个轻量级的服务,每个服务可以在短周期内重构、迭... 查看详情

.netcore实践篇————网关

参考技术A简单整理一下网关。在介绍网关之前,介绍一下BFF,BFF全称是BackendForFrontend,它负责认证授权,服务聚合,目标是为前端提供服务。说的通透一点,就是有没有见过这种服务。上述就是buff通过代理其他服务来让前端访... 查看详情

springcloud微服务迁移至kubernetes实践(代码片段)

...行近1年,遗留了一些问题不太好处理。原SpringCloud的整理文章见基于SpringCloud微服务的服务平台搭建的一些总结问题如下:客户端侧负载均衡在服务实例故障下线时候,不能及时发现,导致请求到故障实例地址造... 查看详情

docker学习总结——云端基于docker的微服务与持续交付实践

本文根据〖2016全球运维大会•深圳站〗现场演讲嘉宾分享内容整理而成 查看详情

架构师实践课单体和微服务怎么选?单体到微服务怎么转?

...首个议题——单体和微服务的选择。以下内容根据实践课整理。大家好,我是万俊峰,熟悉我的朋友都知道,我是做微服务相关工作的,是开源的go-zero作者。我们在做服务端的时候,其实 查看详情