.NETCore、.NET 7 和 RabbitMQ 的发布-订阅模式

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。
本文将探索如何使用 .NET 7 和 RabbitMQ 作为应用程序可靠的消息代理来实现这个绝佳的模式。
如果您不熟悉 RabbitMQ 及其基本概念,我强烈建议您阅读我之前的文章:
https://blog.csdn.net/hefeng_aspnet/article/details/152210945
不过,在我们开始讲解代码之前,让我先简单介绍一下发布-订阅模式的含义。想象一下:系统中有多个对象想要接收特定事件或更新的通知。使用发布-订阅模式,这些对象可以订阅感兴趣的主题,并只接收它们关心的通知。这样一来,再也不用被无用的更新淹没了!此外,这种模式还能降低依赖性,并促进系统组件之间的松耦合。这难道不棒极了?
环境配置
好了,我们先来设置一下环境。确保你的机器上已经安装了 Docker。如果你还没有,不用担心!只需按照docker.com上的安装说明操作即可。
要创建本地 RabbitMQ 实例及其漂亮的管理界面,请运行以下命令:
docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.10-management
现在,我们如何访问管理界面?很简单!打开你常用的浏览器,访问http://localhost:15672/。RabbitMQ UI 登录界面会显示欢迎界面。用户名和密码都使用“guest”。好了!登录成功!
在深入实现之前,我们先配置一些东西。在 RabbitMQ UI 中,转到“Exchanges”选项卡并执行以下步骤:
1 — 展开“Add a new exchange”部分。
2 — 填写以下详细信息:
- 姓名:
customers-service - 类型:
topic
3 — 点击“Add exchange”。

现在,让我们创建两个队列和绑定。仍然在 RabbitMQ UI 中,导航到“队列”选项卡并执行以下操作:
4 — 展开“Add a new queue”部分。
5 — 填写以下详细信息:
- 姓名:
notifications-service/customer-created - 类型:
Classic
6 — 点击“Add queue”。

7 — 使用以下详细信息重复此过程:
- 姓名:
sales-service/customer-created - 类型:
Classic

8 — 现在,让我们将这些队列绑定到我们的交换机。访问队列的“Bindings”选项卡notifications-service/customer-created,并填写以下详细信息:
- From exchange:
customers-service - Routing key:
customer-created

9--sales-service/customer-created创建具有相同详细信息的队列重复相同的步骤。

现在我们的环境已经设置好了,是时候开始编写一些代码了!
执行
在本文开头,我提到过源代码可供您查看。您可以在这里找到它。
我们有一个包含三个 ASP.NET Core 7 项目的解决方案:
- PowerShop.Customers:我们引以为豪的出版商
CustomerCreatedEvent。 - PowerShop.Notifications 和 PowerShop.Sales:我们热切的订阅者
CustomerCreatedEvent。
让我们看一下这些项目中的一些重要类。
首先,让我们深入研究发布者的代码,它位于项目CustomersController的中PowerShop.Customers。该控制器公开一个 HTTP POST 端点,该端点与 RabbitMQ 建立连接,并customers-service使用customer-created路由键向交换器发布消息。
以下是代码中发生的事情的细分:
- 我们实例化一个
ConnectionFactory对象,并将其指向“localhost”处的本地 RabbitMQ 实例。 - 我们创建一个连接并使用该连接创建一个通道。
- 我们将对象转换为 JSON 字符串,然后转换为字节数组,以将其作为消息发布。
- 我们通过提供交换、路由键和代表消息的字节数组来发布消息。
现在,让我们继续讨论订阅者。我们将使用继承自它们的类BackgroundService,并在文件中将它们配置为托管服务,Program.cs以确保它们在应用程序启动时启动。
让我们NotifyCustomerCreatedSubscriber从项目开始PowerShop.Notifications。
上面的代码执行以下操作:
- 我们实例化一个
ConnectionFactory,并将其指向“localhost”处的本地 RabbitMQ 实例。 - 我们创建一个连接并使用该连接创建一个通道。
- 我们实例化一个
EventingBasicConsumer并为该事件设置一个事件处理程序Received。 - 我们将消息主体的字节数组转换为
CustomerCreatedEvent对象。 - 我们打印出收到的消息及其电子邮件内容。
- 我们确认该消息已使用该方法处理
BasicAck。 BasicConsume最后,我们通过调用定义了队列和消费者的方法来开始使用消息。
现在,我们来看一下项目OnboardingCustomerCreatedSubscriber中的PowerShop.Sales。它遵循与之前的订阅者相同的模式。
呼!代码量好大,不过别担心,我们快完成了!
在运行应用程序并见证奇迹之前,我们需要在PowerShop.Notifications和PowerShop.Sales项目中配置订阅者。这很简单!只需Program.cs在 中的文件中添加以下行PowerShop.Notifications:
并将此行添加到Program.cs文件中PowerShop.Sales:
瞧!一切就绪!
现在,让我们分别运行三个应用程序。

api/customers向项目端点发出请求PowerShop.Customers。密切关注交易所的汇率变化customers-service,并准备好迎接“发布-订阅”模式的魔力!

呼!我们成功了!花点时间欣赏一下发布-订阅模式的美妙之处,以及它如何让我们的组件在彼此不认识的情况下进行通信。它就像一个秘密俱乐部,信息自由流动,订阅者只会收到他们感兴趣的内容。很棒,不是吗?
欢迎随意探索源代码并进行修改。一切皆有可能!祝您编程愉快!
请记住,在发布-订阅领域,兔子永远不会停止跳跃!😊
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。
