MassTransit一个优秀的.NET消息(事件)总线框架

.NET架构进阶:从理论到实战,突破技术瓶颈与设计思维 在软件架构领域,理解核心设计原则与模式是构建可维护、高性能系统的基石。依赖倒置、清晰架构等原则指导开发者解耦业务逻辑与基础设施,而领域驱动设计(DDD)则提供了将复杂业务规则映射为代码模型的战术工具。这些技术的核心价值在于应对系统演进中的挑战,如数据一致性、服务边界划分和性能瓶颈。在微服务等分布式场景下,它们与.NET技术栈深度集成,帮助解决服务通信、事务处理和可观测性等工程难题。本文聚焦于.NET开发者从“会用”到“会设计”的常见瓶颈,通过剖析仓储模式、聚合根设计等热词,结合微服务拆分、CQRS等高频搜索 阅读详情
AI摘要

本文介绍了MassTransit这个.NET框架下的消息总线,用于创建分布式应用程序。通过实例展示了如何安装、创建事件源和事件处理类,并在控制台应用中发布和订阅事件。进一步,文章详细解释了如何在ASP.NET Core环境中配置MassTransit,发布和消费事件,帮助开发者理解如何在实际项目中运用事件驱动架构。

1 前置阅读

在阅读本文章之前,你可以先阅读:

  • RabbitMQ入门
  • 什么是观察者模式
  • 什么是事件总线
  • 如何使用RabbitMQ实现事件总线

2 简介

MassTransit 是一个自由、开源、轻量级的消息总线, 用于使用. NET 框架创建分布式应用程序。MassTransit 在现有消息传输上提供了一组广泛的功能, 从而使开发人员能够友好地使用基于消息的会话模式异步连接服务。基于消息的通信是实现面向服务的体系结构的可靠和可扩展的方式。

3 使用

首先,将MassTransit的NuGet软件包安装到您的应用程序中。

MassTransit
MassTransit.RabbitMQ

然后,创建具体事件源类。

/// <summary>
/// 具体事件源类
/// </summary>
public class SendedEvent
{
    public string Name { get; private set; }
    public SendedEvent(string name)
    {
        Name = name;
    }
}

接着,创建具体事件处理类,默认继承IConsumer<>接口。

/// <summary>
/// 具体事件处理类顾客A
/// </summary>
public class CustomerASendedEventHandler : IConsumer<SendedEvent>
{
    public Task Consume(ConsumeContext<SendedEvent> context)
    {
        Console.WriteLine($"顾客A收到{context.Message.Name}通知!");
        return Task.CompletedTask;
    }
}
/// <summary>
/// 具体事件处理类顾客B
/// </summary>
public class CustomerBSendedEventHandler : IConsumer<SendedEvent>
{
    public Task Consume(ConsumeContext<SendedEvent> context)
    {
        Console.WriteLine($"顾客B收到{context.Message.Name}通知!");
        return Task.CompletedTask;
    }
}

最后,客户端调用。

static void Main(string[] args)
{
    var bus = Bus.Factory.CreateUsingRabbitMq(sbc =>
    {
        sbc.Host("rabbitmq://localhost");
        sbc.ReceiveEndpoint("test_queue", ep =>
        {
            ep.Consumer<CustomerASendedEventHandler>();// 订阅
            ep.Consumer<CustomerBSendedEventHandler>();
        });
    });
    bus.Start();
    var sendedEvent = new SendedEvent("优惠");
    Console.WriteLine($"商店发了{sendedEvent.Name}通知!");
    bus.Publish(sendedEvent);// 发布
    Console.ReadKey(); // press Enter to Stop
    bus.Stop();
}

让我们来看看输出结果:

商店发布优惠通知!
顾客A收到优惠通知。
顾客B收到优惠通知。

4 ASP.NET Core 使用

首先,将MassTransit的NuGet软件包安装到您的应用程序中。

MassTransit
MassTransit.RabbitMQ
MassTransit.AspNetCore

