Características Avanzadas de Dubbo: Gobernanza del Servicio

Wang Youzhi , un pescador de oro mutuo que comparte la tecnología de Java,
se une al grupo de personas de Java que corren con cubos : personas de Java que son ricas juntas.

En el artículo anterior , integramos Dubbo en la aplicación Spring Boot y registramos un proveedor de servicios y un consumidor de servicios. Por supuesto, las aplicaciones en el entorno de producción a menudo implementan múltiples nodos para garantizar una alta disponibilidad de los servicios, entonces, ¿cómo configurar la estrategia de equilibrio de carga de Dubbo?

Tomemos esto como un punto de entrada para introducir la configuración y el uso de las funciones avanzadas proporcionadas por Dubbo en el gobierno del servicio . Dubbo admite 6 fuentes de configuración de forma predeterminada:

  • Propiedades del sistema JVM, parámetro JVM -D

  • Entorno del sistema, la variable de entorno del proceso JVM

  • Configuración externalizada, configuración externalizada, lectura desde el centro de configuración

  • Configuración de la aplicación, la configuración de atributos de la aplicación, extrae el conjunto de atributos que comienza con "dubbo" del entorno de la aplicación Spring.

  • La configuración recopilada por la interfaz de programación, como API // anotación, puede entenderse como una especie de fuente de configuración, que es un método de recopilación de configuración directamente orientado a la programación del usuario.

  • Lea el archivo de configuración dubbo.properties de classpath

En el contenido de hoy, solo cubriremos los tres métodos de configuración comunes de configuración de la aplicación, XML y anotaciones .

Sugerencias : este artículo es el contenido básico, se centra en la configuración y el uso , y no implica ningún principio de implementación ni principio de algoritmo.

balanceo de carga

En microservicios, el equilibrio de carga se refiere a la distribución "razonable" de solicitudes entre diferentes nodos del servicio, para optimizar el uso de recursos, proporcionar un alto rendimiento y reducir el tiempo de respuesta. Dubbo 3.X proporciona 7 estrategias de equilibrio de carga:

algoritmo característica valor de configuración asignación predeterminada ilustrar
Equilibrio de carga aleatorio ponderado aleatorio ponderado aleatorio El algoritmo predeterminado , el peso predeterminado es el mismo
Equilibrio de carga por turnos turno rotativo ponderado todos contra todos No Basado en el algoritmo round-robin ponderado suave de Nginx, el peso predeterminado es el mismo,
Balance de carga menos activo Prioridad menos activa + Aleatorio ponderado menos activo No Detrás está la idea de que los que pueden hacer más trabajo
Equilibrio de carga de respuesta más corta Respuesta más corta primero + aleatorio ponderado respuesta corta No Presta más atención a la capacidad de respuesta
Equilibrio de carga de Hash consistente hash consistente hachís consistente No Parámetros de entrada determinados, proveedor determinado, adecuado para solicitudes con estado
Equilibrio de carga P2C Poder de dos opciones p2c No Después de seleccionar aleatoriamente dos nodos, continúe seleccionando el nodo con el "número de conexiones" más pequeño.
Equilibrio de carga adaptativo Equilibrio de carga adaptativo adaptado No Con base en el algoritmo P2C, seleccione el nodo con la carga más pequeña entre los dos

Dubbo admite la configuración de políticas de balanceo de carga tanto para el proveedor de servicios como para el consumidor del servicio. Cuando ambos están configurados con políticas de balanceo de carga, prevalecerá la política de balanceo de carga del consumidor del servicio.

Primero, veamos el método de configuración del archivo XML. A través del archivo XML, puede configurar la estrategia de equilibrio de carga para la interfaz y el método.DubboDemoService Primero , configure la estrategia de equilibrio de carga para la interfaz del proveedor de servicios :

<dubbo:service interface="com.wyz.api.DubboDemoService" ref="dubboDemoServiceImpl" loadbalance="roundrobin"/>

DubboDemoService#sayLuego configuramos la estrategia de equilibrio de carga para el consumidor del servicio al llamar al método:

<dubbo:reference id="DubboDemoService" interface="com.wyz.api.DubboDemoService">
  <dubbo:method name="say" loadbalance="roundrobin"/>
