CSLB with Ribbon and Eureka - 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.
A continuación ejemplificaremos como utilizar integrar Ribbon con Eureka.
Se asume que el lector leyó el articulo CSLB with Ribbon.
- Configurar dependencias de librerías
- Configurar Cliente Eureka
- Configuramos Ribbon
- Configuramos 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' compile 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' }
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> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies>
Configuramos los end-point Eureka
eureka.client.service-url.defaultZone: http://localhost:8081/eureka
Dentro de nuestro application.properties o application.yml configuramos las siguientes propiedades:
Indicamos que vamos a trabajar con un server Eureka
<nombre a nuestra elección, se utilizara mas adelante como host>.ribbon.eureka.enabled: true
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: true
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 ribbon implementado con resttemplate sin eureka.
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(); } }
agregamos la configuración de eureka.
Lo primero que vamos a realizar es crear una variable que contendrá el nombre del servicio al que queramos conectarnos, para nuestro ejemplo se utilizara el servicio ISHOPPRODUCTSERVICE;
Opcionalmente le cambiamos el path del servicio que expondremos por @GetMapping("eureka/products")
Por ultimo modificamos la url http://ribbon-test/api/product/get por http://ISHOPPRODUCTSERVICE/api/product/get. Como se puede ver en lugar de utilizar el ribbon-test utilizamos el nombre del servicio como se encuentra registrado en Eureka.
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 { private static final String PROCUCT_CLIENT_NAME = "ISHOPPRODUCTSERVICE"; @Autowired RestTemplate restTemplate; @GetMapping("eureka/products") @ResponseBody public Object getProductsRibbon() { return this.restTemplate.getForObject("http://" + PROCUCT_CLIENT_NAME + "/get", List.class); } @LoadBalanced @Bean RestTemplate restTemplate(){ return new RestTemplate(); } }