目录
介绍
本文档提供了在 .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
-
打开 RabbitMQ 管理控制台,网址为 。http://localhost:15672/
-
使用默认凭据(guest/guest)登录。
-
导航到“管理员”选项卡以创建新用户。
-
添加新用户并为您的应用程序设置适当的权限。
-
为您的应用程序创建必要的交换和队列。
流程说明
应用程序由两个主要服务组成: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 正在运行,并且连接详细信息正确。
-
消息处理错误: 检查日志中是否有任何异常,并确保使用者已正确注册。