Profundidad: un artículo para comprender el uso de Ribbon y el análisis de los principios básicos

1. ¿Qué es la cinta?

Spring Cloud Ribbon es un conjunto de herramientas de equilibrio de carga del lado del cliente implementadas basadas en Netflix Ribbon. El
componente de cliente Ribbon proporciona una serie de configuraciones completas, como tiempo de espera, reintento, etc.
Todas las instancias de máquina proporcionadas por el servicio se obtienen a través de Load Balancer (LB) , y Ribbon llamará automáticamente a estos servicios según determinadas reglas (sondeo, aleatorio).
Ribbon también puede implementar nuestro propio algoritmo de equilibrio de carga.

1.1 ¿Qué es el equilibrio de carga del cliente?

El LB en el proceso es una biblioteca de clases integrada en el consumidor, y la dirección del proveedor se obtiene a través del consumidor.
En la vida: Al igual que cuando vas a la estación de tren para hacer cola (hay tres pasillos), siempre que seas una persona normal, harás cola para el equipo menos concurrido
.
En el programa: Nuestro consumidor puede obtener una lista de direcciones de proveedores de servicios y luego obtener una dirección para
llamar de acuerdo con una estrategia determinada .

1.2 ¿Qué es el equilibrio de carga del lado del servidor?

En la vida: Al igual que cuando vas a la estación de tren para hacer cola, un guía de la estación de tren te dice que hay
pocas personas en el tercer canal y tú vas al tercer canal para hacer fila.

En el programa: es la dirección de ng a la que llama su consumidor, y ng elige el reenvío de la solicitud (peso de sondeo, ip_hash, etc.)

2. Integre rápidamente Ribbon

Introducir dependencias

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring‐cloud‐starter‐netflix‐eureka‐client</artifactId>
 </dependency>
 <!‐‐添加ribbon的依赖, eureka client启动器已经依赖了ribbon,可以不配‐‐>
 <dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring‐cloud‐starter‐netflix‐ribbon</artifactId>
 </dependency>

Agregar anotación @LoadBalanced

 @Bean
 @LoadBalanced
 public RestTemplate restTemplate() {
    
    
  return new RestTemplate();
 }

3. Principio básico de la cinta

3.1 Proceso de llamada de cinta

3.2 Estrategia de equilibrio de carga de la cinta

  1. RandomRule: seleccione un servidor al azar.

  2. RetryRule: para el mecanismo de reintento en la máquina de estrategia de equilibrio de carga seleccionada, cuando la selección del
    servidor no es exitosa dentro de un período de tiempo de configuración , siempre intentará usar el método subRule para seleccionar un servidor disponible.

  3. RoundRobinRule: Selección de sondeo, índice de sondeo, seleccione el servidor correspondiente al índice.

  4. AvailabilityFilteringRule: filtre los
    servidores backend marcados como circuito disparado que no se han podido conectar y filtre los servidores backend de alta concurrencia o use un AvailabilityPredicate
    para incluir la lógica de filtrado del servidor. De hecho, es para verificar el funcionamiento de cada servidor registrado en el estado.

  5. BestAvailableRule: seleccione un servidor con la solicitud concurrente más pequeña y examine los servidores uno por uno.
    Si el servidor se dispara, omítalo.

  6. WeightedResponseTimeRule: Ponderado según el tiempo de respuesta, cuanto mayor sea el tiempo de respuesta y
    menor el peso , menor será la probabilidad de ser seleccionado.

  7. ZoneAvoidanceRule: el servidor se selecciona para aumentar el rendimiento del área donde se encuentra el servidor y la disponibilidad del
    servidor.

3.2.1 Modificar la política de equilibrio de carga predeterminada

 @Configuration
 public class AppConfig {
    
    

  @Bean
  @LoadBalanced
  public RestTemplate restTemplate() {
    
    
  return new RestTemplate();
  }
  @Bean
  public IRule myRule() {
    
    
  return new RandomRule();
  }
 }

3.2.2 Estrategia de equilibrio de carga personalizada

1) Algoritmo de carga personalizado

public class MyRandomRule extends AbstractLoadBalancerRule {
    
    

  /** 总共被调用的次数,目前要求每台被调用5次 */
  private int total = 0;
  /** 当前提供服务的机器号 */
  private int currentIndex = 0;