然后,创建具体事件源类

/// <summary>
/// 具体事件源类
/// </summary>
public class SendedEvent
{
    public string Name { get; private set; }
    public SendedEvent(string name)
    {
        Name = name;
    }
}

接着,创建发布者代码:

  1. 往Startup.ConfigureServices中增加以下代码
services.AddMassTransit(x =>
{
    x.UsingRabbitMq();
});
services.AddMassTransitHostedService();
  1. 创建HomeController,发布事件
using EventBus.MassTransit.Events;
using MassTransit;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
namespace EventBus.MassTransit.Producer.WebApi01.Controllers
{
    [Route("[controller]")]
    [ApiController]
    public class HomeController : ControllerBase
    {
        private readonly IPublishEndpoint publishEndpoint;
        public HomeController(IPublishEndpoint publishEndpoint)
        {
            this.publishEndpoint = publishEndpoint;
        }
        [HttpPost]
        public async Task<ActionResult> Post()
        {
            await publishEndpoint.Publish<SendedEvent>(new SendedEvent("优惠"));
            return Ok();
        }
    }
}

接着,创建订阅者代码:

  1. 创建具体事件处理类
/// <summary>
/// 具体事件处理类顾客A
/// </summary>
public class CustomerASendedEventHandler : IConsumer<SendedEvent>
{
    public Task Consume(ConsumeContext<SendedEvent> context)
    {
        Console.WriteLine($"顾客A收到{context.Message.Name}通知!");
        return Task.CompletedTask;
    }
}
/// <summary>
/// 具体事件处理类顾客B
/// </summary>
public class CustomerBSendedEventHandler : IConsumer<SendedEvent>
{
    public Task Consume(ConsumeContext<SendedEvent> context)
    {
        Console.WriteLine($"顾客B收到{context.Message.Name}通知!");
        return Task.CompletedTask;
    }
}
  1. 往Startup.ConfigureServices中增加以下代码
services.AddMassTransit(x =>
{
    x.AddConsumer<CustomerASendedEventHandler>();
    x.AddConsumer<CustomerBSendedEventHandler>();
    x.UsingRabbitMq((context, cfg) =>
    {
        cfg.ReceiveEndpoint("event-listener", e =>
        {
            e.ConfigureConsumer<CustomerASendedEventHandler>(context);
            e.ConfigureConsumer<CustomerBSendedEventHandler>(context);
        });
    });
});
services.AddMassTransitHostedService();

最后,执行Post()方法,在订阅者项目中跟踪会输出:

顾客A收到优惠通知。
顾客B收到优惠通知。
.NET架构进阶:微服务、高性能与DDD实战难点解析 在软件架构领域,微服务架构通过将单体应用拆分为独立部署的服务单元,提升了系统的可扩展性和可维护性。其核心原理在于服务自治、去中心化治理和基于API的通信。这种架构模式的技术价值在于支持团队独立开发、技术栈异构和弹性伸缩,广泛应用于电商、金融科技和物联网等复杂业务场景。领域驱动设计(DDD)则通过统一语言和限界上下文,将复杂业务逻辑清晰地映射到代码模型,确保软件核心与业务目标一致。本文聚焦于.NET技术栈,深入探讨微服务架构下的分布式事务一致性保障,以及高并发场景中性能瓶颈的定位与优化策略,为开发者提供从理论 阅读详情

相关推荐

Qt 插件开发 plugin 超详细 有源码

Qt 插件化开发框架类似于前后端的微服务的场景,授权哪个微服务则前端可以使用哪个微服务,插件就行硬件插卡一样,可以被随时删除、插入和修改,所以结构很灵活,容易修改,方便软件的升级和维护;插件主要面向接口编程,无需访问.lib文件,热插拔、利于团队开发。即使在程序运行时.dll不存在,也可以正常启动,只是相应插件功能无法正常使用而已;动态库需要访问.lib文件,而且在程序运行时必须保证.lib存在,否则无法正常启动;

