clúster de proveedores y cinta de equilibrio de carga

clúster de proveedores y cinta de equilibrio de carga

Previous: Registro de Feign
Siguiente: Use zuul para construir una puerta de enlace de microservicios

clúster de proveedores.

Utilizo el segundo método de inicio. Modifique el archivo de configuración application.yml, o use-para separar los diferentes archivos en el archivo de la siguiente manera:

#当前项目启动端口
#server:
#  port: 8000
#连接数据库的信息
# generate-ddl: false 取消让它自动见数据库
# show-sql: true展示sql
spring:
  jpa:
    generate-ddl: false
    show-sql: true
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/cloud?useUnicode=true&characterEncoding=UTF-8&useSSL=true
    driver-class-name: com.mysql.jdbc.Driver
  #当前启动的名字
  profiles:
    active: provider2
#  application:
#    name: springcloud-provider
info:
  head: head
  body: body
  app:
    name: @project.artifactId@
    encoding: @project.build.sourceEncoding@
    java:
      source:  @java.version@
      target:  @java.version@
management:
  endpoints:
    web:
      exposure:
        #加载所有的端点,默认只加载了info、health
        include: '*'
  endpoint:
    health:
      show-details: always
      #可以关闭指定的端点
    shutdown:
      enabled: false
eureka:
  client:
    service-url:
      defaultZone: http://root:root@peer1:8761/eureka/,http://root:root@peer2:8762/eureka/
  instance:
    prefer-ip-address: true
#    virtual-host-name: provider
---
spring:
  profiles: provider1
  application:
    name: provider
server:
  port: 8000
---
spring:
  profiles: provider2
  application:
    name: provider
server:
  port: 8001

Después del inicio,
pruebe si el proveedor brinda servicios normalmente

http: // localhost: 8000 / user / 2
Inserte la descripción de la imagen aquí
http: // localhost: 8001 / user / 2
Inserte la descripción de la imagen aquí
está registrado en el componente de descubrimiento de servicios, como se muestra en la figura
Inserte la descripción de la imagen aquí

Cinta de equilibrio de carga

Venga una solicitud, asigne la solicitud al consumidor del servicio correspondiente para hacer una solicitud, juzgue qué proveedor para obtener los datos y devuelva los datos:
1 paquete jar, que se ha introducido en eureka-client.
Inserte la descripción de la imagen aquí
2 Agregue la anotación @LoadBalanced a restTemplate en la clase principal de inicio

@SpringBootApplication
@EnableEurekaClient
public class SpringcloudConsumerApplication {
    
    
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
    
    
        return new RestTemplate();
    }
    public static void main(String[] args) {
    
    
        SpringApplication.run(SpringcloudConsumerApplication.class, args);
    }

}

Modifique la ruta de acceso del consumidor. Una vez que el proveedor haya completado el clúster, el archivo de configuración ha cambiado. Solo se puede acceder a él a través del nombre de la aplicación del proveedor (también llamado serviceId), que es el del proveedor como se muestra en la figura:
Inserte la descripción de la imagen aquí
Modificar el UserController del consumidor El camino es el siguiente:

 @RequestMapping("/user/{id}")
    public User findUserById(@PathVariable("id") Integer id){
    
    
        //消费者,调用生产者
//        User user = restTemplate.getForObject(userServiceUrl+id,User.class);
        User user = restTemplate.getForObject("http://provider/"+id,User.class);
        return user;
    }

El consumidor de prueba visita al proveedor
Inserte la descripción de la imagen aquí
Cuatro veces de la siguiente manera: los dos proveedores llaman cada uno dos veces El
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
equilibrio de carga predeterminado es el sondeo (vacié la consola para mayor intuición). No es lo mismo que el aleatorio predeterminado de Dubbo.

Tipos de algoritmos de equilibrio de carga

El componente principal de Ribbon es IRule, que es la interfaz principal de todos los algoritmos de equilibrio de carga. Sus subclases son:

RoundRobinRule Sondeo

RandomRule RandomRule Random

AvailabilityFilteringRule primero filtrará los servicios que están en el estado de disparo del interruptor debido a múltiples fallas de acceso, así como los servicios cuya cantidad de conexiones simultáneas excede el umbral, y luego sondeará la lista de servicios restante.

Los pesos de WeightedResponseTimeRule se basan en el tiempo de respuesta promedio Calcule los pesos de todos los servicios, cuanto más rápido sea el tiempo de respuesta, mayor será el peso del servicio, mayor será la probabilidad de ser seleccionado. Al

principio , si la información estadística es insuficiente, se utiliza la estrategia de sondeo, y cuando la información es suficiente, se cambia a WeightedResponseTimeRule RetryRule Reintentar para obtener el servicio de acuerdo con la estrategia de sondeo primero, si la adquisición falla, reintentar dentro del tiempo especificado para obtener el servicio disponible

BestAvailableRule Select filter

Elimine el servicio que se encuentra en el estado de disparo del interruptor debido a múltiples fallas de acceso y luego seleccione un servicio con la menor concurrencia, ZoneAvoidanceRule, que cumpla con el rendimiento del área donde se encuentra el servidor y la disponibilidad del servidor.

Algoritmo de equilibrio de carga de configuración personalizada

Hay dos maneras

Uno, configuración JAVA

La configuración es sencilla

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

    /**自定义配置ribbon负载均衡算法
     * @return
     */
    @Bean
    public IRule myRule(){
    
    
//        return new RoundRobinRule();//轮询
        return new RandomRule();
//        return new RetryRule();//重试

//        return new BestAvailableRule();
    }

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

}

Los resultados de la entrada de la consola del proveedor (aleatorio) son los siguientes: He
visitado ocho veces y los
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
demás se enumeran uno por uno.
Puede seleccionar el algoritmo apropiado para requisitos comerciales específicos, por supuesto, puede escribir una clase de algoritmo basada en requisitos comerciales específicos.
Utilice archivos de configuración para implementar estrategias de equilibrio de carga

Dos, configuración de atributos

Agregue el archivo de configuración en el proyecto del consumidor

#指定负载均衡策略
springcloud-consumer:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule

prioridad de configuración de cinta: prioridad de configuración de cinta: configuración de propiedad> configuración de JAVA configuración de
Java configuración de
Inserte la descripción de la imagen aquí
propiedad
Inserte la descripción de la imagen aquí

Siga la votación de la siguiente manera:
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

La configuración de la cinta está casi completa.

Salida de registro

Utilice registros en la capa del controlador del proyecto del consumidor.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@RestController
public class UserController {
    
    
    private static final Logger logger = LoggerFactory.getLogger(User.class);
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    @Autowired
    private UserFeignClient userFeignClient;
    @Autowired
    private RestTemplate restTemplate;
    @Value("${user.userServiceUrl}")
    private String userServiceUrl;
    @RequestMapping("user/{id}")
    public User findById(@PathVariable("id") Integer id){
    
    
        return restTemplate.getForObject("http://provider/user/"+id, User.class);
//        return restTemplate.getForObject(userServiceUrl+id,User.class);
    }
    @GetMapping("/log")
    public void logUserInstance(){
    
    
        //虚拟主机名
        ServiceInstance serviceInstance = this.loadBalancerClient.choose("provider");
        this.logger.info("{}:{}:{}", serviceInstance.getInstanceId(),serviceInstance.getHost(),serviceInstance.getPort(),serviceInstance.getInstanceId());
    }
}

Prueba:
Inserte la descripción de la imagen aquí
cuando visite al proveedor, el proveedor imprimirá la dirección de host del puerto y así sucesivamente.
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_39095899/article/details/107460121
Recomendado
Clasificación