.NET Core + RabbitMQ

Cuando se desarrollan microservicios, surge la cuestión de proporcionar información de un servicio a otros servicios a medida que ocurre cualquier evento. Es importante tener un sistema sin vincular al remitente a los destinatarios. En este caso, se utiliza el patrón editor-suscriptor.

Existen muchos productos de mensajería en el mercado que admiten el patrón de editor-suscriptor, como Azure Service Bus, RabbitMQ o Apache Kafka.

Recientemente, publiqué dos bibliotecas NuGet para una configuración rápida y conveniente de la comunicación basada en eventos usando Azure Service Bus y RabbitMQ. Este breve artículo de procedimientos describe los pasos para usar este último.

Fuente


Publisher es una aplicación .NET Core que actúa como remitente.
El suscriptor es una aplicación .NET Core que actúa como destinatario.

Cómo


1. En las aplicaciones de editor y suscriptor , instale dos bibliotecas NuGet .

PM> Install-Package Autofac.Extensions.DependencyInjection
PM> Install-Package EventBus.RabbitMQ.Standard


2. En las aplicaciones de editor y suscriptor , agregue la configuración a appsettings.json .

{
  "RabbitMq": {
    "BrokerName": "test_broker",
    "AutofacScopeName": "test_autofac",
    "QueueName": "test_queue",
    "RetryCount": "5",
    "VirtualHost": "your_virtual_host",
    "Username": "your_username",
    "Password": "your_password",
    "Host": "your_host",
    "DispatchConsumersAsync": true
  }
}

Estas configuraciones están disponibles en CoudAMQP . Alternativamente, puede usar RabbitMQ localmente ( imagen Docker ).

3. En las aplicaciones de editor y suscriptor , cree una clase para el evento que se publicará y procesará posteriormente.

public class ItemCreatedIntegrationEvent : IntegrationEvent
{
    public string Title { get; set; }
    public string Description { get; set; }

    public ItemCreatedIntegrationEvent(string title, string description)
    {
        Title = title;
        Description = description;
    }
}


4. En la aplicación de suscriptor , cree una clase para el controlador de eventos ItemCreatedIntegrationEvent .

public class ItemCreatedIntegrationEventHandler : IIntegrationEventHandler<ItemCreatedIntegrationEvent>
{
    public ItemCreatedIntegrationEventHandler()
    {
    }

    public async Task Handle(ItemCreatedIntegrationEvent @event)
    {
        //Handle the ItemCreatedIntegrationEvent event here.
    }
}


5. En las aplicaciones de editor y suscriptor , actualice Program.cs para agregar una línea.

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .UseServiceProviderFactory(new AutofacServiceProviderFactory()) //Add this line.
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}


6. En la aplicación del editor , actualice el método ConfigureServices en Startup.cs .

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        ...

        var rabbitMqOptions = Configuration.GetSection("RabbitMq").Get<RabbitMqOptions>();

        services.AddRabbitMqConnection(rabbitMqOptions);
        services.AddRabbitMqRegistration(rabbitMqOptions);

        ...
    }
}


7. En la aplicación de suscriptor , cree la extensión EventBusExtension .

public static class EventBusExtension
{
    public static IEnumerable<IIntegrationEventHandler> GetHandlers()
    {
        return new List<IIntegrationEventHandler>
        {
            new ItemCreatedIntegrationEventHandler()
        };
    }

    public static IApplicationBuilder SubscribeToEvents(this IApplicationBuilder app)
    {
        var eventBus = app.ApplicationServices.GetRequiredService<IEventBus>();

        eventBus.Subscribe<ItemCreatedIntegrationEvent, ItemCreatedIntegrationEventHandler>();

        return app;
    }
}


8. En la aplicación de suscriptor , actualice los servicios ConfigureServices y Configure en Startup.cs .

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        ...

        var rabbitMqOptions = Configuration.GetSection("RabbitMq").Get<RabbitMqOptions>();

        services.AddRabbitMqConnection(rabbitMqOptions);
        services.AddRabbitMqRegistration(rabbitMqOptions);
        services.AddEventBusHandling(EventBusExtension.GetHandlers());

        ...
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        ...

        app.UseAuthorization();

        ...
    }
}


9. Para demostrar y simplificar, puede crear un controlador en la aplicación del editor con el método en el que se publica el evento.

public class ItemController : ControllerBase
{
    private readonly IEventBus _eventBus;

    public ItemController(IEventBus eventBus)
    {
        _eventBus = eventBus;
    }

    [HttpPost]
    public IActionResult Publish()
    {
        var message = new ItemCreatedIntegrationEvent("Item title", "Item description");

        _eventBus.Publish(message);

        return Ok();
    }
}


10. Ahora puede publicar ItemCreatedIntegrationEvent. Inicie ambas aplicaciones, llame al método POST Publish en suscriptor y maneje el evento en suscriptor .

Referencias


Source: https://habr.com/ru/post/undefined/


All Articles