q610098308的专栏 6550

MassTransit是什么?

MassTransit是一个用于.NET的开源分布式应用程序框架,主要用于构建基于消息、异步和事件驱动模式的系统。它旨在简化依赖于消息模式的应用程序的开发,包括发布-订阅、请求-响应和消息路由等模式。MassTransit提供了工具,用于实现跨多个消息交互跨足的长时间运行过程,称为saga,从而使您可以建模复杂的业务流程。MassTransit是.NET生态系统中构建分布式系统的热门选择之一,因为它抽象了消息基础设施的复杂性,并提供了高级别的、开发人员友好的API。

极客神殿 1926

MoveIt2 Servo实战:解锁UR机械臂在ROS2中的实时遥操作与动态响应

本文深入探讨了MoveIt2 Servo在UR机械臂实时遥操作中的应用,展示了如何通过ROS2实现毫秒级动态响应。文章详细解析了Servo的核心价值、环境配置、控制器适配及高级调优技巧,特别适用于需要高精度控制的工业场景,如VR手术训练和汽车装配线。

weixin_29044157的博客 250

MassTransit | .NET 分布式应用框架

引言❝A free, open-source distributed application framework for .NET. 一个免费、开源的.NET 分布式应用框架。 -- MassTransit 官网❞MassTransit[1],直译公共交通, 是由Chris Patterson开发的基于消息驱动的.NET 分布式应用框架,其核心思想是借助消息来实现服务之间的松耦合异步通信,进而确...

圣杰 767

运放 + MOS管构成的恒流电路分析及实用环境器件参数选择

恒流电路

五花带点肉 2万+

【深度解析TI InstaSPIN】无传感器FOC控制的核心方案

TI InstaSPIN通过“自动识别+通用观测器+开源工具链”的组合,解决了无传感器FOC控制开发难度大、周期长的核心痛点。其核心优势在于快速统一软件观测器的通用性与高精度,以及Fly Start闭环零速启动策略的高可靠性,可适配空调压缩机等家电电机的复杂运行需求。在空调外机双电机控制场景中,InstaSPIN与TI C2000系列MCU(F280013x/F28E12x)完美契合,借助MCU的高性能DSP内核与丰富外设,可实现双电机的精准同步控制,同时降低硬件成本与开发周期。

昔时扬尘处 329

MassTransit-概念-04生产者

应用程序或服务可以使用两种不同的方法生成消息。消息可以被发送或发布。每种方法的行为非常不同,但通过查看每种方法涉及的消息类型很容易理解。当消息被发送时,它使用被传递到特定端点,例如队列。当消息被发布时,它不会被发送到特定端点,而是广播给任何订阅了该消息类型的消费者。对于这两种不同的行为,我们将发送的消息描述为命令,将发布的消息描述为事件。有关消息名称的更多信息,请参阅消息概念页面。

NuClear的.Net专栏 1850

《AgentScope-Java 深入浅出教程》第1章 AgentScope-Java 简介

AgentScope-Java 是一个面向智能体的编程框架,专门用于构建基于大语言模型(LLM)的 AI 应用程序。│ 你的业务应用 ││ AgentScope-Java 框架 ││ │ 智能体 │ │ 工具 │ │ 记忆 │ │ 模型 │ ││ LLM 服务 (DashScope/OpenAI/...) │能力说明类比ReAct 推理让智能体能够"思考"并"行动"就像人类思考后再做事工具调用让智能体能够执行外部操作就像人使用计算器、搜索引擎记忆管理让智能体能够记住对话历史。

步子哥的博客 595

MassTransit-概念-03消费者

消费者定义用于指定消费者的行为,以便它们可以自动配置。定义可以通过显式添加,或者使用任何方法自动发现。下面展示了一个消费者定义的示例。有关完整的配置参考,请参阅配置部分。

NuClear的.Net专栏 1062

YOLOv11改进 | Conv篇 | DWRSeg扩张式残差助力小目标检测 (附创新修改后的C3k2DWRSeg)

