实现 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 服务器。

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

相关推荐
霸道流氓气质1 天前
RabbitMQ 延迟队列与死信队列:原理、实现与实战
分布式·rabbitmq·ruby
YOU OU3 天前
RabbitMQ应用问题
分布式·rabbitmq
YOU OU3 天前
RabbitMQ高级特性
分布式·rabbitmq
JLWcai202510093 天前
核电打磨 “安全卫士”|金利威不锈钢专用树脂砂轮,合规高效双在线
mysql·mongodb·eureka·sqlite·rabbitmq·nosql·memcached
sunywz5 天前
【从零搭建物联网智能充电桩系统】选型篇:Netty、MQTT、RabbitMQ、IoTDB 为什么这么选?
物联网·rabbitmq·iotdb
华章酱5 天前
基于 RabbitMQ 与 Hyperf 的消息顺序性保障方案
分布式·rabbitmq
城管不管8 天前
RabbitMQ死信队列
java·分布式·ai·面试·职场和发展·rabbitmq·agent
城管不管8 天前
rabbitmq如何保证消息不丢失?解决方案又是什么?
开发语言·ai·面试·职场和发展·rabbitmq·php·agent
六点_dn8 天前
RabbitMQ学习笔记-部署和使用
笔记·学习·rabbitmq
笨蛋不要掉眼泪8 天前
RabbitMQ消息队列:业务幂等性
分布式·rabbitmq·java-rabbitmq