CSLB with Ribbon and Eureka - VidoniJorge/gs-spring-cloud-netflix GitHub Wiki

Ribbon

Ribbon es un equilibrador de carga del lado del cliente que nos brinda mucho control sobre el comportamiento de los clientes HTTP y TCP.

Guides

A continuación ejemplificaremos como utilizar integrar Ribbon con Eureka.

Se asume que el lector leyó el articulo CSLB with Ribbon.

Ejemplo utilizando un server Eureka

Procedimiento

  • Configurar dependencias de librerías
  • Configurar Cliente Eureka
  • Configuramos Ribbon
  • Configuramos Ribbon en nuestro resttemplete
Agregar Dependencias

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>
Configurar Eureka Client

Configuramos los end-point Eureka

eureka.client.service-url.defaultZone: http://localhost:8081/eureka
Configurar Ribbon

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
Configuramos nuestro cliente para que utilice Ribbon

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();
     }
}
⚠️ **GitHub.com Fallback** ⚠️