.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

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

相关推荐
小北方城市网9 小时前
SpringBoot 集成 Redis 实战(缓存优化与分布式锁):打造高可用缓存体系与并发控制
java·spring boot·redis·python·缓存·rabbitmq·java-rabbitmq
jonyleek1 天前
告别硬编码:通过逻辑编排引擎的RabbitMQ监听实现灵活自动化
分布式·自动化·rabbitmq·服务编排·逻辑引擎
利刃大大1 天前
【RabbitMQ】延迟队列 && 事务 && 消息分发
分布式·消息队列·rabbitmq·队列
八宝粥大朋友1 天前
rabbitMQ-C 构建android 动态库
android·c语言·rabbitmq
小北方城市网1 天前
SpringBoot 集成消息队列实战(RabbitMQ/Kafka):异步通信与解耦,落地高可靠消息传递
java·spring boot·后端·python·kafka·rabbitmq·java-rabbitmq
九转苍翎1 天前
掌控消息全链路(1)——初识RabbitMQ:从核心概念到五种常用模式全景解析
rabbitmq
子非衣2 天前
CenOS7安装RabbitMQ(含延迟队列插件)
分布式·rabbitmq·ruby
独自破碎E2 天前
说说RabbitMQ的集群模式
rabbitmq
利刃大大2 天前
【RabbitMQ】重试机制 && TTL && 死信队列
分布式·后端·消息队列·rabbitmq·队列
论迹3 天前
【RabbitMQ】-- 七种工作模式
分布式·rabbitmq