.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

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

相关推荐
程序员阿鹏18 小时前
怎么理解削峰填谷?
java·开发语言·数据结构·spring·zookeeper·rabbitmq·rab
csdn_aspnet1 天前
在 .NET Core 8 中实现 RabbitMQ
rabbitmq·.net8
csdn_aspnet1 天前
.NET 8 Web 应用、Web API 和 RabbitMQ
rabbitmq·.netcore·.net8
AC赳赳老秦1 天前
DeepSeek + Excel 实战:多表联动分析与异常数据自动预警教程
microsoft·rabbitmq·excel·etcd·memcached·memcache·deepseek
@淡 定1 天前
主流消息队列对比:Kafka vs RabbitMQ vs RocketMQ
kafka·rabbitmq·rocketmq
AC赳赳老秦1 天前
动态可视化报告制作:DeepSeek+Mermaid生成交互式流程图/甘特图
信息可视化·rabbitmq·流程图·甘特图·memcached·memcache·deepseek
Mr.朱鹏2 天前
超时订单处理方案实战指南【完整版】
java·spring boot·redis·spring·rabbitmq·rocketmq·订单
Wang's Blog2 天前
RabbitMQ: 集群监控与高可用架构深度解析之状态检测、问题诊断
架构·rabbitmq
csdn_aspnet2 天前
使用 Windows 客户端的 RabbitMQ Messaging for .NET 8 Web API 第 2 部分
windows·rabbitmq·.netcore·.net8