Spring Cloud Stream binder arquitectura análisis y desarrollo
De acuerdo con los diferentes escenarios de uso, generalmente elegimos el middleware de mensajería apropiado. Por ejemplo, podemos elegir usar Kafka para el escenario de recopilación de registros y, por lo general, elegir RocketMQ para el escenario de pedidos. Los diferentes clientes de middleware de mensajería son diferentes y debemos apuntar El middleware de mensajes diferente escribe códigos diferentes. Para los productos TOC, podemos elegir el middleware de mensajes apropiado de acuerdo con el escenario comercial, pero para los productos TOB, diferentes clientes tienen diferentes requisitos para el middleware de mensajes, necesitamos cambiar el middleware de mensajes convenientemente y no necesitamos refactorizar el código.
Spring Cloud Stream puede ayudarnos a resolver muy bien los problemas anteriores. Desacoplar el middleware de mensajes específicos a través de Binder, proteger las diferencias en el uso de diferentes middleware de mensajes y proporcionar una configuración unificada y un método de uso basado en Binder Spring Cloud Stream para enviar y consumir mensajes. Para el usuario, solo necesita comprender cómo usar Spring Cloud Stream para enviar y recibir mensajes sin preocuparse por el tipo de middleware de mensajes utilizado. Binder debe ser responsable de cómo enviar y recibir mensajes y otras funciones avanzadas como transacciones, etc. sin comunicarse con el middleware de mensajes. Por lo tanto, podemos ver carpetas para middleware de mensajes inalcanzables, como spring-cloud-stream-binder-kafka, spring-cloud-stream-binder-rabbit, etc. También podemos desarrollar carpetas que satisfagan nuestras propias necesidades de acuerdo con las especificaciones, por ejemplo, los usuarios con una pequeña cantidad de mensajes pueden usar el middleware de mensajes basado en redis, y podemos desarrollar un Binder correspondiente para conectarse a Spring Cloud Stream. A continuación, presentaré la arquitectura de Binder y cómo desarrollar un Binder.
Introducción a la arquitectura Binder y análisis del código fuente
Desde la perspectiva del código fuente, veamos cómo Spring Cloud Stream interactúa con Binder y qué cosas específicas hace Binder.
Comienzo del proyecto
Cuando se inicia el proyecto, primero escaneará todos los archivadores dependientes del proyecto y almacenará la información del archivador en el objeto de memoria.Específicamente, se hacen las siguientes cosas:
-
Escanee META-INF/spring.binders para obtener el tipo de carpeta y la clase de carga de configuración correspondiente, que se utiliza para crear el objeto BinderTypeRegistry
-
Cree un BinderFactory basado en un BinderTypeRegistry. BinderFactory contiene información de carpetas e información de configuración relacionada con Spring Cloud Steam configurado en el archivo de escaneo yaml
Enviar un mensaje
Una vez que se inicia el proyecto, el trabajo preparatorio se ha completado.Desde la perspectiva del proceso de envío de mensajes, si Spring Cloud Stream coopera con Binder, el envío de mensajes se completa.
BinderFactory obtiene la instancia del enlazador
Al iniciar el proyecto, colocamos toda la información del enlazador en BinderFactory, por lo que el primer paso para enviar un mensaje es crear una instancia de enlazador de acuerdo con la información del enlazador y completar el trabajo inicial del enlazador.
Cargue la clase de configuración del enlazador
Spring Cloud Stream carga la clase de configuración correspondiente al archivador a través del método initializeBinderContextSimple de DefaultBinderFactory y crea el
objeto de contexto AnnotationConfigApplicationContext
Después de cargar la clase de configuración correspondiente al archivador, se activará la inicialización del archivador
- Inicializar la clase de configuración de Binder, inicializar la clase de configuración de Binding
- Inicializar el proveedor de destino del enlazador
- Inicializar el enlazador de canales
Obtener una instancia de enlazador
La instancia del enlazador se puede obtener a través del objeto de contexto creado en el paso anterior, y la instancia del enlazador obtenida se almacena en caché en la memoria.
Use un enlazador para enlazar el canal de salida a un middleware de mensaje específico
El canal de salida es el concepto de Spring Cloud Stream. Necesitamos asociar el canal de salida con un cliente específico para enviar mensajes, y la instancia del enlazador tiene un método para construir un cliente para enviar mensajes. Por lo tanto, este paso necesita crear un cliente de envío de mensajes específico y asociarlo con el canal de salida, los detalles son los siguientes:
- Obtenga información de configuración extendida del productor y fusione con las propiedades del productor Spring Cloud Stream
- Obtener proveedor de destino de envío del productor
- Cree una instancia de mensaje de envío y complete la inicialización del objeto de mensaje de envío
- Vincular el canal de salida a la instancia del mensaje de envío
- Cree un enlace y guárdelo en caché en el canal de envío para operaciones posteriores, como desvincular
enviar mensaje a través del canal de envío
Después de completar el enlace del canal de envío y el cliente de envío específico, se puede enviar el mensaje.En el siguiente método, se utilizará el cliente del middleware de mensaje específico para completar el envío del mensaje.
Resumir
A través del análisis del código fuente anterior, podemos ver claramente que Spring Cloud Stream proporciona a los usuarios una gestión unificada del envío de mensajes, el consumo de mensajes y los parámetros de configuración. Sin embargo, cuando se ejecutan realmente el envío y el consumo, lo hacen la instancia del productor y la instancia del consumidor creadas por el enlazador. Estas instancias de productor e instancias de consumidor creadas por el enlazador están asociadas con un middleware de mensajes específico, por lo que diferentes middleware de mensajes corresponderán a diferentes enlazadores. El archivador sirve como puente entre Spring Cloud Steam y el middleware de mensajes específicos.
ejemplo de desarrollo
Lo siguiente explicará específicamente cómo escribimos nuestra propia carpeta
crear spring.binders
Cree resources/META-INF/spring.binders, especifique el tipo de carpeta y la clase de configuración correspondiente
Crear una clase de configuración
La clase de configuración necesita escanear nuestras clases de atributos extendidos, incluida la clase de parámetro de configuración del enlazador, la clase de parámetro de configuración de Enlace, el objeto de proveedor de destino registrado y el objeto de enlazador del canal de mensajes.
Clase de parámetro de enlace
La clase de parámetro binder se utiliza para almacenar información relacionada con conexiones de middleware de mensajes específicos, como dirección, nombre de usuario, contraseña, puerto y otra información.
Enlace de clase de configuración de atributos extendidos
Esto incluye las propiedades de configuración del productor y las propiedades de configuración del consumidor. Los parámetros especiales necesarios para enviar y consumir se pueden colocar aquí. Por ejemplo, al usar redis como middleware de mensajes, necesitamos especificar la cantidad de bases de datos para enviar y consumir, por lo que debemos
colocar este parámetro en la clase de configuración de producción y consumo.
-
Cree RedisMQExtendedBindingProperties y herede AbstractExtendedBindingProperties para especificar clases de atributos de consumo, clases de atributos de envío de mensajes y clases de atributos de enlace.
-
Crear clase de configuración de mensajes de consumo de RedisMQConsumerProperties
-
Crear RedisMQProducerProperties que envía la clase de configuración de mensajes
-
Para crear una clase de configuración de RedisMQBindingProperties, debe implementar BinderSpecificPropertiesProvider. Los atributos son tanto la clase de atributo del mensaje de consumo como la clase de atributo del mensaje de envío.
proveedor
Una vez procesados los parámetros, necesitamos crear un proveedor. El proveedor registra los temas y particiones que necesitamos para enviar o consumir mensajes. Los proveedores deben implementar ProvisioningProvider
carpeta de canales de mensajes
El enlazador de canales de mensajes debe proporcionar Clases para crear instancias de mensajes de envío, instancias de mensajes de consumo, obtener clases de atributos de productores extendidos, clases de atributos de consumidores extendidos y clases de atributos de enlace. Heredar AbstractMessageChannelBinder para implementar ExtendedPropertiesBinder
Implementación del productor de hormigón
La clase de implementación del productor específico completará el trabajo de inicialización de la conexión de mensajes específicos, el envío de mensajes específicos y otras operaciones. Necesita heredar AbstractMessageHandler para implementar Lifecycle
Implementación de consumidores concretos
Para completar el consumo de mensajes específicos y detener el consumo de mensajes, debe heredar MessageProducerSupport