Ribbon
Introducción
Ribbon
EstáNetflix
liberada proyecto de código abierto, la función principal es proporcionar la carga de software de cliente algoritmo de equilibrio se basaHTTP
yTCP
balanceo de carga del lado del cliente herramientaspringCloud
ParaRibbon
hacer un segundo paquete, nos permite utilizar laRestTemplate
solicitud de servicio, convertida automáticamente a las llamadas de servicio de balanceo de carga del cliente.Ribbon
Admite una variedad de algoritmos de equilibrio de carga y también admite algoritmos de equilibrio de carga personalizadosRibbon
Es solo un marco de herramientas, relativamente pequeñospringCloud
y muy conveniente de usar después de empaquetado. NoAPI
necesita implementarse de forma independiente como el registro de servicio, el centro de configuración y la puerta de enlace.Ribbon
Solo necesita usarse directamente en el código.
Equilibrio de carga del lado del servidor
El equilibrio de carga es uno de nuestros métodos importantes para lidiar con la alta concurrencia, aliviar la presión de la red y expandir la capacidad del servidor, pero en general, lo que llamamos equilibrio de carga generalmente se refiere al equilibrio de carga del lado del servidor, y el equilibrio de carga del lado del servidor se divide en dos tipos. Uno es el equilibrio de carga de hardware y el otro es el equilibrio de carga de software
- El equilibrio de carga de hardware se realiza principalmente mediante la instalación de equipos de equilibrio de carga dedicados frente a los nodos del servidor, como:
F5
- El equilibrio de carga de software consiste principalmente en instalar algún software con función de equilibrio de carga en el servidor para completar la distribución de solicitudes y lograr el equilibrio de carga, como por ejemplo:
LVS 、 Nginx 、Haproxy
Ya sea equilibrio de carga de hardware o equilibrio de carga de software, su principio de funcionamiento no es más que la siguiente imagen
Equilibrio de carga del cliente
La aparición de microservicios proporciona otra forma de pensar para la realización del equilibrio de carga: la función de equilibrio de carga está integrada en el consumidor de servicios en forma de biblioteca, en lugar de ser proporcionada de forma centralizada por un dispositivo de equilibrio de carga especificado. Esta solución se denomina equilibrio de carga suave o equilibrio de carga del cliente. Común como: springCloud
enRibbon
Ribbon
Se basa HTTP
y TCP
el balanceador de carga del cliente, cuando lo haremos Ribbon
, y Eureka
cuando se use en conjunto, Ribbon
irá al Eureka
registro para obtener la lista de servidores, y luego alcanzará el acceso de sondeo al rol de balanceo de carga, el mecanismo de latido del balanceo de carga del cliente también debe ir Mantener la validez de la lista de servidores. Por supuesto, este proceso debe completarse con el registro de servicios.
En el springCloud
medio, Ribbon
principalmente relacionado con RestTemplate
el objeto y el uso conjunto, Ribbon
automatizará el RestTemplate
objeto de configuración , @LoadBalanced
abrirá RestTemplate
el equilibrio de carga cuando el objeto de llamada
Equilibrio de carga del servidor Equilibrio de VS
carga del cliente
- Equilibrio de carga del lado del servidor: el cliente primero envía la solicitud al servidor de equilibrio de carga, y luego el servidor de equilibrio de carga utiliza el algoritmo de equilibrio de carga para seleccionar uno de los muchos servidores disponibles para procesar la solicitud
- Equilibrio de carga del cliente: el cliente mantiene una lista de direcciones de servidor disponibles. Antes de enviar la solicitud, primero selecciona un servidor que se utilizará para procesar la solicitud a través del algoritmo de equilibrio de carga, y luego envía directamente la solicitud al servidor.
Ribbon
Ejemplo de implementación del equilibrio de carga del cliente
Controller
Capa de proveedor de servicios
@RestController
@RequestMapping("/api/v1/msg")
public class MessageController {
@Value("${server.port}")
private String port;
@GetMapping("/get")
public String getMsg() {
return "This message is sent from port: " + port;
}
}
Los consumidores de servicios introducen dependencias
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
Integración de servicios al consumidor RestTemplate
yRibbon
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
Utilice Ribbon
el equilibrio de carga del cliente
método uno
Clase para comenzar a spring
inyectar un recipiente con @LoadBalanced
anotaciones RestTemplate
debean
@SpringBootApplication
@EnableEurekaClient
public class MessageCenterApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(MessageCenterApplication.class, args);
}
}
@RestController
@RequestMapping("/api/v1/center")
public class MessageCenterController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/msg/get")
public Object getMsg() {
String msg = restTemplate.getForObject("http://message-service/api/v1/msg/get", String.class);
return msg;
}
}
Camino dos
Uso directo de la LoadBalancerClient
política de equilibrio de carga para obtener la dirección de servicio disponible y luego solicitar
@RestController
@RequestMapping("/api/v1/center")
public class MessageCenterController {
@Autowired
private LoadBalancerClient loadBalancer;
@GetMapping("/msg/get")
public Object getMsg() {
ServiceInstance instance = loadBalancer.choose("message-service");
URI url = URI.create(String.format("http://%s:%s/api/v1/msg/get", instance.getHost(), instance.getPort()));
RestTemplate restTemplate = new RestTemplate();
String msg = restTemplate.getForObject(url, String.class);
return msg;
}
}
Una vez iniciada la aplicación, la dirección se solicita tres veces seguidas http://localhost:8781/api/v1/center/msg/get
y el resultado devuelto se muestra en la figura
Ribbon
Estrategia de equilibrio de carga
Estrategia | nombre | descripción |
---|---|---|
RandomRule | Estrategia aleatoria | Seleccionar servidor al azar |
RoundRobinRegla | Estrategia de sondeo | Seleccione el servidor en orden (la estrategia predeterminada de la cinta) |
RetryRule | Reintentar estrategia | En un período de configuración, cuando la selección del servidor no es exitosa, intente seleccionar un servidor disponible todo el tiempo |
BestAvailableRule | Estrategia de simultaneidad mínima | Verifique los servidores uno por uno, si el disyuntor del servidor está abierto, ignórelo y luego seleccione el servidor con el enlace concurrente más bajo |
AvailabilityFilteringRule | Estrategias de filtrado disponibles | Filtre los servidores que han fallado y están marcados como circuito disparado, y filtre aquellos servidores con altas conexiones concurrentes (las conexiones activas exceden el umbral configurado) |
ResponseTimeWeightedRule | Estrategia ponderada por tiempo de respuesta | El peso se asigna según el tiempo de respuesta del servidor, cuanto mayor es el tiempo de respuesta, menor es el peso y menor la probabilidad de ser seleccionado. Cuanto menor sea el tiempo de respuesta, mayor será el peso y mayor la probabilidad de ser seleccionado. Esta estrategia es muy adecuada. Combina varios factores, como: red, disco, io, etc., que inciden directamente en el tiempo de respuesta. |
Regla de evitación de zona | Estrategia de ponderación regional | Juzgue exhaustivamente el rendimiento del área donde se encuentra el servidor y la disponibilidad del servidor, realice una encuesta para seleccionar el servidor y determine si el rendimiento operativo de una zona de AWS está disponible y elimine todos los servidores de la zona no disponible. |
Ribbon
Volver a intentar la configuración del mecanismo
ribbon
Lograr el equilibrio de carga, si A
se activa el acceso a un servicio después del tiempo de espera del nodo, ribbon
mecanismo de reintento
全局设置
ribbon:
ReadTimeout: 6000
ConnectTimeout: 6000
OkToRetryOnAllOperations: true
MaxAutoRetries: 1
MaxAutoRetriesNextServer: 2
局部服务设置
service-id: # 服务ID
ribbon:
ConnectTimeout: 6000 # 毫秒 连接超时时间
ReadTimeout: 6000 # 毫秒 逻辑处理超时时间
OkToRetryOnAllOperations: true # 是否对所有操作都进行重试
MaxAutoRetries: 1 # 对当前实例的最大重试次数(请求服务超时6s则会再请求一次)
MaxAutoRetriesNextServer: 1 # 切换实例的最大重试次数(如果还失败就切换下个实例访问,切换一次)
Ribbon
Proceso de trabajo
Primero: descubrimiento de servicios
Usado para obtener la lista de direcciones: cuando nosotros Ribbon
y Eureka
cuando se usen juntos, Ribbon
iremos al Eureka
registro para obtener la lista de instancias del servicio del servidor . Puede ser estático (proporcione un conjunto de direcciones fijas) o dinámico (consulte la lista de direcciones regularmente desde el registro)
Segundo: selección de servicios
Regla de selección de servicio: de acuerdo con la política especificada por el usuario, seleccione una dirección de lista de su lista de instancias. Lo que Ribbon
proporciona una serie de estrategias, como sondeo, aleatorio, ponderado de acuerdo con el tiempo de respuesta y similares. Después de obtener una dirección de lista de servicio específica, Feign
complete la llamada de servicio al
Tercero: monitoreo del servicio
Eso es para eliminar las instancias de servicio no válidas en cualquier momento.