在ASP.NET Core中使用RabbitMQ实现消息队列通信

梦境之翼 2024-07-20 ⋅ 17 阅读

引言

在现代分布式应用程序中,消息队列是一种广泛应用的通信模式,它可以实现不同系统之间的松耦合通信,提高系统的可伸缩性和可靠性。RabbitMQ是一个可靠的、开源的消息代理,被广泛应用于构建分布式系统。

本篇博客将介绍如何在ASP.NET Core中使用RabbitMQ实现消息队列通信。

准备工作

在开始之前,我们需要确保已经安装了RabbitMQ,并确保RabbitMQ服务器正在运行。你可以在RabbitMQ官方网站获取RabbitMQ的安装文件和详细安装说明。

创建ASP.NET Core项目

首先,让我们创建一个新的ASP.NET Core项目。使用以下命令在命令行中创建项目:

dotnet new webapi -n RabbitMQDemo
cd RabbitMQDemo

添加RabbitMQ依赖

我们需要安装RabbitMQ的适配器来与RabbitMQ进行通信。在项目根目录下,执行以下命令:

dotnet add package RabbitMQ.Client

这将自动将RabbitMQ.Client包添加到我们的项目中。

配置RabbitMQ连接

在项目的appsettings.json文件中,我们需要配置RabbitMQ连接的相关信息。示例配置如下:

{
  "RabbitMQ": {
    "Host": "localhost",
    "Port": 5672,
    "Username": "guest",
    "Password": "guest",
    "QueueName": "my_queue"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}

请根据你自己的RabbitMQ配置进行相应的调整。

创建RabbitMQ连接工厂

Startup.cs文件中,我们需要创建RabbitMQ连接工厂。在ConfigureServices方法中,添加以下代码:

using RabbitMQ.Client;

// ...

public void ConfigureServices(IServiceCollection services)
{
    // ...

    var rabbitMQConfig = Configuration.GetSection("RabbitMQ").Get<RabbitMQConfig>();
    services.AddSingleton<IConnection>(x =>
    {
        var factory = new ConnectionFactory()
        {
            HostName = rabbitMQConfig.Host,
            Port = rabbitMQConfig.Port,
            UserName = rabbitMQConfig.Username,
            Password = rabbitMQConfig.Password
        };
        return factory.CreateConnection();
    });

    // ...
}

确保你已经在命名空间中引入了RabbitMQ.Client

发送消息

在ASP.NET Core中,我们可以通过HTTP请求来发送消息到RabbitMQ。在Controllers文件夹下,创建一个名为MessageController.cs的文件。在该文件中,添加以下代码:

using RabbitMQ.Client;
using System.Text;

// ...

[ApiController]
[Route("[controller]")]
public class MessageController : ControllerBase
{
    private readonly IConnection _rabbitMQConnection;

    public MessageController(IConnection rabbitMQConnection)
    {
        _rabbitMQConnection = rabbitMQConnection;
    }

    [HttpPost]
    public IActionResult Post([FromBody] string message)
    {
        using (var channel = _rabbitMQConnection.CreateModel())
        {
            channel.QueueDeclare(queue: "my_queue",
                                 durable: false,
                                 exclusive: false,
                                 autoDelete: false,
                                 arguments: null);

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

            channel.BasicPublish(exchange: "",
                                 routingKey: "my_queue",
                                 basicProperties: null,
                                 body: body);

            return Ok();
        }
    }
}

在这段代码中,我们首先在RabbitMQ服务器上声明了一个名为my_queue的队列,然后通过channel.BasicPublish方法来将消息发布到该队列中。

接收消息

在ASP.NET Core中,我们可以使用HostedService来创建一个后台服务,以接收RabbitMQ发送的消息。在根目录创建名为Services的文件夹,并在该文件夹下创建一个名为RabbitMQConsumerService.cs的文件,添加以下代码:

using Microsoft.Extensions.Hosting;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

// ...

public class RabbitMQConsumerService : BackgroundService
{
    private readonly IConnection _rabbitMQConnection;

    public RabbitMQConsumerService(IConnection rabbitMQConnection)
    {
        _rabbitMQConnection = rabbitMQConnection;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        using (var channel = _rabbitMQConnection.CreateModel())
        {
            channel.QueueDeclare(queue: "my_queue",
                                 durable: false,
                                 exclusive: false,
                                 autoDelete: false,
                                 arguments: null);

            var consumer = new EventingBasicConsumer(channel);

            consumer.Received += (model, ea) =>
            {
                var body = ea.Body.ToArray();
                var message = Encoding.UTF8.GetString(body);
                // 处理接收到的消息
            };

            channel.BasicConsume(queue: "my_queue",
                                 autoAck: true,
                                 consumer: consumer);

            await Task.CompletedTask;
        }
    }
}

在这个类中,我们首先在RabbitMQ服务器上声明了一个名为my_queue的队列,然后使用channel.BasicConsume方法来监听队列,并在接收到消息时进行处理。

注册后台服务

最后,在Startup.cs文件的ConfigureServices方法中,注册我们创建的RabbitMQConsumerService服务:

services.AddHostedService<RabbitMQConsumerService>();

完成上述步骤后,我们就可以通过发送HTTP POST请求到/message来发送消息到RabbitMQ,并通过后台服务接收消息。

结语

在本篇博客中,我们学习了如何在ASP.NET Core中使用RabbitMQ实现消息队列通信。我们创建了一个ASP.NET Core项目,并添加了RabbitMQ的依赖。我们配置了连接信息,并创建了RabbitMQ连接工厂。我们还创建了一个消息发送的HTTP API,并通过后台服务来接收消息。希望这篇博客对你有所帮助,谢谢!


全部评论: 0

    我有话说: