Spring Cloud Stream binder arquitectura análisis y desarrollo

Spring Cloud Stream binder arquitectura análisis y desarrollo

inserte la descripción de la imagen aquí
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

inserte la descripción de la imagen aquí
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
    inserte la descripción de la imagen aquí

  • 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
    inserte la descripción de la imagen aquí

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
inserte la descripción de la imagen aquí
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
    inserte la descripción de la imagen aquí
  • Inicializar el proveedor de destino del enlazador
    inserte la descripción de la imagen aquí
  • Inicializar el enlazador de canales
    inserte la descripción de la imagen aquí
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.
inserte la descripción de la imagen aquí

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
    inserte la descripción de la imagen aquí
    inserte la descripción de la imagen aquí
  • Obtener proveedor de destino de envío del productor
    inserte la descripción de la imagen aquí
    inserte la descripción de la imagen aquí
  • Cree una instancia de mensaje de envío y complete la inicialización del objeto de mensaje de envío
    inserte la descripción de la imagen aquí
    inserte la descripción de la imagen aquí
  • Vincular el canal de salida a la instancia del mensaje de envío
    inserte la descripción de la imagen aquí
  • Cree un enlace y guárdelo en caché en el canal de envío para operaciones posteriores, como desvincular
    inserte la descripción de la imagen aquí
    inserte la descripción de la imagen aquí

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.
inserte la descripción de la imagen aquí

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
inserte la descripción de la imagen aquí

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.
inserte la descripción de la imagen aquí

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.
inserte la descripción de la imagen aquí

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.
    inserte la descripción de la imagen aquí

  • Crear clase de configuración de mensajes de consumo de RedisMQConsumerProperties
    inserte la descripción de la imagen aquí

  • 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.
    inserte la descripción de la imagen aquí

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
inserte la descripción de la imagen aquí

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
inserte la descripción de la imagen aquí

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
inserte la descripción de la imagen aquí

Implementación de consumidores concretos

Para completar el consumo de mensajes específicos y detener el consumo de mensajes, debe heredar MessageProducerSupport
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/github_38730134/article/details/128041096
Recomendado
Clasificación