</dubbo:reference>

Luego usamos el archivo de la aplicación para configurar la estrategia de balanceo de carga, a través del archivo de la aplicación podemos configurar la estrategia de balanceo de carga global de la aplicación Dubbo , el contenido es el siguiente:

dubbo:
  provider:
    loadbalance: roundrobin
  consumer:
    loadbalance: roundrobin

Finalmente , configure la estrategia de equilibrio de carga en forma de anotaciones. Puede configurar la configuración de la estrategia de equilibrio de carga para la interfaz y el método . El código es el siguiente:

@DubboService(loadbalance = "roundrobin")
public class DubboDemoServiceImpl implements DubboDemoService {
  
  @Override
  @DubboService(loadbalance = "leastactive")
  public String say(String message) {
    return "DubboProvider  say : " + message;
  }
}

tolerancia a fallas del clúster

Después de configurar la estrategia de equilibrio de carga, el programa se ha estado ejecutando de manera estable. Pero, de repente, un día, un nodo en el clúster no está disponible. Cuando la solicitud "llega" al nodo no disponible, ¿cómo lo manejará Dubbo?

Dubbo proporciona la capacidad de tolerancia a fallas de clúster e implementa 9 soluciones para fallas de nodo en el clúster:

Estrategia valor de configuración asignación predeterminada característica Escenario de aplicación
Clúster de conmutación conmutación por error Cambio automático en falla, cuando ocurre una falla, vuelva a intentarlo con otros servidores Normalmente se utiliza para operaciones de lectura, se puede configurar el número de reintentos
Clúster a prueba de fallas Fallar rapido No Falla rápido, informa el error inmediatamente después de la falla Generalmente se usa para operaciones de escritura no idempotentes
Clúster a prueba de fallas a prueba de fallos No A prueba de fallas, cuando ocurre una excepción, simplemente ignórala Usualmente se usa para escribir registros de auditoría
Clúster de conmutación por recuperación conmutación por recuperación No Recupérese automáticamente de las fallas, registre las solicitudes fallidas en segundo plano y vuelva a enviarlas a intervalos regulares Por lo general, se utiliza para la notificación de mensajes
Clúster de bifurcación bifurcación No Llame a varios servidores en paralelo y regrese siempre que uno tenga éxito Por lo general, se utiliza para operaciones de lectura con altos requisitos de tiempo real.
Clúster de difusión transmisión No Transmita llamadas a todos los proveedores, uno por uno, si alguno informa un error, informará un error actualización de caché
Clúster disponible disponible No Llame a la instancia disponible actualmente (solo se llama a una), si no hay ninguna instancia disponible actualmente, inicie una excepción Escenarios que no requieren equilibrio de carga
Clúster fusionable fusionable No Agregue los resultados de la llamada en el clúster y devuelva los resultados, generalmente se usa junto con el grupo /
Clúster ZoneAware / No Escenario de suscripción de varios registros, equilibrio de carga entre clústeres de registro /

La forma del archivo XML aún proporciona una configuración de política tolerante a fallas de clúster en el nivel de interfaz y método de interfaz :

<dubbo:service interface="com.wyz.api.DubboDemoService" ref="dubboDemoServiceImpl" cluster="failover" retries="2"/>

Entre ellos retriesestá el parámetro de la política de Failover Cluster, que establece el número de reintentos de la interfaz (excluyendo el número de llamadas normales) Por ejemplo, en la configuración anterior, después de que falla la llamada normal, se llamará dos veces como máximo. La política de tolerancia a errores del clúster en el nivel del método de configuración XML es coherente con la política de equilibrio de carga de configuración, por lo que no entraré en detalles aquí.

La política de tolerancia a fallas del clúster global se puede configurar en el archivo de la aplicación , de la siguiente manera:

dubbo:
  provider:
    cluster: failover
    retries: 2

Finalmente, el método de configuración de anotaciones todavía se usa para @DubboServiceconfigurar la estrategia de tolerancia a fallas del clúster a nivel de interfaz y método de interfaz.El código es el siguiente:

@DubboService(cluster = "failover", retries = 2)
public class DubboDemoServiceImpl implements DubboDemoService {
  
  @Override
  @DubboService(cluster = "failover", retries = 2)
  public String say(String message) {
    return "DubboProviderXML  say : " + message;
  }
}

degradación del servicio

La función de degradación del servicio proporcionada por Dubbo en sí es relativamente simple y solo proporciona la función simulada. Si desea experimentar funciones como limitación de corriente y fusión con funciones completas, puede usar componentes técnicos profesionales compatibles con Dubbo como Sentinel, Hystrix y Resiliencia4j. Dado que la función de degradación del servicio de Dubbo es relativamente simple, aquí solo necesitamos comprender la configuración de la función de degradación del servicio a través de tres métodos de configuración de archivos XML.

Método de configuración uno

<dubbo:service interface="com.wyz.api.DubboDemoService" ref="dubboDemoServiceImpl"  mock="true"/>

MockEn esta forma de configuración, es necesario tener una clase de implementación con el nombre de clase + sufijo bajo el mismo paquete , por ejemplo: DubboDemoServiceMock.

public class DubboDemoServiceMock implements DubboDemoService {
  @Override
  public String say(String message) {
    return "服务出错了!";
  }
}

Método de configuración dos

Configurado a través del nombre completo de la clase Mock:

<dubbo:service interface="com.wyz.api.DubboDemoService" ref="dubboDemoServiceImpl"  mock="com.wyz.api.DubboDemoServiceMock"/>

Método de configuración tres

Utilice la expresión definida por Dubbo: mock="[fail|force]return|throw xxx".

  • [fail|force], el valor predeterminado es fail, lo que significa que después de que falla la llamada, o aplicar directamente el método simulado sin llamar al método;

  • return xxx, lo que significa devolver el resultado especificado, que debe ajustarse al tipo de devolución de la interfaz;

  • throw xxx, lo que indica que se lanza la excepción especificada.

Pongamos algunos ejemplos:

<dubbo:service interface="com.wyz.api.DubboDemoService" ref="dubboDemoServiceImpl"  mock="return fail"/>
<dubbo:service interface="com.wyz.api.DubboDemoService" ref="dubboDemoServiceImpl"  mock="force:return false"/>
<dubbo:service interface="com.wyz.api.DubboDemoService" ref="dubboDemoServiceImpl"  mock="fail:throw java.lang.NullPointException"/>

grupo de servicio

Se permite distinguir diferentes implementaciones de la misma interfaz mediante agrupación. Por ejemplo: agregue dos implementaciones diferentes DubboXMLServiceImpl y NewDubboXMLServiceImpl para la interfaz DubboXMLService.

public interface DubboXMLService {
  String say(String message);
}

public class DubboXMLServiceImpl implements DubboXMLService {
  @Override
  public String say(String message) {
    return "DubboProviderXML say : " + message;
  }
}

public class NewDubboXMLServiceImpl implements DubboXMLService {
  @Override
  public String say(String message) {
    return "NewDubboProviderXML say : " + message;
  }
}

Lo primero es configurar el proveedor de servicios a través del archivo XML:

<bean id="dubboXMLServiceImpl" class="com.wyz.service.impl.DubboXMLServiceImpl"/>
<dubbo:service interface="com.wyz.api.DubboXMLService" ref="dubboXMLServiceImpl" group="XML-Provider"/>

<bean id="newDubboXMLServiceImpl" class="com.wyz.service.impl.NewDubboXMLServiceImpl"/>
<dubbo:service interface="com.wyz.api.DubboXMLService" ref="newDubboXMLServiceImpl" group="New-XML-Provider"/>

A continuación, observe la configuración del consumidor del servicio:

<dubbo:reference id="dubboXMLService" interface="com.wyz.api.DubboXMLService" group="XML-Provider"/>
<dubbo:reference id="newDubboXMLService" interface="com.wyz.api.DubboXMLService" group="New-XML-Provider"/>

Además es muy sencillo de utilizar, puedes @Autowiredinyectar directamente servicios de diferentes grupos mediante:

public class DubboConsumerXMLService implements CommandLineRunner {
  
  @Autowired
  DubboXMLService dubboXMLService;
  
