Introducción al cliente Spring Cloud Rest con Netflix Ribbon

1. Introducción

Netflix Ribbon es una biblioteca en la nube de comunicación entre procesos (IPC). Ribbon proporciona principalmente algoritmos de equilibrio de carga del lado del cliente.

Además de los algoritmos de equilibrio de carga del lado del cliente, Ribbon también proporciona otras características:

  • Integración de descubrimiento de servicios : los equilibradores de carga de cinta proporcionan descubrimiento de servicios en entornos dinámicos como una nube. La integración con el componente de descubrimiento de servicios de Eureka y Netflix se incluye en la biblioteca de cintas
  • Tolerancia a fallas : la API Ribbon puede determinar dinámicamente si los servidores están en funcionamiento en un entorno en vivo y puede detectar aquellos servidores que están inactivos
  • Reglas de equilibrio de carga configurables : Ribbon admite RoundRobinRule , AvailabilityFilteringRule , WeightedResponseTimeRule listo para usar y también admite la definición de reglas personalizadas

Ribbon API funciona según el concepto denominado "Cliente designado". Al configurar Ribbon en nuestro archivo de configuración de la aplicación, proporcionamos un nombre para la lista de servidores incluidos para el equilibrio de carga.

Vamos a probarlo.

2. Gestión de la dependencia

La API de Netflix Ribbon se puede agregar a nuestro proyecto agregando la siguiente dependencia a nuestro pom.xml:

 org.springframework.cloud spring-cloud-starter-netflix-ribbon 

Las últimas bibliotecas se pueden encontrar aquí.

3. Aplicación de ejemplo

Para ver el funcionamiento de Ribbon API, creamos una aplicación de microservicio de muestra con Spring RestTemplate y la mejoramos con Netflix Ribbon API junto con Spring Cloud Netflix API.

Usaremos una de las estrategias de equilibrio de carga de Ribbon, WeightedResponseTimeRule , para habilitar el equilibrio de carga del lado del cliente entre 2 servidores, que se definen en un cliente con nombre en el archivo de configuración, en nuestra aplicación.

4. Configuración de la cinta

Ribbon API nos permite configurar los siguientes componentes del balanceador de carga:

  • Regla : componente lógico que especifica la regla de equilibrio de carga que estamos usando en nuestra aplicación
  • Ping : un componente que especifica el mecanismo que usamos para determinar la disponibilidad del servidor en tiempo real
  • ServerList : puede ser dinámico o estático. En nuestro caso, estamos usando una lista estática de servidores y, por lo tanto, los estamos definiendo directamente en el archivo de configuración de la aplicación.

Escriba una configuración simple para la biblioteca:

public class RibbonConfiguration { @Autowired IClientConfig ribbonClientConfig; @Bean public IPing ribbonPing(IClientConfig config) { return new PingUrl(); } @Bean public IRule ribbonRule(IClientConfig config) { return new WeightedResponseTimeRule(); } }

Observe cómo usamos la regla WeightedResponseTimeRule para determinar el servidor y el mecanismo PingUrl para determinar la disponibilidad del servidor en tiempo real.

De acuerdo con esta regla, a cada servidor se le asigna un peso de acuerdo con su tiempo medio de respuesta, a menor tiempo de respuesta se le da menor peso. Esta regla selecciona aleatoriamente un servidor donde la posibilidad está determinada por el peso del servidor.

Y PingUrl hará ping a cada URL para determinar la disponibilidad del servidor.

5. application.yml

A continuación se muestra el archivo de configuración application.yml que creamos para esta aplicación de muestra:

spring: application: name: spring-cloud-ribbon server: port: 8888 ping-server: ribbon: eureka: enabled: false listOfServers: localhost:9092,localhost:9999 ServerListRefreshInterval: 15000

En el archivo anterior, especificamos:

  • Nombre de la aplicación
  • Número de puerto de la aplicación
  • Cliente designado para la lista de servidores: "ping-server"
  • Componente de descubrimiento de servicio de Eureka deshabilitado, estableciendo eureka: habilitado en falso
  • Definí la lista de servidores disponibles para balanceo de carga, en este caso 2 servidores
  • Configuró la frecuencia de actualización del servidor con ServerListRefreshInterval

6. RibbonClient

Ahora configuremos el fragmento del componente principal de la aplicación, donde usamos RibbonClient para habilitar el equilibrio de carga en lugar del simple RestTemplate :

@SpringBootApplication @RestController @RibbonClient( name = "ping-a-server", configuration = RibbonConfiguration.class) public class ServerLocationApp { @LoadBalanced @Bean RestTemplate getRestTemplate() { return new RestTemplate(); } @Autowired RestTemplate restTemplate; @RequestMapping("/server-location") public String serverLocation() { return this.restTemplate.getForObject( "//ping-server/locaus", String.class); } public static void main(String[] args) { SpringApplication.run(ServerLocationApp.class, args); } }

Definimos una clase de controlador con la anotación @RestController ; también anotamos la clase con @RibbonClient con un nombre y una clase de configuración.

La clase de configuración que definimos aquí es la misma clase que definimos antes en la que proporcionamos la configuración de API de cinta deseada para esta aplicación.

Observe que también anotamos RestTemplate con @LoadBalanced, lo que sugiere que queremos que esto tenga una carga equilibrada y, en este caso, con Ribbon.

7. Resistencia a fallos en la cinta

Como discutimos anteriormente en este artículo, Ribbon API no solo proporciona algoritmos de equilibrio de carga del lado del cliente, sino que también ha incorporado resistencia a fallas.

Como se indicó anteriormente, Ribbon API puede determinar la disponibilidad del servidor mediante el ping constante de los servidores a intervalos regulares y tiene la capacidad de omitir los servidores que no están activos.

Además de eso, también implementa el patrón Circuit Breaker para filtrar los servidores según criterios específicos.

El patrón de disyuntor minimiza el impacto de una falla del servidor en el rendimiento al rechazar rápidamente una solicitud a ese servidor que está fallando sin esperar un tiempo de espera. Podemos deshabilitar esta función de disyuntor estableciendo la propiedad niws.loadbalancer.availabilityFilteringRule.filterCircuitTripped en false .

Cuando todos los servidores están inactivos, por lo que no hay ningún servidor disponible para atender la solicitud, pingUrl () fallará y recibiremos una excepción java.lang.IllegalStateException con un mensaje "No hay instancias disponibles para atender la solicitud" .

8. Conclusión

En este artículo, discutimos la API de cinta de Netflix y su implementación en una aplicación de muestra simple.

El código fuente completo para el ejemplo descrito anteriormente se puede encontrar en el repositorio de GitHub.