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

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。
示例代码:https://download.csdn.net/download/hefeng_aspnet/92051314
.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)登录。
- 导航到"管理"选项卡以创建新用户。
- 添加新用户并为您的应用程序设置适当的权限。
- 为您的应用程序创建必要的交换和队列。
流程说明
该应用包含两个主要服务:aQueueSenderService和 a QueueReceiverService。这两个服务通过 RabbitMQ 使用 MassTransit 进行通信。以下是该流程的详细说明:
队列发送器服务:
- SendCommand :此端点创建一个
Account对象并将其发送到名为的 RabbitMQ 队列send-command。 - PublishEvent :此端点
Client向 RabbitMQ 发布事件,任何感兴趣的服务都可以使用该事件。 - RequestResponse :此端点
TransferData向 RabbitMQ 发送请求并等待CurrentBalance消费者的响应。
队列接收服务:
- SenderService :该消费者监听队列
send-command并处理Account消息。 - PublisherService :该消费者监听
Client事件并处理它们。 - RequestResponseService :此消费者监听
TransferData请求并通过CurrentBalance消息进行响应。
项目结构
该项目结构如下:
/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
在您的Program.cs文件中,使用 RabbitMQ 配置 MassTransit。
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 正在运行并且连接详细信息正确。
- **消息处理错误:**检查日志中是否有任何异常并确保消费者已正确注册。
示例代码:https://download.csdn.net/download/hefeng_aspnet/92051314
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。