CSLB With Ribbon - 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

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

Ejemplo sin utilizar un server Eureka

Procedimiento

  • Configurar dependencias de librerías
  • Configuramos Ribbon
  • Configuramos utilizamos 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'
}

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>
Configurar Ribbon

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

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