实现 RabbitMQ 实现 .NET 6 Web API 之间的通信

介绍:

在现代分布式系统中,多个微服务或 Web API 之间需要相互通信的情况很常见。虽然在某些情况下,API 到 API 的直接通信可以实现,但随着系统的增长和演进,维护起来会变得非常困难。一个确保服务间可靠且可扩展通信的有效解决方案是使用 RabbitMQ 之类的消息代理。

在本文中,我们将探讨如何将 RabbitMQ 添加到两个独立的 .NET 6 Web API 解决方案中并在它们之间建立通信。

RabbitMQ 是一个流行的开源消息代理,它提供了强大的消息传递基础架构。通过使用 RabbitMQ,您可以解耦服务、提高可扩展性,并轻松处理基于消息的通信。

在本分步指南中,我们将介绍 RabbitMQ.Client 包的安装、RabbitMQ 的配置以及每个解决方案中 RabbitMQ 服务的实现。我们将演示如何使用 RabbitMQ 作为中介在 Web API 之间发送和接收消息。

在本教程结束时,您将对如何将 RabbitMQ 集成到您的 .NET 6 Web API 中,并利用其强大的消息传递功能实现服务之间的无缝通信有深入的理解。那么,让我们开始实施吧!

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

执行

步骤1:

安装 RabbitMQ.Client 在每个 .NET 6 Web API 解决方案中,您需要安装 RabbitMQ.Client 包。

您可以通过向每个解决方案添加以下 NuGet 包引用来实现此目的:

<ItemGroup>

<PackageReference Include= "RabbitMQ.Client" Version= "6.2.2" />

</ItemGroup>

确保根据您的要求调整版本号。

步骤2:

RabbitMQ 配置 在每个解决方案中,在文件中添加 RabbitMQ 的配置部分appsettings.json。

以下是一个示例配置:

{

"RabbitMQ": {

"HostName": "localhost",

"UserName": "guest",

"Password": "guest",

"ExchangeName": "my_exchange",

"QueueName": "my_queue"

}

}

根据您的 RabbitMQ 设置调整HostName、UserName、Password、ExchangeName和值。QueueName

步骤3:

实现 RabbitMQ 服务 在每个解决方案中创建一个 RabbitMQ 服务来处理消息的发送和接收。

以下是一个示例实现:

using Microsoft.Extensions.Configuration;

using RabbitMQ.Client;

using System;

using System.Text;

public interface IRabbitMQService

{

void SendMessage(string message);

void ReceiveMessage();

}

public class RabbitMQService : IRabbitMQService

{

private readonly IConfiguration _configuration;

private readonly IConnection _connection;

private readonly IModel _channel;

private readonly string _exchangeName;

private readonly string _queueName;

public RabbitMQService(IConfiguration configuration)

{

_configuration = configuration;

_exchangeName = _configuration"RabbitMQ:ExchangeName";

_queueName = _configuration"RabbitMQ:QueueName";

ConnectionFactory factory = new ()

{

HostName = _configuration"RabbitMQ:HostName",

UserName = _configuration"RabbitMQ:UserName",

Password = _configuration"RabbitMQ:Password"

};

_connection = factory.CreateConnection();

_channel = _connection.CreateModel();

_channel.QueueDeclare(queue: _queueName, durable: false, exclusive: false, autoDelete: false, arguments: null);

}

public void SendMessage(string message)

{

var body = Encoding.UTF8.GetBytes(message);

_channel.BasicPublish(exchange: _exchangeName, routingKey: "", basicProperties: null, body: body);

}

public void ReceiveMessage()

{

EventingBasicConsumer consumer = new (_channel);

consumer.Received += (model, ea) =>

{

var body = ea.Body.ToArray();

var message = Encoding.UTF8.GetString(body);

Console.WriteLine("Received message: {0}", message);

};

_channel.BasicConsume(queue: _queueName, autoAck: true, consumer: consumer);

}

}

步骤4:

使用 RabbitMQ 服务 在每个解决方案中,使用 RabbitMQ 服务发送和接收消息。

您可以IRabbitMQService根据需要注入到您的控制器或其他类中。

以下是一个例子:

ApiController

Route("api/\[controller\]")

public class MessagesController : ControllerBase

{

private readonly IRabbitMQService _rabbitMQService;

public MessagesController(IRabbitMQService rabbitMQService)

{

_rabbitMQService = rabbitMQService;

}

HttpPost

public IActionResult SendMessage(FromBody string message)

{

_rabbitMQService.SendMessage(message);

return Ok();

}

}

要接收消息,您可以ReceiveMessage在任何需要处理传入消息的地方调用 RabbitMQ 服务的方法。

就是这样!通过此设置,您可以从一个 .NET 6 Web API 将消息发送到 RabbitMQ 交换器,而另一个 .NET 6 Web API 可以从 RabbitMQ 队列中使用这些消息。

请记住在运行应用程序之前启动 RabbitMQ 服务器。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

相关推荐
后台模板学习18 小时前
Kafka 与 RabbitMQ 在用户认证与权限管理场景
kafka·rabbitmq·linq
装不满的克莱因瓶2 天前
支付订单成功异步MQ权益发放设计和开发
java·架构·系统架构·rabbitmq·硬件架构
千里达景区票务系统2 天前
消息队列选型对比:RabbitMQ vs RocketMQ vs Kafka
kafka·消息队列·rabbitmq·rocketmq
未秃头的程序猿5 天前
@ConditionalOnMissingBean 把我配好的 RabbitMQ 手动 ack 吃掉了
后端·rabbitmq
一条泥憨鱼5 天前
【RabbitMQ】高级篇
java·分布式·rabbitmq·php·ruby
阳光不锈@7 天前
三大主流消息队列架构设计思想剖析:从 RabbitMQ 到 RocketMQ 的改造实践
kafka·rabbitmq·rocketmq·rabbit改造rocket·去除rabbitmq·rabbitmq改造
catino13 天前
RabbitMQ详解
分布式·rabbitmq·ruby
叶总没有会13 天前
RabbitMQ高级
分布式·rabbitmq
Linux实战笔记15 天前
记一次消息队列选型对比线上排查:Kafka/RabbitMQ/Pulsar 技术选型
kafka·rabbitmq·高并发·pulsar·消息队列选型
张彦峰ZYF15 天前
一条消息的丢与重:Kafka 与 RabbitMQ 可靠投递的确认、位点、死信与幂等全链路
后端·kafka·消息队列·rabbitmq·isr·解耦与削峰·丢失与重复