Ya hemos visto bastante de Apache Camel, y hoy veremos como realizar Service Discovery a través de la librería de Spring Cloud Netflix. Pero antes como siempre veremos varios conceptos para entender mejor luego el ejemplo.
Debemos ubicarnos en un entorno de creación y utilización de Microservicios. Y como, si creamos Microservicios y los desplegamos a través de contenedores en la nube, sus localizaciones de red (IPs y direcciones) pueden ser dinámicas. Y por tanto nos pueden llevar a que la configuración que tengamos sobre la ubicación de los mismos no sea válida siempre.
De ahí surge la necesidad del Service Discovery, o lo que es lo mismo, detección automática de dispositivos y servicios ofrecidos en una misma red. De esta forma, siempre tendremos la configuración correcta sobre los Microservicios disponibles.
Para llevarlo a cabo necesitamos de un Service Registry que será un servidor encargado de recoger la información sobre los Microservicios: su ubicación, estado, etc. Y los Microservicios actuarían como los clientes de este Service Registry. Hay diferentes implementaciones de Service Registry y nosotros utilizaremos Netflix Eureka.
Para llevar a cabo el Service Discovery se pueden utilizar varios patrones, y nosotros vamos a elegir el Client‑Side Discovery Pattern. Donde será el cliente el encargado de registrarse en el Service Registry.
Una vez asentadas las bases, podemos empezar con nuestro ejemplo. El cual consta de 3 aplicaciones:
- Un Service Registry realizado solo con Spring Boot
- Un Service Client realizado con Spring Boot, el cual tendrá un recurso que nos devolverá valores.
- Un Service Client realizado con Apache Camel, el cual se conectará al Service Registry y al otro Service Client dinámicamente.
@SpringBootApplication @EnableEurekaServer public class EurekaServerApplication { public static void main(final String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
server.port=8761 eureka.client.register-with-eureka=false eureka.client.fetch-registry=false logging.level.com.netflix.eureka=OFF logging.level.com.netflix.discovery=OFF
<dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-spring-cloud-netflix-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <version>2.2.4.RELEASE</version> </dependency>
spring.application.name=app-camel-eureka-client eureka.client.serviceUrl.defaultZone = http://localhost:8761/eureka/
@Override public void configure() throws Exception { restConfiguration().component("servlet").bindingMode(RestBindingMode.json);
rest("/serviceCall").get().produces(MediaType.APPLICATION_JSON_VALUE).route() .serviceCall("discovery-client/books?bridgeEndpoint=true") //Is it becouse http endpoint produces a Stream as the body and once the stream is read, it is no longer available. .convertBodyTo(String.class) .log("Body: ${body}").unmarshal().json(); }
public static final String URL_DISCOVER_BOOKS = "%s/books?bridgeEndpoint=true";
@Autowired private DiscoveryClient dClient;
@Override public void configure() throws Exception { restConfiguration().component("servlet").bindingMode(RestBindingMode.json); rest("/discoveryCall").get().produces(MediaType.APPLICATION_JSON_VALUE).route() .to(String.format(URL_DISCOVER_BOOKS, dClient.getInstances("discovery-client").get(0).getUri()))
//Is it becouse http endpoint produces a Stream as the body and once the stream is read, it is no longer available. .convertBodyTo(String.class) .log("Body: ${body}").unmarshal().json(); }
No hay comentarios:
Publicar un comentario