本文内容给大家带来的DWRSeg中的DWR模块来改进YOLOv11中的C2f和Bottleneck模块,主要针对的是小目标检测,主要创新点可以总结如下:多尺度特征提取机制的深入研究和创新的DWR模块和SIR模块的提出这种方法使得网络能够更灵活地适应不同尺度的特征,从而更准确地识别和分割图像中的物体。DWRSeg的基本原理和框架,并且能够在你自己的网络结构中进行添加DWRSeg需要增加一定的计算量一个DWR模块大概增加0.4GFLOPsYOLOv11改进系列专栏——本专栏持续复习各种顶会内容——科研必备。

Snu77的博客 4191

芒果YOLOv11改进175:DCNv4卷积,全网首发纯Pytorch实现代码,无需cuda编译|即插即用,一键运行:高效可变形卷积网络:重新思考视觉应用的动态和稀疏算子

芒果YOLOv11改进:DCNv4卷积,全网首发纯Pytorch实现代码,无需cuda编译|即插即用,一键运行:高效可变形卷积网络:重新思考视觉应用的动态和稀疏算子

包括YOLOv5、YOLOv7、YOLOv8等模型改进 1299

MassTransit状态机(Saga State Machine)深度解析

MassTransit的状态机(原Automatonymous)是一个强大的.NET状态机库,它允许开发者通过C#语法定义复杂的状态机逻辑。状态机由状态(States)、事件(Events)和行为(Behaviors)组成,用于管理长时间运行的业务流程。 ### 状态机核心组件 状态机包含几个关键组成部分: 1. **状态(State)**:表示业务流程的当前阶段 2. **事件(Event...

gitblog_00357的博客 564

Python 爬虫教程:美食网站 + 社交平台餐馆评论抓取(评分提取 + 情感分析)

在当今数字化时代,数据无处不在,而爬虫技术则是获取数据的强大工具之一。无论是市场调研、学术研究还是个人兴趣探索,爬虫都能帮助我们从海量的网络信息中提取有价值的数据。本文将通过一个实战案例,带领大家学习如何使用 Python 爬虫技术抓取美食网站和社交平台上的餐馆评论,并进行评分提取与情感分析。通过这个项目,你将掌握爬虫的基本原理、数据解析、以及如何结合情感分析技术来挖掘数据背后的洞察。

u014481728的博客 312

MassTransit消息生产者模式详解:Send与Publish的实战指南

在分布式系统中,消息传递是服务间通信的核心机制。MassTransit作为.NET平台上的优秀消息总线框架,提供了两种基础的消息生产模式:Send(发送)和Publish(发布)。理解这两种模式的差异及适用场景,是构建可靠消息系统的关键。 ## 消息生产模式对比 ### 1. Send命令模式 Send操作将消息直接投递到**特定端点**(如队列),具有以下特点: - **点对点通信**:...

gitblog_00666的博客 691

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

基于Masstransit实现Eventbus的功能

Masstransit是一个非常优秀的基于消息进行通信的分布式应用程序框架,详情参考官网。在介绍AA.ServiceBus之前,先介绍下几个概念.分布式分布式系统如何定...

dotNET跨平台 399

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

MassTransit 探究初步

1.  背景 作为SOA基础设施,企业服务总线(ESB)是一个具有高分布性、事件驱动服务的SOA架构,是当前企业集成的主流框架。 2.  简介 网站:http://masstransit-project.com/   MassTransit (MT) is a framework forcreating distributed applications on the .Net platf

来往 1万+

推荐neter常用优秀开源项目系列之一

.net社区有很多优秀的开源项目,我们今天先推荐6个开源项目;1.MassTransitMassTransit 是一个自由、开源、轻量级的消息总线, 用于使用. NET ...

dotNET跨平台 396

.net/c#常用框架/中间件简介

任务调度 Quartz.NET:Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等。 Quartz.NET允 许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了 Quartz.NET的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业。 日志记

