实现 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 设置调整HostNameUserNamePasswordExchangeName和值。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 服务器。

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

相关推荐
YDS82915 小时前
大营销平台 —— 活动SKU库存扣减业务及其一致性处理
java·spring boot·redis·rabbitmq·ddd
霸道流氓气质16 小时前
Kiro 中配置 RabbitMQ MCP Server 指南
分布式·rabbitmq·ruby
quweiie1 天前
tp8使用rabbitMQ消息队列的示例
消息队列·rabbitmq·thinkphp消息队列
六点_dn1 天前
RabbitMQ学习笔记-定义与作用
笔记·学习·rabbitmq
Steadfast_GG4 天前
RabbitMQ升级打怪之路(1) - RabbitMQ概述
消息队列·rabbitmq·流量削峰·消息分发·异步解耦
时代的狂5 天前
RabbitMQ 面试问答
分布式·面试·rabbitmq
半夜修仙5 天前
Spring集成邮箱功能
java·开发语言·spring boot·spring·rabbitmq·github·maven
半夜修仙6 天前
RabbitMQ的推模式和拉模式
java·分布式·中间件·rabbitmq·github·java-rabbitmq
952368 天前
RabbitMQ - 高级特性
java·spring boot·分布式·后端·rabbitmq
qiu_lovejun9989 天前
linux安装docker和redis和rabbitmq和nginx和rocketmq和kafka
linux·redis·docker·kafka·rabbitmq·rocketmq