Мы написали оболочку, которую мы используем в наших микросервисах и приложениях, чтобы абстрагировать детали реализации RabbitMQ. Одной из ключевых вещей, которые он обрабатывает, является отслеживание подписанных событий и связанных с ними обработчиков. Таким образом, приложение может определить / внедрить класс обработчика, и он автоматически вызывается всякий раз, когда приходит соответствующее сообщение.
Для нас мы рассматриваем фактическую реализацию обмена сообщениями как сквозную задачу, поэтому мы упаковываем и используем ее (Пакет Nuget), как и любой другой, это совершенно отдельный проект от всего остального. На самом деле это также общедоступный пакет Nuget, не стесняйтесь играть с ним, если хотите (хотя он недостаточно хорошо документирован).
Вот краткий пример того, как работает наш, чтобы вы могли увидеть уровень интеграции:
В Startup.cs
using MeshIntegrationBus.RabbitMQ;
public class Startup
{
public RabbitMqConfig GetRabbitMqConfig()
{
ExchangeType exchangeType = (ExchangeType)Enum.Parse(typeof(ExchangeType),
Configuration["RabbitMQ:IntegrationEventExchangeType"], true);
var rabbitMqConfig = new RabbitMqConfig
{
ExchangeName = Configuration["RabbitMQ:IntegrationEventExchangeName"],
ExchangeType = exchangeType,
HostName = Configuration["RabbitMQ:HostName"],
VirtualHost = Configuration["RabbitMQ:VirtualHost"],
UserName = Configuration["RabbitMQ:UserName"],
Password = Configuration["RabbitMQ:Password"],
ClientProviderName = Configuration["RabbitMQ:ClientProviderName"],
Port = Convert.ToInt32(Configuration["RabbitMQ:Port"])
}
return rabbitMqConfig
}
public void ConfigureServices(IServicecollection services)
{
services.Add.... // All your stuff
// If this service will also publish events, add that Service as well (scoped!)
services.AddScoped<IMeshEventPublisher, RabbitMqEventPublisher>(s =>
new RabbitMqEventPublisher(rabbitConfig));
// Since this service will be a singleton, wait until the end to actually add it
// to the servicecollection - otherwise BuildServiceProvider would duplicate it
RabbitMqListener rabbitMqListener = new RabbitMqListener(rabbitConfig,
services.BuildServiceProvider());
var nodeEventSubs = Configuration.GetSection(
$"RabbitMQ:SubscribedEventIds:ServiceA").Get<string[]>();
// Attach our list of events to a handler
// Handler must implement IMeshEventProcessor and does have
// access to the IServiceProvider so can use DI
rabbitMqListener.Subscribe<ServiceAEventProcessor>(nodeEventSubs);
services.AddSingleton(rabbitMqListener);
}
}
Вот и все, что нужно сделать. Вы можете добавить несколько обработчиков для каждого подписанного события и / или повторно использовать один и тот же обработчик (и) для нескольких событий. Он оказался довольно гибким и надежным - мы используем его уже пару лет - и его достаточно легко менять / обновлять по мере необходимости и позволять отдельным службам вносить изменения, когда они хотят / нуждаются.