.NET Core + RabbitMQ

Lors du développement de microservices, la question se pose de fournir des informations d'un service à d'autres services à mesure que surviennent des événements. Il est important d'avoir un système sans lier l'expéditeur aux destinataires. Dans ce cas, le modèle Publisher-Subscriber est utilisé.

Il existe de nombreux produits de messagerie sur le marché qui prennent en charge le modèle Publisher-Subscriber, tels que Azure Service Bus, RabbitMQ ou Apache Kafka.

Récemment, j'ai publié deux bibliothèques NuGet pour une configuration rapide et pratique de la communication basée sur les événements à l'aide d'Azure Service Bus et de RabbitMQ. Ce court article pratique décrit les étapes d'utilisation de ce dernier.

La source


Publisher est une application .NET Core qui agit comme expéditeur.
L'abonné est une application .NET Core qui agit en tant que destinataire.

Comment


1. Dans les applications éditeur et abonné , installez deux bibliothèques NuGet .

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


2. Dans les applications éditeur et abonné , ajoutez la configuration à 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
  }
}

Ces paramètres sont disponibles sur CoudAMQP . Alternativement, vous pouvez utiliser RabbitMQ localement ( image Docker ).

3. Dans les applications éditeur et abonné , créez une classe pour l'événement qui sera publiée et traitée par la suite.

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. Dans l' application d' abonné , créez une classe pour le gestionnaire d' événements ItemCreatedIntegrationEvent .

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

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


5. Dans les applications éditeur et abonné , mettez à jour Program.cs pour ajouter une ligne.

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. Dans l' application éditeur , mettez à jour la méthode ConfigureServices dans Startup.cs .

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

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

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

        ...
    }
}


7. Dans l' application d' abonné , créez l'extension 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. Dans l' application d' abonné , mettez à jour les méthodes ConfigureServices et Configure dans 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. Pour la démonstration et la simplicité, vous pouvez créer un contrôleur dans l' application d' éditeur avec la méthode de publication de l'événement.

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. Vous pouvez maintenant publier ItemCreatedIntegrationEvent. Lancez les deux applications, appelez la méthode POST Publish dans l' abonné et gérez l'événement dans l' abonné .

Références


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


All Articles