介绍:
在现代分布式系统中,多个微服务或 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 服务器。
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。