.NET Core 8中如何使用 RabbitMQ 和 MassTransit

目录

介绍

.NET Core 8 SDK

RabbitMQ

MassTransit

设置 RabbitMQ

流程说明

项目结构

配置 MassTransit

消费者

其他配置

故障 排除


 

图片

介绍

本文档提供了在 .NET Core 8 环境中设置和使用 RabbitMQ 和 MassTransit 的综合指南。它涵盖了安装、配置和基本使用示例,以帮助开发人员将消息传递集成到他们的应用程序中。

.NET Core 8 SDK

从 Microsoft .NET 官方网站下载并安装 .NET Core 8 SDK。

RabbitMQ

按照 RabbitMQ 网站上的说明安装 RabbitMQ。

MassTransit

使用 NuGet 将 MassTransit 添加到 .NET Core 项目。

dotnet add package MassTransit  
dotnet add package MassTransit.RabbitMQ

设置 RabbitMQ

  1. 打开 RabbitMQ 管理控制台,网址为 。http://localhost:15672/

  2. 使用默认凭据(guest/guest)登录。

  3. 导航到“管理员”选项卡以创建新用户。

  4. 添加新用户并为您的应用程序设置适当的权限。

  5. 为您的应用程序创建必要的交换和队列。

流程说明

应用程序由两个主要服务组成:a 和 a。这些服务使用 MassTransit 通过 RabbitMQ 进行通信。以下是该流程的详细说明:QueueSenderServiceQueueReceiverService

QueueSenderService:

  • SendCommand:此端点创建一个对象,并将其发送到名为 的 RabbitMQ 队列。Accountsend-command

  • PublishEvent:此端点将事件发布到 RabbitMQ,任何感兴趣的服务都可以使用该事件。Client

  • RequestResponse:此端点向 RabbitMQ 发送请求,并等待使用者的响应。TransferDataCurrentBalance

QueueReceiverService:

  • SenderService:此使用者侦听队列并处理消息。send-commandAccount

  • PublisherService:此使用者侦听事件并处理它们。Client

  • RequestResponseService:此使用者侦听请求并使用消息进行响应。TransferDataCurrentBalance

项目结构

该项目的结构如下:

/app  
│  
├── QueueSenderService  
│   ├── Controllers  
│   │   └── QueueSenderController.cs  
│   ├── Program.cs  
│   └── ... (other files)  
│  
├── QueueReceiverService  
│   ├── QueueServices  
│   │   ├── PublishConsumer  
│   │   │   └── PublisherService.cs  
│   │   ├── RequestResponseConsumer  
│   │   │   └── RequestResponseService.cs  
│   │   ├── SenderConsumer  
│   │   │   └── SenderService.cs  
│   ├── Program.cs  
│   └── ... (other files)  
│  
├── CommonResources  
│   ├── Models  
│   │   └── (model files)  
│   └── ... (other files)  
│

配置 MassTransit

在您的文件中,使用 RabbitMQ 配置 MassTransit。Program.cs

using CommonResources;  
using MassTransit;  
  
var builder = WebApplication.CreateBuilder(args);  
  
builder.Services.AddControllers();  
builder.Services.AddEndpointsApiExplorer();  
builder.Services.AddSwaggerGen();  
  
builder.Services.AddMassTransit(x =>  
{  
    x.AddRequestClient<TransferData>();  
    x.AddBus(provider => Bus.Factory.CreateUsingRabbitMq(config =>  
    {  
        config.Host(new Uri("rabbitmq://localhost"), h =>  
        {  
            h.Username("guest");  
            h.Password("guest");  
        });  
    }));  
});  
builder.Services.AddMassTransitHostedService();  
var app = builder.Build();  
  
if (app.Environment.IsDevelopment())  
{  
    app.UseSwagger();  
    app.UseSwaggerUI();  
}  
  
app.UseHttpsRedirection();  
app.UseAuthorization();  
app.MapControllers();  
app.Run();

在QueueSenderController.cs

