.NET Core + RabbitMQ

рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдХрд░рддреЗ рд╕рдордп, рдХрд┐рд╕реА рднреА рдШрдЯрдирд╛ рдХреЗ рд╣реЛрдиреЗ рдкрд░ рдПрдХ рд╕реЗрд╡рд╛ рд╕реЗ рджреВрд╕рд░реА рд╕реЗрд╡рд╛рдУрдВ рддрдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдкрд░ рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИред рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░реЗрд╖рдХ рдХреЛ рдмрд╛рдВрдзрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╕рд┐рд╕реНрдЯрдо рд╣реЛрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдкреНрд░рдХрд╛рд╢рдХ-рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдмрд╛рдЬрд╛рд░ рдкрд░ рдХрдИ рдореИрд╕реЗрдЬрд┐рдВрдЧ рдЙрддреНрдкрд╛рдж рд╣реИрдВ рдЬреЛ рдкреНрд░рдХрд╛рд╢рдХ-рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдкреИрдЯрд░реНрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ Azure Service Bus, RabbitMQ, рдпрд╛ Apache Kafkaред

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореИрдВрдиреЗ Azure Service Bus рдФрд░ RabbitMQ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╡реЗрдВрдЯ-рдЖрдзрд╛рд░рд┐рдд рд╕рдВрдЪрд╛рд░ рдХреЗ рддреНрд╡рд░рд┐рдд рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕реЗрдЯрдЕрдк рдХреЗ рд▓рд┐рдП рджреЛ NuGet рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ред рдпрд╣ рдЫреЛрдЯрд╛-рд╕реЗ-рд▓реЗрдЦ рдХреИрд╕реЗ рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЪрд░рдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред

рд╕реНрд░реЛрдд


рдкреНрд░рдХрд╛рд╢рдХ рдПрдХ .NET рдХреЛрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ рдЬреЛ рдкреНрд░реЗрд╖рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдПрдХ .NET рдХреЛрд░ рдПрдкреНрд▓реАрдХреЗрд╢рди рд╣реИ рдЬреЛ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред

рдХреИрд╕реЗ


1. рдкреНрд░рдХрд╛рд╢рдХ рдФрд░ рдЧреНрд░рд╛рд╣рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ, рджреЛ NuGet рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ ред

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


2. рдкреНрд░рдХрд╛рд╢рдХ рдФрд░ рдЧреНрд░рд╛рд╣рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ, 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
  }
}

рдпреЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ CoudAMQP рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ ред рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдк рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ RabbitMQ ( Docker image ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред

3. рдкреНрд░рдХрд╛рд╢рдХ рдФрд░ рдЧреНрд░рд╛рд╣рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ, рдЙрд╕ рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдХреНрд╖рд╛ рдмрдирд╛рдПрдВ рдЬреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдФрд░ рдмрд╛рдж рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХреА рдЬрд╛рдПрдЧреАред

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. рдЧреНрд░рд╛рд╣рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ, ItemCreatedIntegrationEvent рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ ред

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

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


5. рдкреНрд░рдХрд╛рд╢рдХ рдФрд░ рдЧреНрд░рд╛рд╣рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ, рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП Program.cs рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ ред

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. рдкреНрд░рдХрд╛рд╢рдХ рдЖрд╡реЗрджрди рдореЗрдВ, Startup.cs рдореЗрдВ ConfigureServices рд╡рд┐рдзрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ ред

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

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

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

        ...
    }
}


7. рдЧреНрд░рд╛рд╣рдХ рдЖрд╡реЗрджрди рдореЗрдВ, 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. рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ ред

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. рдкреНрд░рджрд░реНрд╢рди рдФрд░ рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП, рдЖрдк рдкреНрд░рдХрд╛рд╢рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЙрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдШрдЯрдирд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реЛрддреА рд╣реИред

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. рдЕрдм рдЖрдк ItemCreatedIntegrationEvent рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджреЛрдиреЛрдВ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ, рдлреЛрди рдкреЛрд╕реНрдЯ рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╡рд┐рдзрд┐ рдЧреНрд░рд╛рд╣рдХ рдФрд░ рдореЗрдВ рдШрдЯрдирд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рдЧреНрд░рд╛рд╣рдХ ред

рд╕рдВрджрд░реНрдн


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


All Articles