Spring boot microservicios Comunicacion entre microservicios
Spring boot microservicios Comunicacion entre microservicios
Los microservicios suponen un nuevo estilo de arquitectura software para el diseño de aplicaciones. En este post explicaré como crear y desplegar microservicios desde cero utilizando Spring Boot, uno de los frameworks más populares para su construcción.
Pero, ¿qué son los microservicios?
Los microservicios se definen como un estilo arquitectural, es decir, una forma de desarrollar una aplicación, basada en un conjunto de pequeños servicios, cada uno de ellos ejecutándose de forma autónoma y comunicándose entre si mediante mecanismos livianos, generalmente a través de peticiones REST sobre HTTP por medio de sus APIs.
La tendencia es que las aplicaciones sean diseñadas con un enfoque orientado a microservicios, construyendo múltiples servicios que colaboran entre si, en lugar del enfoque monolÃtico, donde se construye y despliega una única aplicación que contenga todas las funcionalidades.
Algunas de las caracterÃsticas más destacadas de los microservicios son:
- Pueden ser auto-contenidos, de tal forma que incluyen todo lo necesario para prestar su servicio
- Servicios pequeños, lo que facilita el mantenimiento. Ej: Personas, Productos, Posición Global, etc
- Principio de responsabilidad única: cada microservicio hará una única cosa, pero la hará bien
- PolÃglotas: una arquitectura basada en microservicios facilita la integración entre diferentes tecnologÃas (lenguajes de programación, BBDD…etc)
- Despliegues unitarios: los microservicios pueden ser desplegados por separado, lo que garantiza que cada despliegue de un microservicio no implica un despliegue de toda la plataforma. Tienen la posibilidad de incorporar un servidor web embebido como Tomcat o Jetty
- Escalado eficiente: una arquitectura basada en microservicios permite un escalado elástico horizontal, pudiendo crear tantas instancias de un microservicio como sea necesario.
Sobre el ejercicio práctico
Voy a intentar explicar, de la manera más simple posible, como construir una sencilla aplicación compuesta por tres microservicios:
El objetivo es implementar un tÃpico Hola Mundo con microservicios. Para ello, greeting-client-service llamará al método greeting del microservicio greeting-service usando RESTful API, pasándole como parámetro de entrada un nombre (Ej: “Rob”) y recibiendo como contestación un saludo (Ej: “Hello, Rob!”).
Para realizar el ejercicio, utilizaremos Eureka (registration-service), como servidor de registro y descubrimiento de microservicios. Eureka está incorporado dentro de Spring Cloud.
Puede descargar el código fuente del ejemplo en este enlace: https://github.com/rcrespop/helloWorldEureka.git
Configuración
Para la implementación de los microservicios, utilizaremos Spring Boot y Spring Cloud. El ejemplo estará compuesto de tres proyectos (uno por cada microservicio). A continuación muestro la configuración de los ficheros POM.xml.
Microservicio Registration
Como comenté antes, para implementar este servicio utilizaremos Eureka, un servidor de registro y descubrimiento de microservicios open source desarrollado por Netflix. Levantar una instancia de este servidor con Spring Cloud es muy sencillo. Aquà tienes el código completo:
La anotación @SpringBootApplication indica que se trata de una aplicación Spring Boot y @EnableEurekaServer habilita el uso Eureka como servidor de registro y descubrimiento de microservicios.
Por defecto, cuando inicias una aplicación spring boot , se busca un fichero llamado application.properties o application.yml para acceder a su configuración, el cual deberá estar ubicado en la carpeta resources de nuestro proyecto. Su configuración es la siguiente:
Observa que:
- En la configuración del fichero yml estamos indicando que no se trata de un microservicio cliente y que por tanto no queremos que se registre en Eureka (registerWithEureka: false).
- Aunque por defecto Eureka escucha en el puerto 8761, para este ejemplo hemos indicado que utilice el puerto 1111. Prueba a ejecutar el servicio, comprueba que el servidor arranca correctamente y accede a http://localhost:1111 para visualizar el dashboard de Eureka.
- El dashboard de Eureka está implementado usando plantillas FreeMarket (los otros dos microservicios que crearemos a continuación usarán thymeleaf para construir las vistas HTML.
Microservicio Greeting
Este microservicio gestionará peticiones que reciba por HTTP para devolver un saludo (greeting) a los nombres de las personas que reciba como entrada. Al arrancar greeting-service lo primero que hará será registrarse en Eureka.
@EnableAutoConfiguration @EnableDiscoveryClient @SpringBootApplication public class GreetingServer { public static void main(String[] args) { SpringApplication.run(GreetingServer.class, args); } }
Respecto a las anotaciones utilizadas:
- @SpringBootApplication define que es una aplicación Spring Boot
- @EnableAutoConfiguration configura la aplicación sin necesidad de otros ficheros de configuración XML, etc.
- @EnableDiscoveryClient habilita el servicio de registro y descubrimiento. En este caso, este procesos se auto-registrará en Eurekautilizando el nombre de aplicación indicado en el fichero greeting-server.yml cuya configuración se muestra a continuación:
En la configuración del fichero greeting-server.yml observamos que:
- El nombre de la aplicación es greeting-service, que será utilizado para registrarse en Eureka
- Se configura el puerto de escucha del servidor web (2222). Esto es necesario ya que vamos a ejecutar varios procesos que usan Tomcat y todos ellos no pueden estar escuchando al mismo tiempo del puerto 8080.
- Se establece la URL de acceso al servicio de Eureka
Este microservicio utilizará Spring REST para ofrecer un interface RESTful sobre HTTP y poder asà acceder a sus operaciones.
El método greeting devolverá un objeto de tipo Greeting, cuya clase se muestra a continuación:
Por último, ejecuta el microservicio greeting-service (método main de la clase GreetingServer) y comprueba que al refrescar el dahboard de Eureka, aparece el servicio registrado. Ten en cuenta que el registro puede durar entre 10-20 segundos en realizarse.
Comprueba que el microservicio responde correctamente al realizar una petición RESTFul vÃa HTTP como la siguiente: http://localhost:2222//greeting/Rob
Microservicio ClientGreeting
El objetivo de este microservicio será, a través de Eureka (registration-service), localizar la URL de acceso al microservicio greeting-service, hacer una petición REST sobre HTTP a uno de sus métodos expuestos en su API, obtener un resultado y presentarlo en pantalla usando thymeleaf.
Para consumir un servicio RESTful, Spring proporcionar la clase RestTemplate que nos permite enviar peticiones HTTP a un servidor RESTful y recuperar los datos en formatos como JSON y XML. En nuestro ejemplo usaremos JSON como formato de intercambio de datos, para lo cual vamos a apoyarnos en Jackson, una librerÃa java para el procesamiento y parseo de datos JSON.
la implementación de este microservicio estará compuesta de tres pasos
Paso 1: Implementación del Service
Implementaremos el acceso al microservicio greeting-service en la siguiente clase:
RestTemplate ha sido configurado por Spring Cloud para usar un HttpRequestClient personalizado que utiliza Netflix Ribbon para realizar la búsqueda del microservicio. Ribbon además es un balanceador de carga, por lo que si tienes varias instancias disponibles de un microservicio, selecciona una para ti.
La petición REST realizada en la clase ClientGreetingService devuelve un mensaje JSON que pasearemos, usando Jackson, a un objeto de la clase Greeting. A continuación muestro la definición de esta clase:
Paso 2: Implementación de Controller
A continuación vamos a crear un controlador que va a agrupar un conjunto de acciones a realizar sobre este microservicio. Para ello usaremos las siguientes anotaciones:
- @Controller, que registrará el controlador para Spring MVC
- @RequestMapping, anotación que se encarga de relacionar un método con una petición http
@Controller public class ClientGreetingController { protected ClientGreetingService helloWorldService; //constructor public ClientGreetingController(ClientGreetingService helloWorldService) { this.helloWorldService = helloWorldService; } @RequestMapping("/greeting") public String goHome() { return "index"; } @RequestMapping("/greeting/{name}") public String greeting(Model model, @PathVariable("name") String name) { Greeting greeting = helloWorldService.greeting(name); model.addAttribute("greeting", greeting.getContent()); return "greeting"; } } @Controller public class ClientGreetingHomeController { @RequestMapping("/") public String home() { return "index"; } }
ClientGreetingController es un tÃpico controlador Spring MVC que devolverá un HTML. Para construir la vista y generar dinámicamente el HTML, la aplicación usará Thymeleaf.
Paso 3: Implementación del Microservicio
Por último creamos el microservicio greeting-client-service, que proporcionará el valor de la variable serviceURL a ClientGreetingController, el cual a su vez se lo pasará a ClientGreetingService
Ten en cuenta que Greeting–client–service, además de ser un microservicio y auto-registrarse en el registro de servicios (@EnableDiscoveryClient), utilizará Eureka para localizar el microservicio greeting-service.
El contenido del fichero de configuración de este microservicio es el siguiente:
Ya solo queda ejecutar este microservicio y probar que todo funciona correctamente. Comprueba que al levantar el microservicio, aparece registrado en la consola de Eureka
El microservicio client-greeting-service está levantado y escuchando peticiones en el puerto 3333. Accede a http://localhost:3333 y comprueba que visualizas la siguiente pantalla:
Si pinchas en el link de Fetch by Name, el microservicio client-greeting-service llamará a Eureka para localizar el endpoint del microservicio greeting-service y a continuación realizará una petición REST para llamar al método greeting de este servicio pasándole como parámetro un nombre (“Rob”). A continuación muestro el resultado:
Prueba a cambiar el nombre que se pasa como parámetro y comprueba que el resultado devuelto es distinto.
No hay comentarios.