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)
{
}
}
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())
.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