Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Sugerencia
Este contenido es un extracto del libro electrónico, ".NET Microservices Architecture for Containerized .NET Applications" (Arquitectura de microservicios de .NET para aplicaciones de .NET contenedorizadas), disponible en Documentación de .NET o como un PDF descargable y gratuito que se puede leer sin conexión.
Deberíamos empezar diciendo que si crea el bus de eventos personalizado basado en RabbitMQ que se ejecuta en un contenedor, como hace la aplicación eShopOnContainers, solo debe usarse para los entornos de desarrollo y prueba. No lo use para el entorno de producción, a menos que lo cree como parte de un bus de servicio listo para producción, tal como se describe en la sección Recursos adicionales que aparece a continuación. Un bus de eventos personalizado simple podría carecer de muchas características críticas preparadas para producción que tiene un bus de servicios comerciales.
Una de las implementaciones personalizadas de Event Bus en eShopOnContainers es básicamente una biblioteca que usa la API RabbitMQ. (Hay otra implementación basada en Azure Service Bus).
La implementación del bus de eventos con RabbitMQ permite a los microservicios suscribirse a eventos, publicar eventos y recibir eventos, como se muestra en la figura 6-21.
Figura 6-21. Implementación de RabbitMQ de un bus de eventos
RabbitMQ funciona como intermediario entre el publicador de mensajes y los suscriptores, para controlar la distribución. En el código, la clase EventBusRabbitMQ implementa la interfaz IEventBus genérica. Esta implementación se basa en la inserción de dependencias para que pueda cambiar de esta versión de desarrollo/prueba a una versión de producción.
public class EventBusRabbitMQ : IEventBus, IDisposable
{
// Implementation using RabbitMQ API
//...
}
La implementación de RabbitMQ de un ejemplo de bus de eventos de desarrollo/prueba es código estándar. Tiene que controlar la conexión con el servidor RabbitMQ y proporcionar código para publicar un evento de mensaje a las colas. También tiene que implementar un diccionario de colecciones de controladores de eventos de integración para cada tipo de evento; estos tipos de eventos pueden tener una instanciación diferente y suscripciones diferentes para cada microservicio receptor, como se muestra en la figura 6-21.
Implementación de un método de publicación simple con RabbitMQ
El código siguiente es una versión simplificada de una implementación de bus de eventos para RabbitMQ, para mostrar todo el escenario. Lo cierto es que este no es el modo de controlar la conexión. Para ver la implementación completa, consulte el código real en el repositorio dotnet-architecture/eShopOnContainers .
public class EventBusRabbitMQ : IEventBus, IDisposable
{
// Member objects and other methods ...
// ...
public void Publish(IntegrationEvent @event)
{
var eventName = @event.GetType().Name;
var factory = new ConnectionFactory() { HostName = _connectionString };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare(exchange: _brokerName,
type: "direct");
string message = JsonConvert.SerializeObject(@event);
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: _brokerName,
routingKey: eventName,
basicProperties: null,
body: body);
}
}
}
El código real del método Publish en la aplicación eShopOnContainers se mejora mediante una directiva de reintento de Polly , que vuelve a intentar la tarea algunas veces en caso de que el contenedor RabbitMQ no esté listo. Este escenario puede producirse cuando docker-compose inicia los contenedores; Por ejemplo, el contenedor RabbitMQ podría iniciarse más lentamente que los demás contenedores.
Como se mencionó anteriormente, hay muchas configuraciones posibles en RabbitMQ, por lo que este código solo se debe usar para entornos de desarrollo y pruebas.
Implementación del código de suscripción con rabbitMQ API
Al igual que con el código de publicación, el código siguiente es una simplificación de parte de la implementación del bus de eventos para RabbitMQ. De nuevo, normalmente no es necesario cambiarlo a menos que quieras mejorarlo.
public class EventBusRabbitMQ : IEventBus, IDisposable
{
// Member objects and other methods ...
// ...
public void Subscribe<T, TH>()
where T : IntegrationEvent
where TH : IIntegrationEventHandler<T>
{
var eventName = _subsManager.GetEventKey<T>();
var containsKey = _subsManager.HasSubscriptionsForEvent(eventName);
if (!containsKey)
{
if (!_persistentConnection.IsConnected)
{
_persistentConnection.TryConnect();
}
using (var channel = _persistentConnection.CreateModel())
{
channel.QueueBind(queue: _queueName,
exchange: BROKER_NAME,
routingKey: eventName);
}
}
_subsManager.AddSubscription<T, TH>();
}
}
Cada tipo de evento tiene un canal relacionado para obtener eventos de RabbitMQ. A continuación, puede tener tantos controladores de eventos por canal como tipo de evento según sea necesario.
El método Subscribe acepta un objeto IIntegrationEventHandler, que es como un método de devolución de llamada en el microservicio actual, además de su objeto IntegrationEvent relacionado. A continuación, el código agrega ese controlador de eventos a la lista de controladores de eventos que cada tipo de evento de integración puede tener por microservicio de cliente. Si el código de cliente aún no se ha suscrito al evento, el código crea un canal para el tipo de evento para que pueda recibir eventos en un estilo push de RabbitMQ cuando se publique el evento desde cualquier otro servicio.
Como se mencionó anteriormente, el bus de eventos implementado en eShopOnContainers solo tiene un propósito educativo, ya que solo controla los escenarios principales, por lo que no está listo para producción.
Para escenarios de producción, compruebe los recursos adicionales siguientes, específicos de RabbitMQ y la sección Implementación de la comunicación basada en eventos entre microservicios .
Recursos adicionales
Una solución lista para producción compatible con RabbitMQ.
Peregrine Connect : simplifica la integración con un diseño, implementación y administración eficientes de aplicaciones, API y flujos de trabajo
https://www.peregrineconnect.com/why-peregrine/rabbitmq-integrationNServiceBus : bus de servicio comercial totalmente compatible con herramientas avanzadas de administración y supervisión para .NET
https://particular.net/EasyNetQ : cliente de API de .NET de código abierto para RabbitMQ
https://easynetq.com/MassTransit : marco de aplicaciones distribuidas de código abierto gratis para .NET
https://masstransit-project.com/Rebus : Bus de servicio .NET de código abierto
https://github.com/rebus-org/Rebus