.NET Core + RabbitMQ

Saat mengembangkan layanan microsoft, muncul pertanyaan tentang penyediaan informasi dari satu layanan ke layanan lain ketika ada peristiwa yang terjadi. Penting untuk memiliki sistem tanpa mengikat pengirim ke penerima. Dalam hal ini, pola Penerbit-Pelanggan digunakan.

Ada banyak produk perpesanan di pasar yang mendukung pola Penerbit-Pelanggan, seperti Azure Service Bus, RabbitMQ, atau Apache Kafka.

Baru-baru ini, saya menerbitkan dua perpustakaan NuGet untuk pengaturan cepat dan nyaman komunikasi berbasis acara menggunakan Azure Service Bus dan RabbitMQ. Artikel singkat cara menjelaskan langkah-langkah untuk menggunakan yang terakhir.

Sumber


Publisher adalah aplikasi .NET Core yang bertindak sebagai pengirim.
Pelanggan adalah aplikasi .NET Core yang bertindak sebagai penerima.

Bagaimana caranya


1. Dalam aplikasi penerbit dan pelanggan , instal dua perpustakaan NuGet .

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


2. Dalam aplikasi penerbit dan pelanggan , tambahkan konfigurasi ke 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
  }
}

Pengaturan ini tersedia di CoudAMQP . Atau, Anda dapat menggunakan RabbitMQ secara lokal ( gambar Docker ).

3. Dalam aplikasi penerbit dan pelanggan , buat kelas untuk acara yang akan diterbitkan dan selanjutnya diproses.

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. Dalam aplikasi pelanggan , buat kelas untuk pengendali event ItemCreatedIntegrationEvent .

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

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


5. Dalam aplikasi penerbit dan pelanggan , perbarui Program.cs untuk menambahkan satu baris.

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. Dalam aplikasi penerbit , perbarui metode ConfigureServices di Startup.cs .

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

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

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

        ...
    }
}


7. Dalam aplikasi pelanggan , buat ekstensi 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. Dalam aplikasi pelanggan , perbarui metode ConfigureServices dan Configure di 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. Untuk peragaan dan kesederhanaan, Anda dapat membuat pengontrol dalam aplikasi penerbit dengan metode penerbitan acara tersebut.

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. Sekarang Anda dapat mempublikasikan ItemCreatedIntegrationEvent. Luncurkan kedua aplikasi, panggil metode POST Publish di pelanggan dan tangani event di pelanggan .

Referensi


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


All Articles