.NET Core + RabbitMQ

Ao desenvolver microsserviços, surge a questão de fornecer informações de um serviço para outros, à medida que ocorrem eventos. É importante ter um sistema sem vincular o remetente aos destinatários. Nesse caso, o padrão Publisher-Subscriber é usado.

Existem muitos produtos de mensagens no mercado que suportam o padrão Publisher-Subscriber, como o Azure Service Bus, o RabbitMQ ou o Apache Kafka.

Recentemente, publiquei duas bibliotecas NuGet para uma configuração rápida e conveniente da comunicação baseada em eventos usando o Azure Service Bus e o RabbitMQ. Este breve artigo de instruções descreve as etapas para usar o último.

Fonte


O Publisher é um aplicativo .NET Core que atua como remetente.
O Assinante é um aplicativo .NET Core que atua como um destinatário.

Como


1. Nos aplicativos de editor e assinante , instale duas bibliotecas NuGet .

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


2. Nos aplicativos de editor e assinante , adicione a configuração ao 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
  }
}

Essas configurações estão disponíveis no CoudAMQP . Como alternativa, você pode usar o RabbitMQ localmente ( imagem do Docker ).

3. Nos aplicativos do editor e do assinante , crie uma classe para o evento que será publicado e subsequentemente processado.

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. No aplicativo de assinante , crie uma classe para o manipulador de eventos ItemCreatedIntegrationEvent .

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

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


5. Nos aplicativos de editor e assinante , atualize Program.cs para adicionar uma linha.

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. No aplicativo do editor , atualize o método ConfigureServices em Startup.cs .

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

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

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

        ...
    }
}


7. No aplicativo de assinante , crie a extensão 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. No assinante aplicação, actualizar os ConfigureServices e Configurar métodos em 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 demonstração e simplicidade, você pode criar um controlador no aplicativo publisher com o método no qual o evento é publicado.

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. Agora você pode publicar ItemCreatedIntegrationEvent. Inicie os dois aplicativos, chame o método POST Publish no assinante e manipule o evento no assinante .

Referências


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


All Articles