using CommonResources;
using MassTransit;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Threading.Tasks;

namespace QueueSenderService.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class QueueSenderController : ControllerBase
    {
        private readonly IBus _bus;
        private readonly IRequestClient<TransferData> _client;

        public QueueSenderController(IBus bus, IRequestClient<TransferData> client)
        {
            _bus = bus;
            _client = client;
        }

        [HttpPost("send-command")]
        public async Task<IActionResult> SendCommand()
        {
            var account = new Account()
            {
                Name = "David Bytyqi",
                Deposit = 500
            };

            var url = new Uri("rabbitmq://localhost/send-command");

            var endpoint = await _bus.GetSendEndpoint(url);
            await endpoint.Send(account);

            return Ok("Command sent successfully");
        }

        [HttpPost("publish-event")]
        public async Task<IActionResult> PublishEvent()
        {
            await _bus.Publish(new Client()
            {
                Name = "David Bytyqi",
                Pin = 123456
            });

            return Ok("Event published successfully");
        }

        [HttpPost("request-response")]
        public async Task<IActionResult> RequestResponse()
        {
            var requestData = new TransferData()
            {
                Type = "Withdrawal",
                Amount = 25
            };
            var request = _client.Create(requestData);
            var response = await request.GetResponse<CurrentBalance>();

            return Ok(response);
        }
    }
}

Program.cs针对 QueueReceiverService

using MassTransit;
using QueueReceiverService.QueueServices.PublishConsumer;
using QueueReceiverService.QueueServices.RequestResponseConsumer;
using QueueReceiverService.QueueServices.SenderConsumer;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

builder.Services.AddMassTransit(x =>
{
    x.AddConsumer<PublisherService>();
    x.AddConsumer<SenderService>();
    x.AddConsumer<RequestResponseService>();

    x.UsingRabbitMq((context, config) =>
    {
        config.Host(new Uri("rabbitmq://localhost"), h =>
        {
            h.Username("guest");
            h.Password("guest");
        });
        config.ReceiveEndpoint("send-command", e =>
        {
            e.Consumer<SenderService>(context);
        });
        config.ReceiveEndpoint("publish-event", e =>
        {
            e.Consumer<PublisherService>(context);
        });
        config.ReceiveEndpoint("request-response", e =>
        {
            e.Consumer<RequestResponseService>(context);
        });
    });
});

builder.Services.AddMassTransitHostedService();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

消费者

PublisherService.cs

using CommonResources;
using MassTransit;

namespace QueueReceiverService.QueueServices.PublishConsumer
{
    public class PublisherService : IConsumer<Client>
    {
        public async Task Consume(ConsumeContext<Client> context)
        {
            var info = context.Message;
        }
    }
}

RequestResponseService.cs

using CommonResources;
using MassTransit;

namespace QueueReceiverService.QueueServices.RequestResponseConsumer
{
    public class RequestResponseService : IConsumer<TransferData>
    {
        public async Task Consume(ConsumeContext<TransferData> context)
        {
            var data = context.Message;

            var nowBalance = new CurrentBalance()
            {
                Balance = 1000 - data.Amount
            };

            await context.RespondAsync(nowBalance);
        }
    }
}

SenderService.cs

using CommonResources;
using MassTransit;

namespace QueueReceiverService.QueueServices.SenderConsumer
{
    public class SenderService : IConsumer<Account>
    {
        public async Task Consume(ConsumeContext<Account> context)
        {
            var product = context.Message;
        }
    }
}

确保 RabbitMQ 正在运行且可访问。您应该看到消息正在按照配置发送和使用。

其他配置

  • 重试策略: 配置重试策略以处理暂时性故障。

  • 伐木: 集成日志记录以监视消息流和错误。

  • 健康检查: 添加运行状况检查以监视邮件系统的运行状况。

故障 排除

  • 连接问题: 确保 RabbitMQ 正在运行,并且连接详细信息正确。

  • 消息处理错误: 检查日志中是否有任何异常,并确保使用者已正确注册。

引入地址 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值