.NET Core 8 与 RabbitMQ 和 MassTransit

介绍

本文件提供这是一份在 .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

  1. 打开 RabbitMQ 管理控制台http://localhost:15672/
  2. 使用默认凭据(guest/guest)登录。
  3. 导航到"管理"选项卡以创建新用户。
  4. 添加新用户并为您的应用程序设置适当的权限。
  5. 为您的应用程序创建必要的交换和队列。

流程说明

该应用包含两个主要服务: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

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

相关推荐
江沉晚呤时13 小时前
.NET 9 快速上手 RabbitMQ 直连交换机:高效消息传递实战指南
开发语言·分布式·后端·rabbitmq·.net·ruby
⑩-2 天前
RabbitMQ 架构和工作原理?RabbitMQ 延迟队列如何实现?
java·分布式·架构·rabbitmq
七夜zippoe2 天前
消息队列选型:Kafka vs RabbitMQ vs Redis 深度对比
redis·python·kafka·消息队列·rabbitmq
chikaaa3 天前
RabbitMQ 核心机制总结笔记
java·笔记·rabbitmq·java-rabbitmq
猹叉叉(学习版)3 天前
【ASP.NET CORE】 14. RabbitMQ、洋葱架构
笔记·后端·架构·c#·rabbitmq·asp.net·.netcore
⑩-3 天前
为什么要用消息队列?使用场景?
java·rabbitmq
⑩-4 天前
RabbitMQ与Kafka的区别?
分布式·kafka·rabbitmq
独断万古他化4 天前
【抽奖系统开发实战】Spring Boot 抽奖模块全解析:MQ 异步处理、缓存信息、状态扭转与异常回滚
java·spring boot·redis·后端·缓存·rabbitmq·mvc
未秃头的程序猿4 天前
🚀 别再手写 RabbitMQ 样板代码了!这个开源 Starter 让消息队列集成只需 5 分钟
后端·rabbitmq