MassTransit Get Started-
MassTransit:是一款.NET的分布式应用程序框架(开源、免费)。通过MassTransit,可以轻松创建利用基于消息的、松耦合异步通信的应用程序和服务,以提高可用性,可靠性和可伸缩性。
MassTransit本身定位轻量级的服务总线,并支持多种传输方式如:RabbitMQ、Azure Service Bus、ActiveMQ、Amazon SQS、Kafka、Azure Event Hub。消息异常处理:重试配置、重新交付、erro管道、死信管道。分布式事务处理:sagas、Courier。容器支持:.NETcore自身的、autofac、castle windsor等、调度支持:Quartz 、hangfire。更多功能参考官网文档。
MassTransit目前已经发布到了第7个版本了,7.0版本新增了对Kafka 的支持,构建仅支持.NET Standard 2.0...其他改动不大。MassTransit社区使用也是很活跃的,对于首次接触的,通过本篇文章(基于rabbitmq)帮你快速入门!
一个应用程序或服务可以使用两种不同的方法来生产消息,主要区别是sent需要指定具体的端点地址,而pub不需要,下面的代码会演示这两种方式。
发布事件(多个接收者)
发送命令(一个接收者)
发布事件(事件消息)
场景假设:在xx项目中,需要与第三方进行交互。比如:订单发货之后,把发货的信息的推送给第三方、把订单的状态变化也推送过去。我们分析下需求,系统要求在发货之后,需要做若干事情。可以解读为,发货这个动作已经发生了,需要做的事情不确定。这不是典型的发布订阅模式嘛!好了,那使用masstransit如何实现呢?
1.创建一个类库项目定义消息体,命名为contract
public interface OrderShipped{public Guid OrderId { get; set; }//订单号}
2.创建一个api项目作为消息的生产方,命名为Delivery,然后安装nuget包:
Install-Package MassTransit.AspNetCore
Install-Package MassTransit.RabbitMQ
在Startup类的ConfigureServices中,添加以下配置
services.AddMassTransit(x =>{x.UsingRabbitMq((context, config) =>{config.Host("rabbitmq://localhost:5672", hostConfig =>{hostConfig.Username("Amq");//填写你的用户名hostConfig.Password("mq123");//填写你的用户名});});});services.AddMassTransitHostedService();
在ValueController中,进行发布消息
readonly IPublishEndpoint _publishEndpoint;public ValuesController(IPublishEndpoint publishEndpoint){_publishEndpoint = publishEndpoint;}/// <summary>/// 测试发布/// </summary>/// <returns></returns>[HttpPost]public async Task<ActionResult> OrderDelivery(){//其他await _publishEndpoint.Publish<OrderShipped>(new{OrderId = Guid.NewGuid()});return Ok();}
通过使用IPublishEndpoint实例的Publish方法,发布一个事件。
3.创建一个api项目作为消息的消费方,命名为Listener,然后安装nuget包:
Install-Package MassTransit.AspNetCore
Install-Package MassTransit.RabbitMQ
在Startup类的ConfigureServices中,添加以下配置
services.AddMassTransit(x =>{x.AddConsumer<DeliveryExpressNotifyConsumer>();x.UsingRabbitMq((context, config) =>{config.Host("rabbitmq://localhost:5672", hostConfig =>{hostConfig.Username("Amq");hostConfig.Password("mq123");});config.ReceiveEndpoint("Order.Shipped", e =>{e.ConfigureConsumer<DeliveryExpressNotifyConsumer>(context);});});});services.AddMassTransitHostedService();
实现接口IConsumer即可完成消费逻辑的过程。
public class DeliveryExpressNotifyConsumer : IConsumer<OrderShipped>{ILogger<DeliveryExpressNotifyConsumer> _logger;public DeliveryExpressNotifyConsumer(ILogger<DeliveryExpressNotifyConsumer> logger){_logger = logger;}public async Task Consume(ConsumeContext<OrderShipped> context){_logger.LogInformation("订单id: {Value}已发货,通知第三方", context.Message.OrderId);}}
到此,消息生产方和消费方代码都已经实现了,运行一下,效果如下
发送消息(命令消息)
发送消息适用的场景,常常是一种命令,并且期望消息只被一个接收者或服务实例进行处理。masstransit使用发送消息和发布消息,在消息生产方不同之处,sent消息需要指定目标地址,使用ISendEndpoint的Send方法,消费者代码一样的配置。以下代码演示发送一个创建发货单的指令消息,比较简单直接贴出源码:
1.定义一个消息SubmitShippingOrder
public class SubmitShippingOrder{public Guid OrderId { get; set; }}
2.sent消息
readonly IPublishEndpoint _publishEndpoint;readonly ISendEndpointProvider _sendEndpointProvider;public ValuesController(IPublishEndpoint publishEndpoint, ISendEndpointProvider sendEndpointProvider){_publishEndpoint = publishEndpoint;_sendEndpointProvider = sendEndpointProvider;}/// <summary>/// 测试发送/// </summary>/// <returns></returns>[HttpPost]public async Task<ActionResult> Delivery(){var endpoint = await _sendEndpointProvider.GetSendEndpoint(new Uri("queue:Submit.Shipping.Order")); //获取发送端点await endpoint.Send(new SubmitShippingOrder{OrderId = Guid.NewGuid()});return Ok();}
3.消费
public class SubmitShippingOrderConsumer : IConsumer<SubmitShippingOrder>{ILogger<SubmitShippingOrderConsumer> _logger;public SubmitShippingOrderConsumer(ILogger<SubmitShippingOrderConsumer> logger){_logger = logger;}public async Task Consume(ConsumeContext<SubmitShippingOrder> context){_logger.LogInformation("创建发货单,订单id: {Value}", context.Message.OrderId);}}
运行一下效果:
官网文档:
http://masstransit-project.com/
https://masstransit-project.com/advanced/courier/
MassTransit Get Started-相关推荐
- .NET Core微服务之基于MassTransit实现数据最终一致性(Part 1)
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.预备知识:数据一致性 关于数据一致性的文章,园子里已经有很多了,如果你还不了解,那么可以通过以下的几篇文章去快速地了解了解,有个感性认 ...
- MassTransit - .NET Core 的分布式应用程序框架
简介 MassTransit 是一个免费的.开源的.NET 分布式应用程序框架.MassTransit 使创建应用程序和服务变得容易,这些应用程序和服务利用基于消息的松散耦合异步通信来实现更高的可用性 ...
- MassTransit中RequestResponse基本使用
MassTransit 是一个自由.开源.轻量级的消息总线基于.Net框架, 用于创建分布式应用程序.方便搭建基于消息的松耦合异步通信的应用程序和服务.MassTransit 在现有消息传输上提供了一 ...
- 基于Abp VNext框架设计 - Masstransit分布式消息
abp 通过IDistributedEventBus接口集成自IEventBus实现分布式事件消息的发布订阅. IEventBus在什么时机触发PublishAsync? 当前UnitOfWork完成 ...
- 基于Masstransit实现Eventbus的功能
Masstransit 是一个非常优秀的基于消息进行通信的分布式应用程序框架,详情参考官网. 在介绍AA.ServiceBus之前,先介绍下几个概念. 分布式 分布式系统如何定义?这里引用一下Dist ...
- ASP.NET Core 2.0利用MassTransit集成RabbitMQ
在ASP.NET Core上利用MassTransit来集成使用RabbitMQ真的很简单,代码也很简洁.近期因为项目需要,我便在这基础上再次进行了封装,抽成了公共方法,使得使用RabbitMQ的调用 ...
- .NET Core微服务之路:不断更新中的目录 (v0.42)
原文:.NET Core微服务之路:不断更新中的目录 (v0.42) 微服务架构,对于从事JAVA架构的童鞋来说,早已不是什么新鲜的事儿,他们有鼎鼎大名的Spring Cloud这样的全家桶框架支撑, ...
- MassTransit_契约的创建
消息契约的命名规范 命令模式:动词+对象 事件模式:对象+动词 不同模式下要求不同的主键 Creating a message contract In MassTransit, a message c ...
- dommel mysql_.Net Core AA.FrameWork应用框架介绍
开发多年,一直在从社区获取开源的便利,也深感社区力量的重要性,今天开源一个应用基础框架AA.FrameWork,也算是回馈社区,做出一点点贡献,希望能够帮助类似当年入行的我. AA.FrameWork ...
最新文章
- Java入门培训班怎么选择
- Investigating SQL Server 2008 Wait Events with XEVENTS
- 日志打印的正确姿势!
- Spring-学习笔记03【Spring的IOC和DI】
- DOS 网络命令之 netstat
- Cant get connection to Zookeeper
- 服务器linux启动,Linux 服务器环境启动
- word 职称计算机考试大纲,全国职称计算机考试Word2003大纲.doc
- java堆内存_java堆内存详解
- 电动轮椅行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
- Apache与Subversion的简单配置(Apache SVN版本控制)
- 杰理之如果再开蓝牙一拖二的话。手机连接样机时,会出现,无法连接【篇】
- luoguP4173 残缺的字符串 FFT
- mysql 5.7 安装tokudb_安装Percona-Server-5.7.18+tokudb
- 纯真IP数据库QQWry.dat格式详解
- 个人学习笔记——庄懂的技术美术入门课(美术向)06
- 12、【易混淆概念集】-第六章3 资源平衡 VS 资源平滑 进度压缩 制定进度计划 定义活动 里程碑清单
- java反向代理开源_树莓派反向代理方法大全
- 更换python的pip下载国内源
- 「文末送书」如何让数据分析不脱离业务?
热门文章
- BFS HDOJ 2102 A计划
- 即时聊天IM之一 XMPP协议简述
- android studio no marked region found along edge Found along top edge
- 【原创】SQL SERVER 查询Job作业基本信息及执行情况
- kali linux超级用户_如何优雅的在Linux上使用Powershell]
- 905. 按奇偶排序数组
- zabbix 3.0.0beta1安装-centos6.8版本
- ETL工具kettle的组件--生成记录
- WCF分布式开发常见错误(25):The certificate 'CN=WCFHTTPS' must have a private key
- 自从装了windows神器,再也不用羡慕mac了