CSLB With Ribbon - VidoniJorge/gs-spring-cloud-netflix GitHub Wiki
Ribbon es un equilibrador de carga del lado del cliente que nos brinda mucho control sobre el comportamiento de los clientes HTTP y TCP.
Durante sección se asumirá que el lector tiene conocimientos sobre como utilizar un RestTemple y se planteara 2 ejemplos:
- Como implementar Ribbon sin un server eureka
- Como implementar Ribbon con un server eureka
- Configurar dependencias de librerías
- Configuramos Ribbon
- Configuramos utilizamos Ribbon en nuestro resttemplete
Para configurar las dependencia en nuestro proyecto solo tenemos que agregar en nuestro archivo gradle o maven, las siguientes las dependencias especificadas anteriormente.
Gradle
dependencies { implementation 'org.springframework.boot:spring-boot-starter' compile 'org.springframework.cloud:spring-cloud-starter-netflix-ribbon' compile 'org.springframework.boot:spring-boot-starter-web' }
Maven
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
Dentro de nuestro application.properties o application.yml configuramos las siguientes propiedades:
Indicamos que no vamos a trabajar con un server Eureka
<nombre a nuestra elección, se utilizara mas adelante como host>.ribbon.eureka.enabled: false
para nuestro ejemplo se utilizará el siguiente nombre ribbon-test, el cual se utilizará en las siguientes propiedades. quedando la propiedad anterior de la siguiente forma:
ribbon-test.ribbon.eureka.enabled: false
Creamos la lista de url, que Ribbon utilizara para hacer el load balance
ribbon-test.ribbon.listOfServers = <lista de url separadas por ",">
ServerListRefreshInterval Es el intervalo, en milisegundos, entre las actualizaciones de la lista de servicios de Ribbon
ribbon-test.ribbon.ServerListRefreshInterval: 15000
Partiendo del siguiente ejemplo de cliente implementado con resttemplate.
Ejemplo:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.client.RestTemplate; @Controller public class ClientController { @Autowired RestTemplate restTemplate; @GetMapping("rest_template/products") public Object getProducts() { return template.getForObject("http://localhost:8080/api/product/get", List.class); } }
configuraremos ribbon.
Lo primero que vamos a realizar es indicar a nuestro controller que vamos a utilizar Ribbon, esto lo realizamos con la anotación @RibbonClient (es obligatorio agregarle el name configurado en el application.yml).
En segundo lugar, le indicaremos a Spring Cloud que aprovechar su soporte de equilibrio de carga. Para esto agregamos la anotación @LoadBalanced en el método encargado de crear el bean del resttemplate.
Por ultimo modificamos la url http://localhost:8080/api/product/get por http://ribbon-test/api/product/get. Como se puede ver en lugar de utilizar el localhost:8080 utilizamos el nombre del host que configuramos en nuestro archivo application.yml
Ejemplo:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.client.RestTemplate; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.netflix.ribbon.RibbonClient; import org.springframework.context.annotation.Bean; @Controller @RibbonClient("ribbon-test") public class RibbonController { @Autowired RestTemplate restTemplate; @GetMapping("ribbon/products") @ResponseBody public Object getProductsRibbon() { return this.restTemplate.getForObject("http://ribbon-test/api/product/get", List.class); } @LoadBalanced @Bean RestTemplate restTemplate(){ return new RestTemplate(); } }