.NET Core + RabbitMQ

Bei der Entwicklung von Microservices stellt sich die Frage, ob Informationen von einem Dienst zu anderen Diensten bereitgestellt werden sollen, sobald Ereignisse eintreten. Es ist wichtig, ein System zu haben, ohne den Absender an die Empfänger zu binden. In diesem Fall wird das Publisher-Subscriber-Muster verwendet.

Es gibt viele Messaging-Produkte auf dem Markt, die das Publisher-Subscriber-Muster unterstützen, z. B. Azure Service Bus, RabbitMQ oder Apache Kafka.

Kürzlich habe ich zwei NuGet-Bibliotheken veröffentlicht, mit denen die ereignisbasierte Kommunikation mit Azure Service Bus und RabbitMQ schnell und bequem eingerichtet werden kann. Dieser kurze Artikel beschreibt die Schritte zur Verwendung des letzteren.

Quelle


Publisher ist eine .NET Core-Anwendung, die als Absender fungiert.
Abonnent ist eine .NET Core-Anwendung, die als Empfänger fungiert.

Wie man


1. Installieren Sie in Publisher- und Abonnentenanwendungen zwei NuGet- Bibliotheken.

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


2. Fügen Sie in Publisher- und Abonnentenanwendungen die Konfiguration zu appsettings.json hinzu .

{
  "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
  }
}

Diese Einstellungen sind in CoudAMQP verfügbar . Alternativ können Sie RabbitMQ lokal verwenden ( Docker-Image ).

3. Erstellen Sie in Publisher- und Abonnentenanwendungen eine Klasse für das Ereignis, das veröffentlicht und anschließend verarbeitet wird.

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. Erstellen Sie in der Abonnentenanwendung eine Klasse für den ItemCreatedIntegrationEvent- Ereignishandler .

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

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


5. Aktualisieren Sie in Publisher- und Abonnentenanwendungen Program.cs , um eine Zeile hinzuzufügen.

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. Aktualisieren Sie in der Publisher- Anwendung die ConfigureServices- Methode in Startup.cs .

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

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

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

        ...
    }
}


7. Erstellen Sie in der Abonnentenanwendung die EventBusExtension- Erweiterung .

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. Aktualisieren Sie in der Abonnentenanwendung die Methoden ConfigureServices und Configure in 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. Zur Demonstration und Vereinfachung können Sie in der Publisher- Anwendung einen Controller mit der Methode erstellen, mit der das Ereignis veröffentlicht wird.

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. Jetzt können Sie ItemCreatedIntegrationEvent veröffentlichen. Starten Sie beide Anwendungen, rufen Sie die POST-Veröffentlichungsmethode im Abonnenten auf und behandeln Sie das Ereignis im Abonnenten .

Verweise


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


All Articles