Denghejing的专栏 3916

使用Masstransit开发基于消息传递的分布式应用

Masstransit作为.Net平台下的一款优秀的开源产品却没有得到应有的关注,这段时间有机会阅读了Masstransit的源码,我觉得我有必要普及一下这个框架的使用。 值得一提的是Masstransit的源码写的非常优秀,值得每个想提高自己编程能力的.Net选手阅读,整个代码看起来赏心悦目。反之,每次打开自己公司项目的时候心情都异常沉重。所以不是.Net不行,还是咱们水平不行。 学会了Mass...

weixin_34014277的博客 496

Automatonymous:终极.NET状态机库完全指南 - 构建复杂工作流的简单方法

在当今复杂的软件开发环境中,**Automatonymous状态机库**为.NET开发者提供了一个强大的工具来管理应用程序状态和工作流。这个完全基于代码的.NET状态机库让构建复杂状态机变得前所未有的简单,无需任何可视化设计器或额外依赖。🚀 ## 📋 什么是Automatonymous状态机库? **Automatonymous**是一个专为.NET平台设计的状态机库,它采用100%纯代码

gitblog_00407的博客 1009

.net/c#常用框架/中间件简介(不定时更新)

任务调度 Quartz.NET:Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等。Quartz.NET允 许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了 Quartz.NET的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业。 ...

weixin_30823833的博客 809

10大.NET工作流引擎精选:企业级流程自动化终极指南

在当今数字化转型时代,**工作流引擎**已成为企业实现流程自动化、提升运营效率的核心技术。作为开发者,选择合适的.NET工作流引擎至关重要。awesome-workflow-engines项目精心整理了最优秀的开源工作流引擎资源,本文将为您推荐10款顶级的.NET工作流引擎,助您轻松构建高效的企业级应用系统。🚀 ## 为什么需要工作流引擎? **工作流引擎**能够将复杂的业务流程转化为可执行

gitblog_00313的博客 571

Green Pipes: 打造高效数据流处理的中间件库

Green Pipes: 打造高效数据流处理的中间件库 项目介绍 在现代软件开发中,异步处理和并发管理是提升应用性能的关键。绿管(GreenPipes)正是为了解决这一难题而生的一款基于.NET的中间件库。它源自于广受好评的消息总线框架MassTransit的核心组件——消息管道,并已内置于MassTransit之中。这一设计上的迁移,不仅使得GreenPipes成为一个高度专业化、独立运作的工...

gitblog_00306的博客 955

.NET架构进阶:从CRUD到高并发与微服务的实战突破

在软件架构领域,从单体应用到分布式系统的演进是开发者面临的核心挑战。其原理在于通过解耦、服务化与弹性设计来应对业务复杂性与规模增长。这一转变的技术价值在于构建高可用、可扩展且易于维护的系统。应用场景广泛覆盖电商、金融科技及物联网等高并发领域。本文聚焦于.NET技术栈,深入探讨领域驱动设计(DDD)的落地实践与微服务架构下的数据一致性等核心难题,为开发者提供从思维到实践的完整进阶路径。

weixin_34238633的博客 501

.NET 9 原生AOT与C# 13新特性实战解析及生态工具盘点

在软件开发领域,编译技术是提升应用性能与部署效率的核心。原生AOT(Ahead-of-Time)编译通过将代码预先编译为机器码,实现了极致的启动速度与精简的内存占用,其原理在于消除即时编译(JIT)开销与运行时依赖。这项技术的价值在云原生和边缘计算场景中尤为凸显,它能显著降低冷启动延迟和资源消耗。具体到.NET生态,.NET 9持续拓展原生AOT的边界,增强了对流行NuGet包的兼容性,并与ASP.NET Core Minimal API深度集成,使得构建高性能微服务更为便捷。与此同时,C# 13引入了扩展

weixin_33766805的博客 585
上一篇: Bootstrap 思维导图
下一篇: Zookeeper:新增、查看、修改、删除节点
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值