1: ¿Qué es la cinta?
Ribbon es un proyecto de código abierto lanzado por Netflix. Su función principal es proporcionar algoritmos de equilibrio de carga de software del lado del cliente para conectar los servicios de nivel medio de Netflix juntos. El componente del cliente de Ribbon proporciona una serie de elementos de configuración completos, como el tiempo de espera de conexión, el reintento, etc. En pocas palabras, es enumerar todas las máquinas detrás del equilibrador de carga (LB para abreviar) en el archivo de configuración. Ribbon lo ayudará automáticamente a conectar estas máquinas en función de ciertas reglas (como encuestas simples, conexión instantánea, etc.). También tenemos una manera muy fácil de implementar algoritmos de equilibrio de carga personalizados usando cinta.
Dos: clasificación del esquema LB
Actualmente, el esquema LB convencional se puede dividir en dos categorías: una es LB centralizada, es decir, utilizar instalaciones de LB independientes (puede ser hardware, como F5, o software, como Nginx) entre el consumidor de servicios y el proveedor, y la instalación es responsable de reenviar las solicitudes de acceso al proveedor de servicios a través de una cierta política; El otro es LB en proceso, que integra la lógica de LB en el consumidor, y el consumidor conoce por el centro de registro de servicios qué direcciones están disponibles, y luego selecciona un servidor adecuado de estas direcciones. La cinta pertenece a este último. Es solo una biblioteca de clases que está integrada en el proceso del consumidor. A través de él, los consumidores obtienen la dirección del proveedor de servicios.
Tres: componentes y flujo de trabajo de Ribbon
Los componentes centrales de Ribbon (todos los cuales son tipos de interfaz) tienen lo siguiente:
Lista de servidores
Se usa para obtener la lista de direcciones. Puede ser estático (proporcionando un conjunto fijo de direcciones) o dinámica (consulta recurrente para las listas de direcciones del registro).
ServerListFilter
Solo se usa cuando se usa Dynamic ServerList, se usa para usar ciertas políticas en la lista de servicios original para considerar algunas direcciones.
Irule
Seleccione una dirección de servicio final como resultado LB. Las políticas seleccionadas incluyen encuestas, ponderación basada en el tiempo de respuesta, el interruptor de circuito (cuando Hystrix está disponible), etc.
Cuando Fink Funciona, se prefiere usar ServerList para obtener todas las listas de servicios disponibles, luego use ServerListFilter para considerar algunas de las direcciones y finalmente seleccionar un servidor en las direcciones restantes a través de IRULE como resultado final.
Cuatro: Introducción a las principales estrategias de equilibrio de carga proporcionadas por Ribbon
1: Balanceo de carga de votación simple (Roundrobin)
Las solicitudes están programadas a su vez de manera encuestada, es decir, cada horario se ejecuta i = (i + 1) mod n, y se selecciona el servidor i-th.
2: Equilibrio de carga aleatoria (aleatorio)
Seleccione al azar el servidor con el estado de arriba
3: Balancio de carga de tiempo de respuesta a peso (peso en peso de la hora)
Se asigna un peso de acuerdo con el tiempo correspondiente. Cuanto más largo sea el tiempo correspondiente, menor será el peso y menor es la posibilidad de ser seleccionado.
4: Zoneavoidancerule
Determinar integralmente el rendimiento del área del servidor y el servidor de selección de disponibilidad del servidor
Comparación de las propias estrategias de equilibrio de carga de Ribbon
| Nombre de estrategia | Declaración de política | Descripción de la política | Instrucciones de implementación |
| Bestavailablerule | clase pública bestavailablerule extiende ClientConfigenableRoundRobinRule | Seleccione un servidor con la solicitud concurrente más pequeña | Verifique el servidor uno por uno. Si el servidor está tropezado, ignórelo. Seleccione el servidor con el más pequeño ActiveRequestScount |
| Disponibilidad Filteringrule | Disponibilidad de clase pública Filteringrule extiende predicateBasedRule | Filtre los servidores de back -end marcados como circuito tropezado debido a la falla de la conexión, y filtre esos servidores de back -end con alta concurrencia (las conexiones activas exceden el umbral configurado) | El uso de una disposición de disponibilidad para incluir la lógica de los servidores de filtrado es verificar el estado de ejecución de cada servidor registrado en el estado |
| Responsable de peso | clase pública Peso Responsetimerule extiende RoundRobinRule | Se asigna un peso de acuerdo con el tiempo correspondiente. Cuanto más largo sea el tiempo correspondiente, menor será el peso y menor es la posibilidad de ser seleccionado. | Un hilo de fondo lee regularmente el tiempo de respuesta de evaluación del estado y calcula un peso para cada servidor. El cálculo del peso también es relativamente simple. ResponseTime menos el tiempo de respuesta promedio de cada servidor es el peso del servidor. Cuando se acaba de iniciar el estado y no se forman estadísticas, use la política Roubine para seleccionar el servidor. |
| Reenviar | clase pública Retryrule extiende AbstractLoadBalancerrule | Vuelva a intentar el mecanismo en la máquina para la política de equilibrio de carga seleccionada. | Durante un período de configuración, cuando la selección del servidor no tiene éxito, sigue intentando seleccionar un servidor disponible usando Subrule |
| Roundrobinrule | clase pública RoundRobinrule extiende AbstractLoadBalancerrule | Volicía del método Roundrobin para seleccionar servidor | Índice de encuestas y seleccionar el servidor correspondiente al índice |
| Reamina | clase pública RandomRule extiende AbstractLoadBalancerrule | Seleccione aleatoriamente un servidor | Al azar en el índice, seleccione el servidor correspondiente a la posición de índice |
| Zoneavoidancerule | clase pública ZoneAvaidanCerule extiende predicateBasedRule | Determinar integralmente el rendimiento del área del servidor y el servidor de selección de disponibilidad del servidor | Use ZoneAvoidancePredicate y disponibilidad para determinar si se selecciona un servidor. El anterior determina si el rendimiento operativo de una zona está disponible. Excluir zonas no disponibles (todos los servidores). DisponibilidadPredicate se utiliza para filtrar servidores con demasiadas conexiones. |
5: cinta sola
Crear un nombre de proyecto maven Ribbon_client
Contenido de POM
<Spendencies> <Spendency> <MoupRid> com.netflix.ribbon </groupid> <artifactid> ribbon-core </artifactid> <verserse> 2.2.0 </versión> </pendency> <epardency> <proupid> com.netflix.ribbon </proupid> <arfactid> ribbon-httpclient </artifacid> <Versión> </dependencias>
Sample Client.Properties File de configuración
# Número máximo de reintentos sample-client.ribbon.maxautoretries = 1# número máximo de los siguientes servidores para volver a royar (excluyendo el primer servidor) sample-client.ribbon.maxautoretriesNextServer = 1# Si todas las operaciones se pueden volver sample-client.ribbon.serverlistrefreshinterval = 2000# TIEMPO DE CONECTO Utilizado por apache httpclient sample-client.ribbon.connecttimeout = 3000# lee el tiempo de espera utilizado por apache httpclient sample-client.ribbon.readtimeout = 3000# La lista inicial de servidores, se puede cambiar a través de una propiedad dinámica de Archaius en el tiempo de ejecución en el tiempo de ejecución sample-client.ribbon.listofservers = www.sohu.com: 80, www.163.com: 80, www.sina.com.cn: 80sample-client.ribbon.enablePrimeConnections = True
Código de RibbonMain
import java.net.uri; import com.netflix.client.clientfactory; import com.netflix.client.http.httprequest; import com.netflix.client.http.httpesponse; import.netflix.config.configurationManager; import com.netflix.loadbalancer.zonalancer; importador com.netflix.niws.client.http.restclient; public class RibbonMain {public static void main (String [] args) lanza la excepción {ConfigurationManager.LoadPropertiesFromResources ("Sample-Client.Properties"); System.out.println (ConfigurationManager.getConfiginStance (). GetProperty ("Sample-Client.Ribbon.ListOfServers")); RestClient Client = (RestClient) ClientFactory.getNamedClient ("Sample-Client"); Httprequest request = httprequest.newbuilder (). Uri (nuevo uri ("/")). Build (); for (int i = 0; i <4; i ++) {httpResponse respuesta = client.executewithloadBalancer (solicitud); System.out.println ("Estado para URI:" + Response.getRequesteri () + "es:" + respuesta.getStatus ()); } Zoneawareloadbalancer lb = (zoneawareloadbalancer) cliente.getLoadBalancer (); System.out.println (lb.getLoadBalancerStats ()); ConfigurationManager.getConfiginStance (). SetProperty ("Sample Client.Ribbon.ListOfServers", "ccblog.cn:80,www.linkedin.com:80"); System.out.println ("Cambiar servidores ..."); Thread.sleep (3000); for (int i = 0; i <3; i ++) {httpResponse respuesta = client.executewithloadBalancer (solicitud); System.out.println ("Estado para URI:" + Response.getRequesteri () + "es:" + respuesta.getStatus ()); } System.out.println (lb.getLoadBalancerStats ()); }}Analizador de código
Use Archaius ConfigurationManager para cargar propiedades;
Use ClientFactory para crear clientes y equilibradores de carga;
Use Builder para crear solicitudes HTTP. Tenga en cuenta que solo apoyamos el camino de la parte "/" del URI. Una vez que el servidor es seleccionado por el equilibrador de carga, el cliente calculará el URI completo;
Llamar a API Client.executewithloadBalancer () no es la API exeucte ();
Corrija dinámicamente el grupo de servidores en la configuración;
Espere a que la lista del servidor se actualice (el intervalo de actualización definido en el archivo de configuración es de 3 segundos);
Imprima las estadísticas del servidor registradas por el equilibrador de carga.
Seis: cinta combinada con eureka
Primero, inicie el proyecto eureka_register_service (centro de registro) y el proyecto Biz-Service-0 (productor de servicios)
Cree un proyecto Maven Eureka_ribbon_client Este proyecto inicia y las configuraciones relacionadas dependen de Eureka_register_Service y Biz-Service-0
POM unirse
<Parent> <MoupRoD> org.springframework.boot </proupid> <artifactid> spring-boot-starter-parent </arfactid> <version> 1.4.3.release </lipsion> <relativePath/> <! Buscar padres de repository-> </parent> <dependency> <depentency> <grupiD> org.spreingframework.cloud </group) <artifactid> spring-cloud-starter-ribbon </artifactid> </pendency> <pendency> <uproupid> org.springframework.cloud </groupid> <artifactid> spring-cloud-starter-eureka </artifactid> </dependency> <epartency> <uproupid> org.springframework.boot </groupid> <artifactid> spring-boot starter-web </artifactid> </pepertency> <peperse> <uproupid> org.springframework.boot </groupid> <arifactid> spring-boot-starter-test </artifactid> <cope> test </chope> </pertidency> </pendencies> <pendencyManAnge> <Pape> Dependence> <Pape> <MoupRoD> org.springframework.cloud </groupid> <artifactid> Spring-Cloud-Dependencies </arfactid> <versever> Brixton.Release </versever> <proy> pom </pype> <cope> import </cope> </dependencia> </pendencies> </pendencymanaement>>
En la clase principal de la aplicación, agregue las capacidades de servicio de descubrimiento a través de la anotación @EnabledScoveryClient. Cree una instancia de RestTemplate y habilite la capacidad de carga de equilibrio a través de la anotación @LoadBalanced.
@SpringBootApplication @EngabledCoveryClientPublic Class RibbonApplication {@Bean @LoadBalanced RestTemplate RestTeMplate () {return new RestTemplate (); } public static void main (string [] args) {springapplication.run (ribbonapplication.class, args); }}Cree un consumo de consumo para consumir el servicio GetUser de Biz-Service-0. Llamar al servicio por reestima directamente
@RestControllerPublic Class ConsumerController {@aUtowired RestTemplate RestTemplate; @RequestMapping (valor = "/getUserInfo", método = requestmethod.get) public string add () {return RestTemplate.getForEntity ("http: // biz-service-0/getUser", string.class) .getBody (); }} Configurar el Centro de registro de servicio Eureka en la aplicación.
Spring.application.name = Ribbon-Consumerserver.port = 8003eureka.client.serviceurl.defaultzone = http: // localhost: 8000/eureka/
Después de la finalización, puede abrir http: // localhost: 8003/getUserInfo para ver los resultados
Resumen: la cinta es en realidad un componente del cliente de equilibrio de carga suave. Se puede usar en combinación con otras solicitudes requeridas. Combinarlo con Eureka es solo un ejemplo de ello.
Dirección del código: https://github.com/zhp8341/springclouddemo
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.