  public Server choose(ILoadBalancer lb, Object key) {
    
    
  if (lb == null) {
    
    
  return null;
  }
  Server server = null;

  while (server == null) {
    
    
  if (Thread.interrupted()) {
    
    
  return null;
  }
  //激活可用的服务
  List<Server> upList = lb.getReachableServers();
  //所有的服务
  List<Server> allList = lb.getAllServers();

  int serverCount = allList.size();
  if (serverCount == 0) {
    
    
  return null;
  }

  if (total < 5) {
    
    
  server = upList.get(currentIndex);
  total++;
  } else {
    
    
  total = 0;
  currentIndex++;
  if (currentIndex >= upList.size()) {
    
    
  currentIndex = 0;
    }
  }
  if (server == null) {
    
    
  Thread.yield();
  continue;
  }

  if (server.isAlive()) {
    
    
  return (server);
  }

  // Shouldn't actually happen.. but must be transient or a bug.
  server = null;
  Thread.yield();
  }
  return server;
  }

  @Override
  public Server choose(Object key) {
    
    
  return choose(getLoadBalancer(), key);
  }

  @Override
  public void initWithNiwsConfig(IClientConfig clientConfig) {
    
    
    }
 }

2) Defina la clase de configuración fuera del paquete escaneado por el programa principal de SpringBoot

 @Configuration
 public class MySelfRule {
    
    
 @Bean
  public IRule myRule(){
    
    
  return new MyRandomRule();
  }
 }

Nota: La estrategia de equilibrio de carga personalizada no se puede escribir en
el lugar escaneado por la anotación @CompentScan de @SpringbootApplication , de lo contrario, la clase de configuración personalizada será compartida por todos los RibbonClients.

3) Use @RibbonClient para especificar la estrategia de equilibrio de carga, agregue @RibbonClient al programa principal SpringBoot para importar
la clase de configuración

 @SpringBootApplication
 @RibbonClient(name = "service‐order",configuration = MySelfRule.class)
 public class ServiceMemberApplication {
    
    }

3.3 Interfaces relacionadas con Ribbon
Referencia: org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration
IClientConfig: Configuración del cliente de Ribbon, que está implementada por DefaultClientConfigImpl por defecto.

IRule: La estrategia de equilibrio de carga de Ribbon se implementa de forma predeterminada mediante ZoneAvoidanceRule. Esta estrategia puede
seleccionar la mejor instancia de zona para el acceso en un entorno multizona .

IPing: estrategia de verificación de instancias de Ribbon, implementada por DummyPing por defecto. Esta estrategia de verificación es una
implementación especial . De hecho, no verifica si la instancia está disponible, pero siempre devuelve verdadero. De manera predeterminada, todas las instancias de servicio se consideran
disponibles.

ServerList: el mecanismo de mantenimiento de la lista de instancias de servicio, que está implementado por ConfigurationBasedServerList de forma predeterminada.

ServerListFilter: Mecanismo de filtrado de listas de instancias de servicio, ZonePreferenceServerListFilter se adopta de forma predeterminada. Esta
estrategia puede filtrar preferentemente instancias de servicio en la misma región que el solicitante.

ILoadBalancer: balanceador de carga, implementado por ZoneAwareLoadBalancer de forma predeterminada, tiene la capacidad de reconocimiento de la región
.
Modifique la configuración:

 # 使用<clientName>.ribbon.<key>=<value>的形式进行配置
 # 参考org.springframework.cloud.netflix.ribbon.PropertiesFactory
 # PingUrl: Get http://192.168.3.1:8010/
 # 指定IPing
 service‐order.ribbon.NFLoadBalancerPingClassName=\
  com.netflix.loadbalancer.PingUrl
 # 指定IRule
 service‐order.ribbon.NFLoadBalancerRuleClassName=\
  com.netflix.loadbalancer.RandomRule

4 Análisis del código fuente de la cinta


(Los amigos que necesitan la imagen original pueden seguir mi cuenta pública de WeChat: entrada: Ribbon)

Este artículo se comparte con amigos que necesitan entrevistar y repasar preguntas, y le deseo todo lo mejor para obtener la oferta que desea. Esta información incluye principalmente conceptos básicos de Java, estructuras de datos, jvm, multiproceso, etc. Debido al espacio limitado, sólo una pequeña parte se muestra a continuación. Preguntas de la entrevista, amigos que necesitan la versión completa pueden hacer clic en un enlace para saltar y recibir, enlace: haga clic aquí para descargar gratis, obtener código: CSDN

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_41770757/article/details/110552363
Recomendado
Clasificación