在ASP.NET样板中使用MassTransit和RabbitMQ

目录

介绍

安装RabbitMQ

创建项目

创建OrderDto

配置MVC项目

源代码


介绍

MassTransit是一个免费的、开源的.NET分布式应用程序框架。借助MassTransit,可以轻松创建利用基于消息的松散耦合异步通信的应用程序和服务,以实现更高的可用性、可靠性和可扩展性。

您可以查看 MassTransit文档 GitHub存储库以获取更多信息。

安装RabbitMQ

我们将RabbitMQMassTransit一起使用。因此,我们要做的第一件事是安装RabbitMQ。如果您未使用Windows,请转到Windows安装文档或相关页面上选择您的操作系统。然后,将RabbitMQ安装到您的计算机。

创建项目

为了集成MassTransit,让我们 Startup Templates - Create a Demo | AspNet Boilerplate 页面上创建一个新项目。创建项目后,按照建议的入门文档运行项目,该文档将在项目创建后显示给您。为了在本文中使用示例代码,可以用MassTransitSample作为项目名称。

创建发布者项目

为了发布消息,我们将创建一个单独的Web项目。为此,请将一个名为MassTransitSample.Web.Publisher的空Web项目添加到解决方案中。

之后,将以下包添加到创建的项目中:

<PackageReference Include="MassTransit.RabbitMQ" Version="8.0.6" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />

然后,更改发布器项目中program.cs文件的内容,如下所示:

using MassTransit;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

builder.Services.AddMassTransit(mass =>
{
    mass.UsingRabbitMq((context, cfg) =>
    {
        cfg.Host("localhost", "/", h =>
        {
            h.Username("guest");
            h.Password("guest");
        });

        cfg.ConfigureEndpoints(context);
    });
});          

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.Run();

这将基本上将SwaggerMassTransit整合到发布者项目中。

要发布消息,请在program.cs后面紧接着app.UseHttpsRedirection();添加以下行

app.MapPost("create-order", async (IBus bus, OrderDto order) =>
          {
              await bus.Publish(order);
          });  

创建OrderDto

在我们的消息中,我们将使用 DTO 类来发送我们的消息。因此,让我们首先创建Orders文件夹,然后在MassTransitSample.Application项目中的Orders文件夹下创建Dto文件夹,然后在Orders/Dto 文件夹下创建OrderDto类,如下所示。

public class OrderDto
{
    public string OrderName { get; set; }
          
    public decimal Price { get; set; }
}

最后,在MassTransitSample.Web.Publisher项目中添加一个MassTransitSample.Application引用,以便我们可以在发布者项目中使用OrderDto

配置MVC项目

我们设法发布了来自发布者项目的消息。因此,现在我们需要配置我们的消费者项目来接收和处理消息。在此示例中,我们将配置MassTransitSample.Web.Mvc项目,但您可以将相同的配置应用于MassTransitSample.Web.Host或您将添加到解决方案中的任何其他web项目。

MassTransit NuGet包添加到MVC项目:

<ItemGroup>
    <PackageReference Include="MassTransit.RabbitMQ" Version="8.0.10" />
</ItemGroup>

然后,创建一个consumer以使用从发布者项目发送的消息,如下所示:

using System.Threading.Tasks;
using MassTransit;
using MassTransitSample.Orders.Dto;
using Microsoft.Extensions.Logging;

namespace MassTransitSample.Web.Orders
{
    public class OrderConsumer : IConsumer<OrderDto>
    {
        private readonly ILogger<OrderDto> _logger;

        public OrderConsumer(ILogger<OrderDto> logger)
        {
            _logger = logger;
        }

        public async Task Consume(ConsumeContext<OrderDto> context)
        {
            _logger.LogInformation("Received order {code} with price {price}",
                context.Message.OrderName,
                context.Message.Price
            );

            await Task.CompletedTask;
        }
    }
}

由于ASP.NET样板使用Castle.Windsor依赖关系注入,因此我们将以不同于其默认文档中建议的方法进行配置MassTransit

为了向我们的consumer类注入任何服务,我们需要在PostInitialize方法中进行此注册,以便在ASP.NET样板完成类注册到依赖项注入后执行它。为此,请转到MassTransitSampleWebMvcModule并覆盖PostInitialize方法并更改其内容,如下所示:

public override void PostInitialize()
{
    IocManager.IocContainer.Register
    (Component.For<OrderConsumer>().LifestyleTransient());

    var busControl = Bus.Factory.CreateUsingRabbitMq(config =>
    {
        config.Host(new Uri("rabbitmq://localhost/"), host =>
        {
            host.Username("guest");
            host.Password("guest");
        });

        config.ReceiveEndpoint(queueName: "repro-service", endpoint =>
        {
            endpoint.Handler<OrderDto>(async context =>
            {
                using (var consumer = IocManager.ResolveAsDisposable
                      <OrderConsumer>(typeof(OrderConsumer)))
                {
                    await consumer.Object.Consume(context);
                }
            });
        });
    });

    IocManager.IocContainer.Register
       (Component.For<IBus, IBusControl>().Instance(busControl));

    busControl.Start();
}

毕竟,运行MassTransit.Publisher应用程序和MassTransit.Web.Mvc应用程序。然后,在发布者应用上打开/swagger URL并发送消息。此消息将由MVC项目中的OrderConsumer处理。

源代码

您可以在 Github 上访问示例项目 https://github.com/aspnetboilerplate/aspnetboilerplate-samples/tree/master/MassTransitSample

https://www.codeproject.com/Tips/5352379/Using-MassTransit-with-RabbitMQ-in-ASP-NET-Boilerp

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值