.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

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

相关推荐
洛豳枭薰11 小时前
消息队列关键问题描述
kafka·rabbitmq·rocketmq
闻哥20 小时前
Kafka高吞吐量核心揭秘:四大技术架构深度解析
java·jvm·面试·kafka·rabbitmq·springboot
creator_Li2 天前
RabbitMQ示例
rabbitmq
惊讶的猫2 天前
rabbitmq实践小案例
分布式·rabbitmq
AC赳赳老秦2 天前
代码生成超越 GPT-4:DeepSeek-V4 编程任务实战与 2026 开发者效率提升指南
数据库·数据仓库·人工智能·科技·rabbitmq·memcache·deepseek
惊讶的猫2 天前
rabbitmq初步介绍
分布式·rabbitmq
惊讶的猫2 天前
AMQP 与 RabbitMQ 四大模型
分布式·rabbitmq
像少年啦飞驰点、2 天前
从零开始学 RabbitMQ:小白也能懂的消息队列实战指南
java·spring boot·微服务·消息队列·rabbitmq·异步编程
lekami_兰2 天前
RabbitMQ 延迟队列实现指南:两种方案手把手教你搞定
后端·rabbitmq·延迟队列
为什么不问问神奇的海螺呢丶2 天前
n9e categraf rabbitmq监控配置
分布式·rabbitmq·ruby