jueves, 27 de junio de 2019

Spring Cloud Netflix, Microservice, Load Balance (Ribbon), java parte 4

Crearemos varios Productores para que varios Consumidores los consulten de forma balanceada.
https://github.com/jalbertomr/SpringCloudNetflix/commit/69e40361e08997993d305f66e4d1f52878cacdec




  Se modificará el consumidor, ya que el balanceador de carga (Ribbon) se instanciará en el Consumer al momento de buscar el Producer. En el Producer se agregará al archivo bootstrap.properties la linea
spring.application.name=empleado-productor


  Para generar varios servidores Productores debemos indicar que tomaran una instancia única para cada uno con un valor random,  y Para que no tomen el mismo puerto, lo cambiaremos a mano antes de ejecutarlo, de tal forma que para el primero le daremos el puerto 8080 (default si no se especifica), y al segundo el 8081  en el archivo application.properties
eureka.client.serviceUrl.defaultZone=http://localhost:8090/eureka
eureka.instance.instanceId=${spring.application.name}:${random.value}
#server.port=8081 para el segundo Producer y se incrementara para los siguientes 


Un archivo similar será necesario para el consumidor o consumidores, es decir, inicializar el atributo eureka.instance.instanceId como se hace en el productor para que tome un id de instancia random para que no sea repetido. estrictamente deben ser diferentes, random no lo garantizaría del todo.

Adicionalmente decoramos más las clases asignandole un REST con entrada /info a los productores y consumidores, que tenga un texto sencillo.

@RestController
public class TestController {

    @RequestMapping(value = "/info", method = RequestMethod.GET)
    public String infoPage() {
        return "<h3>Página de información employee-productor</h3>";
    }
}


el archivo application.properties del productor.
eureka.client.serviceUrl.defaultZone=http://localhost:8090/eureka
eureka.instance.instanceId=${spring.application.name}:${random.value}
#server.port=8080 es el default
#server.port=8081 para el segundo Producer y se incrementara para los siguientes servidores producer
server.port=8081



De esta manera creamos dos productores y tres consumidores. El balanceador de carga radica en cada Consumidor con la clase CustomerControlerClient que integra la clase LoadBalancerClient.

@Controller
public class ConsumerControllerClient {

    @Autowired
    //private DiscoveryClient discoveryClient;
    private LoadBalancerClient loadBalancer;
   
    public void getEmployee() throws RestClientException, IOException {
       
        //String baseUrl="http://localhost:8080/empleado";
        //List<ServiceInstance> instances = discoveryClient.getInstances("empleado-productor");
        ServiceInstance serviceInstance = loadBalancer.choose("empleado-productor");
        System.out.println(serviceInstance.getUri());
        String baseUrl = serviceInstance.getUri().toString();
        baseUrl = baseUrl+"/empleado";
       
        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> response = null;
        try {
            response = restTemplate.exchange( baseUrl, HttpMethod.GET, getHeaders(), String.class);
        } catch (Exception ex) {
            System.out.println( ex);
        }
        System.out.println( response.getBody());
    }


La estructura del productor y consumidor


Dashboard Eureka con un Productor




En el Dashboard de Eureka nos muestra infomación de los producer. y consumers, cuando aparece DOWN es por que algo ocurrio al servicio, ya sea que no levanto o se cayo. en este caso se levanto el producer pero el puerto conflictuaba con 8080 de oracle.


Eureka tiene otras vistas como /lastn o /features



Se modifican las propiedades del eureka server para que no intente registrase a si mismo y constantemente mande errores a la consola.
eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false



eot

1 comentario: