Seguimiento de la fuente de la cinta

1. ¿Qué es Ribbon?

Ribbon es un equilibrador de carga lanzado por Netflix, que ayuda a controlar el comportamiento de los clientes HTTP y TCP. Después de configurar la dirección del proveedor de servicios para Ribbon, Ribbon puede ayudar automáticamente a los consumidores del servicio a realizar solicitudes basadas en un determinado algoritmo de equilibrio de carga. Ribbon nos proporciona muchos algoritmos de equilibrio de carga de forma predeterminada, como sondeo, aleatorio, etc. Por supuesto, también podemos implementar algoritmos de equilibrio de carga personalizados para Ribbon.

En Spring Cloud, cuando Ribbon se usa junto con Nacos, Ribbon puede obtener automáticamente una lista de direcciones de proveedores de servicios de Nacos Server y solicitar una de las instancias de proveedores de servicios según el algoritmo de equilibrio de carga. Muestra la arquitectura cuando se usa Ribbon junto con Nacos.
Inserte la descripción de la imagen aquí

2. Seguimiento del código fuente

¿Por qué podemos serviceacceder a él solo ingresando el nombre? Antes de obtener la ip y el puerto. Obviamente, alguien nos ayudó a obtener la ip y el puerto de la instancia del servicio según el nombre del servicio. Es LoadBalancerInterceptor
nuestro seguimiento de código fuente:
Inserte la descripción de la imagen aquí
continúe siguiendo el método de ejecución: encontró que se ha obtenido el servicio del puerto 8001

org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient

Inserte la descripción de la imagen aquí
Si sigue la próxima vez, encontrará 8002

2. Estrategia de equilibrio de carga

La estrategia de equilibrio de carga predeterminada de Ribbon es un sondeo simple, podemos probarlo:

Escribe la clase de prueba. En el código fuente de hace un momento, vemos que la intercepción se usa RibbonLoadBalanceClientpara el equilibrio de carga. Uno de los choosemétodos se presenta así:
Inserte la descripción de la imagen aquí
Ahora este es el método para el equilibrio de carga para obtener instancias. Inyectamos objetos de esta clase y luego los probamos:

package com.bruceliu.test;

import com.bruceliu.SpringcloudDemoConsumerApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * @author bruceliu
 * @create 2019-05-04 11:33
 * @description 负载均衡算法测试
 */
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringcloudDemoConsumerApplication.class)
public class LoadBalanceTest {
    
    

    @Autowired
    RibbonLoadBalancerClient client;

    @Test
    public void test1(){
    
    
        for (int i = 0; i <10 ; i++) {
    
    
            ServiceInstance instance = this.client.choose("SPRINGCLOUD-DEMO-SERVICE");
            System.out.println(instance.getHost() + ":" + instance.getPort());
        }
    }
}

Resultado de la operación: Se
Inserte la descripción de la imagen aquí
ajusta a nuestra especulación esperada, de hecho es un método de sondeo .

¿Podemos modificar la estrategia de equilibrio de carga? Continúe rastreando el código fuente y encuentre ese fragmento de código:
Inserte la descripción de la imagen aquí
Veamos quién es esta regla:
Inserte la descripción de la imagen aquí
el valor predeterminado de la regla aquí es uno RoundRobinRule, vea la introducción de la clase:
Inserte la descripción de la imagen aquí
este es el significado de la encuesta.

Notamos que esta clase realmente implementa la interfaz IRule. Compruébelo usted mismo:
Inserte la descripción de la imagen aquí
Defina una interfaz de reglas para el equilibrio de carga.
Tiene las siguientes implementaciones:
Inserte la descripción de la imagen aquí
SpringBoot también nos proporciona una entrada de configuración para modificar las reglas de equilibrio de carga:

SPRINGCLOUD-DEMO-SERVICE:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

El formato es :, el {服务名称}.ribbon.NFLoadBalancerRuleClassNamevalor es la clase de implementación de IRule.
Probado de nuevo y descubrió que el resultado se volvió aleatorio:
Inserte la descripción de la imagen aquí

2.1 Componente principal de Ribbon IRule (preguntas de la entrevista)

Inserte la descripción de la imagen aquí