  @Autowired
  DubboXMLService newDubboXMLService;
  
  @Override
  public void run(String... args) {
    String message = dubboXMLService.say("wyz");
    System.out.println(message);
    
    String newMessage = newDubboXMLService.say("wyz");
    System.out.println(newMessage);
  }
}

Veamos cómo configurar mediante anotaciones:

@DubboService(group = "Annotation-Provider")
public class DubboAnnotationServiceImpl implements DubboAnnotationService {
  @Override
  public String say(String message) {
    return "DubboProviderAnnotation say : " + message;
  }
}

@DubboService(group = "New-Annotation-Provider")
public class NewDubboAnnotationServiceImpl implements DubboAnnotationService {
  @Override
  public String say(String message) {
    return "NewDubboProviderAnnotation say : " + message;
  }
}

Finalmente, los servicios de diferentes grupos se usan a través de anotaciones. Tenga en cuenta que @DubboReferenceaquí se usa el Bean inyectado:

@Component
public class DubboConsumerAnnotationService implements CommandLineRunner {
  
  @DubboReference(group = "Annotation-Provider")
  DubboAnnotationService dubboAnnotationService;
  
  @DubboReference(group = "New-Annotation-Provider")
  DubboAnnotationService newDubboAnnotationService;
  
  @Override
  public void run(String... args) {
    String message = dubboAnnotationService.say("wyz-Annotation");
    System.out.println(message);
    
    String newMessage = newDubboAnnotationService.say("wyz-Annotation");
    System.out.println(newMessage);
  }
}

Consejos : no se recomienda configurar a través del archivo de la aplicación.

versión de servicio

En Dubbo, una interfaz no puede determinar un servicio de forma única, solo una interfaz clara + grupo + número de versión puede determinar un servicio de forma única , por ejemplo:

<dubbo:service interface="com.wyz.api.DubboXMLService" ref="dubboXMLServiceImpl" group="XML-Provider" version="1.0.0"/>

Las diferentes versiones de los servicios son comunes en el escenario de verificación de lanzamiento de versión. Algunos nodos en el clúster actualizan los servicios y cambian una pequeña cantidad de tráfico. Una vez que la verificación es exitosa, los nodos se actualizan a gran escala, lo que puede reducir los riesgos que conlleva. por actualizaciones de servicio .

La configuración y el uso de la versión del servicio es el mismo que el del grupo de servicios, y aquí solo se muestra la configuración del archivo XML:

<bean id="dubboXMLServiceImpl" class="com.wyz.service.impl.DubboXMLServiceImpl"/>
<dubbo:service interface="com.wyz.api.DubboXMLService" ref="dubboXMLServiceImpl" version="1.0.0"/>

La configuración del archivo XML del consumidor del servicio:

<dubbo:reference id="dubboXMLService" interface="com.wyz.api.DubboXMLService" version="1.0.0"/>

El método de configuración del archivo XML se puede usar directamente @Autowiredpara inyectar diferentes versiones del servicio, por lo que no entraremos en detalles aquí.


Hoy, entendemos y aprendemos cómo configurar y utilizar las capacidades de gobierno de servicios proporcionadas por Dubbo.

Además de las capacidades de gobernanza de servicios mencionadas anteriormente, Dubbo también proporciona capacidades de enrutamiento de servicios.Antes de Dubbo 2.7, las <dubbo:route>reglas de enrutamiento se podían configurar a través de etiquetas, pero después de Dubbo 2.7, se eliminó la etiqueta oficial y <dubbo:route>se introdujo un conjunto de registros dependientes. El nuevo mecanismo de configuración de enrutamiento del centro y el centro de configuración será seguido por un artículo adicional, que migrará el centro de registro a Nacos y aprenderá a configurar las reglas de enrutamiento.

Si este artículo es útil para usted, por favor felicítelo y apóyelo. Si hay algún error en el artículo, por favor critique y corrija. Finalmente, invite a todos a prestar atención a Wang Youzhi, un pescador , ¡y hasta la próxima!

Supongo que te gusta

Origin blog.csdn.net/wyz_1945/article/details/131668938
Recomendado
Clasificación