做网站要先做商标吗,wordpress多站版,做网站模版,山东网络推广优化排名MassTransit#xff1a;是一款.NET的分布式应用程序框架#xff08;开源、免费#xff09;。通过MassTransit#xff0c;可以轻松创建利用基于消息的、松耦合异步通信的应用程序和服务#xff0c;以提高可用性#xff0c;可靠性和可伸缩性。MassTransit本身定位轻量级的服… 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 TaskActionResult OrderDelivery(){//其他await _publishEndpoint.PublishOrderShipped(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.AddConsumerDeliveryExpressNotifyConsumer();x.UsingRabbitMq((context, config) {config.Host(rabbitmq://localhost:5672, hostConfig {hostConfig.Username(Amq);hostConfig.Password(mq123);});config.ReceiveEndpoint(Order.Shipped, e {e.ConfigureConsumerDeliveryExpressNotifyConsumer(context);});});});services.AddMassTransitHostedService();
实现接口IConsumer即可完成消费逻辑的过程。 public class DeliveryExpressNotifyConsumer : IConsumerOrderShipped{ILoggerDeliveryExpressNotifyConsumer _logger;public DeliveryExpressNotifyConsumer(ILoggerDeliveryExpressNotifyConsumer logger){_logger logger;}public async Task Consume(ConsumeContextOrderShipped 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 TaskActionResult 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 : IConsumerSubmitShippingOrder{ILoggerSubmitShippingOrderConsumer _logger;public SubmitShippingOrderConsumer(ILoggerSubmitShippingOrderConsumer logger){_logger logger;}public async Task Consume(ConsumeContextSubmitShippingOrder context){_logger.LogInformation(创建发货单订单id: {Value}, context.Message.OrderId);}}
运行一下效果官网文档http://masstransit-project.com/https://masstransit-project.com/advanced/courier/