Nombre de la estrategia El nombre de la clase correspondiente a la estrategia. Principio de realización
Estrategia de sondeo (predeterminado) RoundRobinRegla La estrategia de sondeo significa eliminar un proveedor en orden cada vez, por ejemplo, hay 5 proveedores en total, el primero es el primero, el segundo es el segundo, el tercero es el tercero, y así sucesivamente.
Estrategia de encuesta ponderada WeightedResponseTimeRule 1. Asignar una ponderación según el tiempo de respuesta de cada proveedor, cuanto mayor sea el tiempo de respuesta y menor sea la ponderación, menor será la probabilidad de ser seleccionado. 2. Principio: Al principio, es una estrategia de sondeo y se pone en marcha un cronómetro. El tiempo medio de respuesta de cada proveedor se recopila cada 30 segundos. Cuando la información es suficiente, a cada proveedor se le asigna una ponderación y al proveedor se selecciona aleatoriamente de acuerdo con el peso. Se seleccionará un proveedor con un peso más alto y un peso más alto con una alta probabilidad.
Estrategia aleatoria RandomRule Seleccione al azar un proveedor de la lista de proveedores
Estrategia de simultaneidad mínima BestAvailableRule Seleccione el proveedor con el menor número de solicitudes simultáneas solicitadas, a menos que el proveedor esté en la fusión.
Mecanismo de reintento basado en la "estrategia de equilibrio de carga seleccionada" RetryRule 1. La estrategia de "estrategia de equilibrio de carga seleccionada" es la regla de operación por turnos. 2. La estrategia de reintento primero establece un período de tiempo límite. Si el proveedor no se puede seleccionar dentro de este período de tiempo límite, siempre intentará utilizar la selección " "estrategia. Establezca la estrategia de equilibrio de carga: estrategia de sondeo" y, finalmente, seleccione un proveedor disponible
Estrategia sensible a la usabilidad AvailabilityFilteringRule Hay dos tipos de proveedores con un rendimiento de filtrado deficiente: el primer tipo: filtra los proveedores que no han podido conectarse en eureka, y el segundo tipo: filtra los proveedores con alta concurrencia.
Estrategia regional de sensibilidad Regla de evitación de zona 1. Utilice una región como una unidad para examinar la disponibilidad, descarte la región no disponible y seleccione el proveedor disponible de las regiones restantes. 2. Si una o más instancias en esta área de IP son inaccesibles o responden con lentitud, el área de IP se ser reducido El peso de otras ips en el seleccionado.

2.2. Modificar el algoritmo de acceso al servicio

Método 1 : modificar el código para reemplazar la estrategia de equilibrio de carga

Paso 1: Cree un nuevo paquete que no será escaneado por el componente @ComponentScan, como: com.rules

Paso 2: cree su propia clase de reglas de algoritmo de equilibrio de carga en este paquete

Paso 3: agregue un comentario sobre la clase de inicio principal: @RibbonClient

package com.rules;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RoundRobinRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @BelongsProject: MicroService
 * @BelongsPackage: com.rules
 * @CreateTime: 2020-11-18 16:50
 * @Description: TODO
 */
@Configuration
public class MyLoadBalanceRule {
    
    


    /**
     * @desc 自定义负载均衡规则,默认是轮询规则
     * @return
     */
    @Bean
    public IRule myRule(){
    
    
        //return new RandomRule(); // 改为随机算法规则
        return new RoundRobinRule(); // 轮询
    }

}




@EnableEurekaClient //开启客户端
@SpringBootApplication
@RibbonClient(name = "PRODUCT-SERVICE",configuration = MyLoadBalanceRule.class)
public class ProtalApp80 {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(ProtalApp80.class,args);
    }
}

Nota: Esta clase aquí no se puede configurar en el mismo directorio de nivel y subdirectorios de la clase de inicio SpringBoot, ¿por qué? Porque la configuración de Ribbon debe estar marcada con la anotación @Configuration y no puede ser escaneada por la anotación @Component o @SpringBootApplication (porque contiene @Component). Porque si es escaneado por @ComponetScan, hará que todos los RibbonClients compartan esta configuración.

Método 2 : modificar el archivo de configuración para reemplazar la estrategia de equilibrio de carga.
El segundo método es establecer la estrategia asignada en application.properties

springcloud-alibaba-provider:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

'springcloud-alibaba-provider' es el nombre del servicio llamado y los siguientes componentes son fijos.
Al mismo tiempo, comenta el contenido del método uno.

Supongo que te gusta

Origin blog.csdn.net/BruceLiu_code/article/details/114579991
Recomendado
Clasificación