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
Very awesome post! I like that and very interesting content.
ResponderEliminarDocker and Kubernetes Training in Hyderabad
Kubernetes Online Training
Docker Online Training