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/

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

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

相关文章

「软件项目管理」成本估算模型——Walston-Felix模型和COCOMO Ⅱ模型

Walston-Felix模型和COCOMO Ⅱ模型序言一、Walston-Felix模型1. 公式2. 举例二、COCOMO模型&#xff08;Constructive Cost Model&#xff09;1. 模型定义2. COCOMO模型的发展3. COCOMO基本原理三、COCOMO 811. 模型级别2. 项目类型3. 基本COCOMO-81&#xff08;1&#xff09;公…

图书管理(SSM)

一:前言 这仅仅是个小demo,体验了一把SSM配置地狱&#xff0c;就简单的实现CRUD 二:相关技术 MybatisSpringSpringMVCMysqlMavenTomcat 三:功能展示 1:查询 2:增加 3:删除 4&#xff1a;修改 四:上码 1&#xff1a;导入依赖 <?xml version"1.0" encoding&…

ASP.NET Core Cookie SameSite

在较多的项目中&#xff0c;Cookie 是比较常用的一种状态保持的选择。比如常见的例子&#xff1a;用户登录成功后&#xff0c;服务器通过 set-cookie 将会话Id设置到当前域下&#xff0c;前端在调用后端接口时&#xff0c;会自动将同域下的 Cookie 携带上&#xff0c;然后后端接…

还不会ts?一文带你打开ts的大门

一文带你打开ts的大门序言一、什么是TypeScript&#xff1f;1、编程语言的类型2、TypeScript究竟是什么&#xff1f;二、为什么要学习TypeScript&#xff1f;1、程序更容易理解2、效率更高3、更少的错误4、非常好的包容性5、一点小缺点三、typescript入门1、如何安装TypeScript…

idea中右侧的Maven框消失了

我掉 芭比Q了 idea中右侧的maven框居然没了 消失不见了 跟一束烟似的 没了 解决&#xff08;网上找的&#xff09;

「软件项目管理」一文详解软件项目进度计划

软件项目进度计划序言一、进度及任务的定义1. 进度2. 任务3. 产品和任务的关系二、任务关联关系1. 定义2. 任务(活动)之间的关系3. 任务关系矩阵4. 任务关联关系的依据三、进度管理图示1. 甘特图2. 网络图&#xff08;1&#xff09;定义&#xff08;2&#xff09;常用的网络图Ⅰ…

过年烟花特效

一&#xff1a;前言 过年了 菜鸡杰 在这给CSDN的伙计们拜年了 这一段时间以来 我特别感谢 我的粉丝 正是因为有你们的陪伴 所以我才会很大动力 去写博客&#xff0c;所以我就准备了一个特效给粉丝们 现在过年不让放烟花 我就改了个代码 改成烟花特效 送给大家 二:特效描述 这…

「软件项目管理」一文详解软件项目质量计划

一文详解软件项目质量计划&#x1f3a9;前言&#x1f452;一、质量概述1. 质量与软件质量2. 质量成本二、质量模型1. 定义2. 几种模型3. 模型解读&#xff08;1&#xff09;Bohem质量模型&#xff08;2&#xff09;McCall质量模型&#xff08;3&#xff09;ISO/IEC 9126质量模型…

WSL2 支持挂载物理磁盘,Windows 可直接访问 ext4

喜欢就关注我们吧&#xff01;最新的 Windows Insiders Preview Build 为 WSL2 的命令行程序增加了新功能&#xff1a;wsl --mount&#xff0c;这个新参数支持在 WSL2 添加和挂载物理磁盘&#xff0c;用户通过它能访问 Windows 没有原生支持的 Linux 文件系统&#xff08;例如 …

2招解决并发问题,省几百万设备费用!说穿了很简单...

经大佬介绍&#xff0c;接了个技术顾问的私活儿&#xff0c;3天搞定报酬8000&#xff0c;Mark一下&#xff0c;也分享下经验心得。&#xff08;经大家要求&#xff0c;文末增加了一段接私活儿经验&#xff09;背景交代甲方是广东某国企信息部&#xff0c;美其名曰是邀请技术顾问…

「软件项目管理」一文详解软件配置管理计划

一文详解软件配置管理计划前言一、配置管理概述1. 配置管理(SCM)定义2. 软件配置项目(SCI)3. 基线4. 软件配置控制委员会&#xff08;SCCB&#xff09;二、软件配置管理过程1. 管理过程2. 管理过程解析&#xff08;1&#xff09;配置项标识、跟踪I. 定义II. SPM项目要求&#x…

Kubernetes探针踩坑记

1. 荒腔走板最近一两个月生产K8s集群频繁出现短时503 Service Temporarily Unavailable&#xff0c;还不能主动复现&#xff0c;相当郁闷&#xff0c;压力山大。HTTP 5xx响应状态码用于定义服务端错误。500 Internal Server Error&#xff1a;所请求的服务器遇到意外的情况并阻…

「软件项目管理」一文了解软件项目团队计划

一文了解软件项目团队计划序言一、人力资源计划1. 团队定义2. 项目组织结构&#xff08;1&#xff09;职能型&#xff08;2&#xff09;项目型&#xff08;3&#xff09;矩阵型3. 责任分配矩阵二、项目干系人计划1. 干系人定义2. 干系人识别3. 干系人参与分类4. 干系人参与评估…

leetcode40. 组合总和 II

一:题目 二:上码 class Solution { public:/**思路:1.题目中说的每个数字只在每个组合中使用一次的话 我们可以考虑 在递归遍历的时候 index1不断缩小范围&#xff08;因为这也是在一个大的集合中挑选小的集合&#xff0c;所以是需要记录index的&#xff09;2.但是我们在填写…

DDD:架构思想的旧瓶新酒?阿里等大厂却对它趋之若鹜!

4月&#xff0c;InfoQ 发布了软件架构与设计的趋势报告。在报告中可以看出&#xff0c;微服务、领域驱动设计等已经非常流行&#xff0c;并成为目前软件开发行业的主流趋势。大家都知道&#xff0c;微服务划分的一个重要理论基础就是领域驱动设计。但由于 DDD 门槛高、概念多&a…

「软件项目管理」一文浅谈软件项目风险计划

一文浅谈软件项目风险计划序言一、风险基本概念1. 风险的定义及特性2. 风险三要素3. 风险图示3. 风险类型&#xff08;1&#xff09;预测角度&#xff08;2&#xff09;范围角度二、风险管理过程三、风险识别1. 定义2. 风险识别方法3. 风险条目检查表之七个条目四、风险评估1. …

.NET Core 下使用 gRPC

gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架。https://grpc.io/docs/guides/https://github.com/grpc/grpc-dotnethttps://docs.microsoft.com/zh-cn/aspnet/core/grpc“gRPC 的主要优点现代高性能轻量级 RPC 框架。协定优先 API 开发&#xff0c;默认使用协议缓冲区…

leetcode93. 复原 IP 地址

一&#xff1a;每日论语解读 follow me !! 君子坦荡荡 小人常威威 二:题目 三:上码 class Solution { public:/**思路:1.分析题意本题依然是切割字符串(我们需要对要分割的字符串做出处理 需要判断我们截取的字符串是否合法)2。关于‘.’的处理 我们是在原字符串的基础上进…

ASP.NET Core整合Zipkin链路跟踪

前言在日常使用ASP.NET Core的开发或学习中&#xff0c;如果有需要使用链路跟踪系统&#xff0c;大多数情况下会优先选择SkyAPM。我们之前也说过SkyAPM设计确实比较优秀&#xff0c;巧妙的利用DiagnosticSource诊断跟踪日志&#xff0c;可以做到对项目无入侵方式的集成。其实还…

探秘react,一文弄懂react的基本使用和高级特性

一文详解react的基本使用、高级特性和周边插件⏰序言&#x1f4dd;一、React的基本使用1、JSX基本使用&#xff08;1&#xff09;变量、表达式&#xff08;2&#xff09;class和style&#xff08;3&#xff09;子元素和组件&#xff08;4&#xff09;原生 html2、条件判断&…