Ribbon es un componente responsable del equilibrio de carga en los cubos de familia Netflix de Spring Cloud. Es una colección de bibliotecas de clase. A través de la cinta, los programadores pueden usar el equilibrio de carga "transparente" sin involucrar detalles de implementación específicos, sin tener que escribir demasiado código para implementar el equilibrio de carga en proyectos.
Por ejemplo, en un clúster que contiene eureka y cinta, se implementa un servicio (que puede entenderse como un paquete JAR) en múltiples servidores. Cuando múltiples usuarios del servicio llaman al servicio al mismo tiempo, estas solicitudes concurrentes se pueden reenviar a cada servidor utilizando una estrategia razonable.
De hecho, cuando se usa varios otros componentes de la nube de resorte, podemos ver rastros de cinta, como Eureka, se puede integrar con la cinta, y el componente Zuul que proporciona la función de puerta de enlace también puede integrarse con la cinta al reenviar las solicitudes.
Desde el nivel de código, la cinta tiene las siguientes tres interfaces más importantes.
Primero, Iloadbalancer, que también se llama equilibrador de carga. A través de él, podemos reenviar razonablemente las solicitudes en el proyecto de acuerdo con reglas específicas. La clase de implementación común es Baseloadbalancer.
En segundo lugar, Irule, esta interfaz tiene múltiples clases de implementación, como RandomRule y RoundRobinRule. Estas clases de implementación definen específicamente estrategias de equilibrio de carga como "aleatorio" y "encuestas", etc. También podemos reescribir los métodos en esta interfaz para personalizar las estrategias de equilibrio de carga.
En la clase Baseloadbalancer, podemos configurar las políticas de equilibrio de carga a través de la clase de implementación de IRULE, para que el equilibrador de carga pueda reenviar las solicitudes razonablemente en función de esto.
En tercer lugar, la interfaz IPing, a través de esta interfaz, podemos obtener qué servidores están actualmente disponibles, y también podemos personalizar las reglas para determinar si el servidor está disponible reescribiendo los métodos en esta interfaz. En la clase Baseloadbalancer, también podemos establecer políticas para determinar si el servidor está disponible a través de la clase de implementación IPing.
1 iloadbalancer: interfaz LoadBalancer
En la cinta, también podemos seleccionar servidores basados en políticas de equilibrio de carga específicas a través de la interfaz ILOADBALANCER.
A través del iloadbalancerdemo.java a continuación, echemos un vistazo al uso básico de esta interfaz. Esta clase se coloca en el proyecto RabbionBasicDemo creado en la Parte 4.2, y el código es el siguiente.
// omitir el paquete necesario e importar el código de la clase pública iloadbalancerdemo {public static void main (string [] args) {// Crea el objeto iloadbalancer iloadbalancer loadbalancer = new BaseloadBalancer (); // Definir una lista de servidores <Server> myServers = new ArrayList <Server> (); // crear dos objetos de servidor servidor s1 = nuevo servidor ("ekserver1", 8080); Servidor s2 = nuevo servidor ("ekserver2", 8080); // Ponga dos objetos de servidor en el tipo de lista del objeto MyServers myServers.add (S1); myServers.add (S2); // colocar myServers en el equilibrador de carga LoadBalancer.addservers (myServers); // Iniciar 10 llamadas en el bucle for (int i = 0; i <10; i ++) {// Use reglas de equilibrio de carga predeterminadas para obtener el servidor de objetos de tipo de servidor S = LoadBalancer.ChoosServer ("predeterminado"); // Dirección IP de salida y número de puerto System.out.println (s.gethost () + ":" + s.getport ()); }}}En la línea 5, creamos un objeto LoadBalancer de tipo Baseloadbalancer, y Baseloadbalancer es la clase de implementación de la interfaz de Balancer de carga iloadbalancer.
En las líneas 6 a 13, creamos dos objetos de tipo servidor y los ponemos en myServers. En la línea 15, colocamos el objeto MyServers de tipo lista en el equilibrador de carga.
En el bucle for en las líneas 17 a 22, simulamos la selección del servidor 10 veces a través del equilibrador de carga. Específicamente, en la línea 19, seleccionamos el servidor con las reglas de equilibrio de carga predeterminadas a través del método Choiceserver de LoadBalancer. En la línea 21, utilizamos la acción "Imprimir" para simular la acción real "Usando el objeto del servidor para manejar las solicitudes".
Los resultados en ejecución del código anterior son los siguientes. Podemos ver que el equilibrador de carga LoadBalancer distribuye 10 solicitudes a 2 servidores, y de hecho podemos ver el efecto de "equilibrio de carga".
En segundo lugar, Irule, esta interfaz tiene múltiples clases de implementación, como RandomRule y RoundRobinRule. Estas clases de implementación definen específicamente estrategias de equilibrio de carga como "aleatorio" y "encuestas", etc. También podemos reescribir los métodos en esta interfaz para personalizar las estrategias de equilibrio de carga.
En la clase Baseloadbalancer, podemos configurar las políticas de equilibrio de carga a través de la clase de implementación de IRULE, para que el equilibrador de carga pueda reenviar las solicitudes razonablemente en función de esto.
En tercer lugar, la interfaz IPing, a través de esta interfaz, podemos obtener qué servidores están actualmente disponibles, y también podemos personalizar las reglas para determinar si el servidor está disponible reescribiendo los métodos en esta interfaz. En la clase Baseloadbalancer, también podemos establecer políticas para determinar si el servidor está disponible a través de la clase de implementación IPing.
Ekserver2: 8080 Ekserver1: 8080 Ekserver2: 8080 Ekserver1: 8080 Ekserver2: 8080 Ekserver1: 8080 Ekserver2: 8080 Ekserver1: 8080 Ekserver2: 8080 Ekserver1: 8080 Ekserver1: 8080
2 Irule: interfaz que define reglas de equilibrio de carga
En la cinta, podemos establecer las reglas correspondientes para el equilibrador de carga definiendo la clase de implementación de la interfaz IRULE. En la siguiente tabla, podemos ver algunas clases de implementación comúnmente utilizadas de la interfaz IRULE.
El nombre de la clase de implementación | Reglas de equilibrio de carga |
Reamina | Adoptar una estrategia seleccionada al azar |
Roundrobinrule | Adoptar una estrategia de votación |
Reenviar | Al usar esta estrategia, se incluye una acción de reintento |
Disponibilidad Filterrule | Filtará servidores con múltiples fallas de conexión y concurrencia de solicitud excesiva |
Responsable de peso | Establezca un peso para cada servidor de acuerdo con el tiempo de respuesta promedio y seleccione servidores con un tiempo de respuesta promedio más pequeño en función de este valor de peso. |
Zoneavoidancerule | Se otorga prioridad a asignar la solicitud a los servidores con la misma zona que la solicitud |
En el siguiente programa Iruledemo.Java, echemos un vistazo al uso básico de Irule.
// omitir el paquete necesario e importar el código de la clase pública Iruledemo {public static void main (string [] args) {// Tenga en cuenta que esto se usa para Baseloadbalancer, no la interfaz de Iloadbalancer Baseloadbalancer LoadBalancer = new BaseloadBalancer (); // Declarar la política de equilibrio de carga basada en la regla de la encuesta Irule = new RoundRobinRule (); // establece la política LoadBalancer.setRule (regla); // Defina 3 servidores de la siguiente manera y colóquelos en una colección de listas de tipo de lista <Servir> myServers = new ArrayList <Server> (); Servidor s1 = nuevo servidor ("ekserver1", 8080); Servidor s2 = nuevo servidor ("ekserver2", 8080); Servidor s3 = nuevo servidor ("ekserver3", 8080); myServers.add (S1); myServers.add (S2); myServers.add (S3); // Establecer la lista del servidor LoadBalancer.addservers (myServers); // emite el resultado del equilibrio de carga para (int i = 0; i <10; i ++) {servidor s = loadBalancer.ChoosServer (nulo); System.out.println (s.gethost () + ":" + s.getport ()); }}}Este código es muy similar al iloadbalancerdemo.java en el artículo anterior, pero existen las siguientes diferencias.
1 En la línea 5, definimos el equilibrador de carga a través de la clase Baseloadbalancer en lugar de la interfaz porque la clase contiene el método SetRule.
2 Defina un objeto de regla basado en la regla de votación en la línea 7 y colóquelo en el equilibrador de carga en la línea 9.
3 En la línea 19, colocamos el objeto de lista que contiene 3 servidores en el equilibrador de carga, en lugar de los dos anteriores. Dado que se almacena aquí para fines de demostración, pondremos un servidor "EKSERVER3" que no existe en absoluto.
Después de ejecutar el programa, podemos ver que hay 10 salidas, y de hecho está generando los nombres de 3 servidores en secuencia de acuerdo con la regla de "encuesta". Si cambiamos el código en la línea 7 a la siguiente, veremos la salida "aleatoria" del nombre del servidor.
Regla irule = new RandomRule ();
3 IPing: la interfaz para determinar si el servidor está disponible
En el proyecto, generalmente permitimos que la interfaz ILOADBALANCER determine automáticamente si el servidor está disponible (estos servicios están encapsulados en el código subyacente de Cingubon). Además, también podemos usar la interfaz IPing en el componente de cinta para implementar esta función.
En el siguiente código IRULEDEMO.Java, demostraremos el uso general de la interfaz de IPing.
// omitir el paquete necesario e importar la clase de código Myping implementa {public boolean isalive (servidor servidor) {// Si el nombre del servidor es ekserver2, devuelve falso if (server.gethost (). Equals ("ekserver2")) {return false; } return verdadero; }}La clase Myping definida en la línea 2 implementa la interfaz IPPing y anula el método ISALIVE en la línea 3.
En este método, juzgamos en función del nombre del servidor. Específicamente, si el nombre es EKSERVER2, devuelve False, lo que significa que el servidor no está disponible, de lo contrario devuelve verdadero, lo que significa que el servidor actual está disponible.
clase pública Iruledemo {public static void main (string [] args) {Baseloadbalancer loadBalancer = new BaseloadBalancer (); // Definir el objeto Myping de Iping Type iPing Myping = new Myping (); // Use el objeto Myping LoadBalancer.setping (Myping); // Cree tres objetos de servidor y colóquelos en la lista de equilibrios de carga <Server> myServers = new ArrayList <Server> (); Servidor s1 = nuevo servidor ("ekserver1", 8080); Servidor s2 = nuevo servidor ("ekserver2", 8080); Servidor s3 = nuevo servidor ("ekserver3", 8080); myServers.add (S1); myServers.add (S2); myServers.add (S3); LoadBalancer.addservers (myServers); // Solicite el servidor varias veces a través de un bucle for (int i = 0; i <10; i ++) {servidor s = loadBalancer.ChoosServer (NULL); System.out.println (s.gethost () + ":" + s.getport ()); }}}En la función principal en la línea 12, creamos un objeto de compra de tipo IPing en la línea 15, y colocamos este objeto en el equilibrador de carga en la línea 17. A través del código en las líneas 18 a 26, creamos tres servidores y también los colocamos en el equilibrador de carga.
En el bucle for For en la línea 28, todavía solicitamos y generamos el nombre del servidor. Dado que el equilibrador de carga aquí contiene un objeto de tipo IPing, después de obtener el servidor de acuerdo con la política, determinará si el servidor está disponible en función del método isactivo en MIPing.
Dado que en este método, definimos que el servidor EKServer2 no está disponible, el objeto Load Balancer LoadBalancer nunca enviará la solicitud al servidor, es decir, en el resultado de la salida, no veremos la salida de "EKSERVER2: 8080".
De esto podemos ver el uso general de la interfaz de IPing. Podemos definir la lógica de "juzgar si el servidor está disponible" reescribiendo el método isalive. En proyectos reales, la base para el juicio no es más que "si el servidor responde durante demasiado tiempo" o "si el número de solicitudes enviadas al servidor es demasiado". Estos métodos de juicio están encapsulados en la interfaz IRULE y su clase de implementación, por lo que en escenarios generales usamos la interfaz IPing.
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.