Documente Academic
Documente Profesional
Documente Cultură
Cochabamba – Bolivia
2019
Quiero agradecer en primer lugar a DIOS por
darme la fortaleza y perseverancia para llegar a
este punto, a mi madre que estuvo a mi lado cada
día del presente diplomado, a mi padre que estuvo
apoyándome con las decisiones a tomar y el apoyo
incondicional de mis hermanitos.
Tabla de contenidos
Resumen ..................................................................................................................................... 8
1. Introducción.......................................................................................................................... 9
1.1. Generalidades ................................................................................................................ 10
1.1.1. Antecedentes Generales ............................................................................................ 10
1.1.2. Antecedentes Específicos .......................................................................................... 11
2. Metodología ....................................................................................................................... 11
2.1. Definición del problema.................................................................................................. 11
2.2. Búsqueda de la información .......................................................................................... 11
2.3. Análisis de la información .............................................................................................. 11
3. Definiendo la arquitectura de microservicios .................................................................... 12
3.1. Arquitectura orientada a servicios ................................................................................. 12
3.2. Arquitectura de microservicios ....................................................................................... 13
3.3. Arquitectura monolítica y microservicios ....................................................................... 14
3.4. Beneficios y desventajas de microservicios .................................................................. 15
3.5. Spring cloud y Netflix OSS ............................................................................................. 15
4. Comunicación de microservicios ....................................................................................... 16
4.1. Tipos de comunicación .................................................................................................. 17
4.2. Estilos de comunicación................................................................................................. 19
4.2.1. Comunicación con HTTP y REST .............................................................................. 20
4.2.2. Comunicación en tiempo real ..................................................................................... 20
4.2.3. Comunicación basada en mensajes asíncronos ....................................................... 21
4.2.3.1. Comunicaciones de receptor único ........................................................................ 22
4.2.3.2. Comunicación de receptores múltiples .................................................................. 23
5. Proceso de desarrollo ........................................................................................................ 24
5.1. Flujo de trabajo............................................................................................................... 24
5.2. Microservicios con Spring Boot...................................................................................... 25
5.2.1. Spring Boot Starters ................................................................................................... 25
5.2.2. Spring Boot Autoconfiguración ................................................................................... 26
5.2.3. Gestión de la configuración elegante ......................................................................... 26
5.2.4. Soporte de contenedor de servlets integrado fácil de usar ....................................... 26
5.2.5. Creando una aplicación Spring Boot ......................................................................... 26
5.2.6. Spring Boot desde IDE ............................................................................................... 27
5.3. Spring Cloud: Diseñando la arquitectura de microservicio ........................................... 28
5.3.1. Spring Cloud servidor de configuración ..................................................................... 28
5.3.1.1. Construir servidor de configuración ........................................................................ 29
5.3.1.2. Configurar el servidor de configuraciones .............................................................. 30
5.3.1.3. Configurar la clase Bootstrap ................................................................................. 31
5.3.2. Spring Cloud servicio Discovery ................................................................................ 32
5.3.2.1. Construir el servicio de Spring Eureka ................................................................... 32
5.3.2.2. Configurar el servicio Eureka ................................................................................. 33
5.3.2.3. Configurar la clase Bootstrap ................................................................................. 34
5.3.3. Servicio de enrutamiento con Spring Cloud y Zuul ................................................... 34
5.3.3.1. Construir el servicio de Spring Gateway ................................................................ 35
5.3.3.2. Configurar el servicio Gateway ............................................................................... 36
5.3.4. Bus de eventos ........................................................................................................... 38
5.3.4.1. El intermediario: RabbitMQ..................................................................................... 38
5.3.4.2. RabbitMQ y conceptos de servidor ........................................................................ 39
5.4. Infraestructura de persistencia....................................................................................... 40
5.4.1. Construir el microservicio de la persistencia ............................................................. 41
5.5. Contenerizando microservicios ...................................................................................... 43
5.5.1. Terminología Docker .................................................................................................. 44
55.2. Construyendo aplicaciones desde un contenedor .......................................................... 46
5.6. Infraestructura de Servicios ........................................................................................... 48
5.6.1. FeignClient con Spring Cloud..................................................................................... 48
5.6.2. Implementando el patrón Command .......................................................................... 50
5.6.3. Construir el microservicio ........................................................................................... 51
5.7. Infraestructura de la Interfaz de usuario ........................................................................ 54
6. Conclusiones...................................................................................................................... 57
Bibliografía................................................................................................................................. 58
Contenido de figuras
Figura 1. Despliegue monolítico versus el enfoque de microservicios ........................................... 14
Figura 2: Comparación de la soberanía de datos: base de datos monolítica versus
microservicios ......................................................................................................................................... 17
Figura 3: Patrones y anti-patrones en la comunicación entre microservicios ................................ 19
Figura 4: Usando comunicación por petición/respuesta HTTP (síncrona o asíncrona) ............... 20
Figura 5: Comunicación asíncrona por mensaje en tiempo real uno-a-muchos ........................... 21
Figura 6: Un microservicio recibiendo un mensaje asíncrono ......................................................... 22
Figura 7: Comunicación asíncrona por mensaje basada en eventos ............................................. 23
Figura 8: Flujo de trabajo, paso-a-paso para desarrollar aplicaciones Docker contenerizadas.. 25
Figura 9: Spring Initializer. .................................................................................................................... 27
Figura 10: IDEA JetBrains creando una aplicación Spring Boot. .................................................... 28
Figura 11: Los datos de configuración de la aplicación se leen durante la fase de arranque del
servicio. ................................................................................................................................................... 29
Figura 12: Configuración del pom.xml para el servidor de configuración de Spring Cloud ......... 30
Figura 13: El archivo application.properties de la configuración de Spring Cloud ........................ 31
Figura 14: La clase de arranque para el servidor Spring Cloud Config .......................................... 31
Figura 15: El equilibrio de carga del lado del cliente almacena en caché la ubicación de los
servicios................................................................................................................................................... 32
Figura 16: Configuración del pom.xml para el servicio de Eureka de Spring Cloud ..................... 33
Figura 17: El archivo application.properties del servicio Eureka de Spring Cloud ........................ 34
Figura 18: La clase de arranque para el servicio Spring Cloud Eureka ......................................... 34
Figura 19: Arquitectura del servicio Gateway usando los servicios de registros y configuraciones
.................................................................................................................................................................. 35
Figura 20: La clase de arranque para el servicio Spring Cloud Gateway ...................................... 36
Figura 21: Configuración del pom.xml para el servicio Gateway de Spring Cloud ....................... 37
Figura 22: El archivo application.properties del servicio Gateway de Spring Cloud ..................... 38
Figura 23. Aspectos básicos de publicación/suscripción con un bus de eventos ......................... 38
Figura 24: Infraestructura de comunicación del Servicio y la Persistencia. ................................... 40
Figura 25: Servicio de registro o Eureka de la persistencia. ............................................................ 41
Figura 26: Configuración del pom.xml para la persistencia de Explanations ................................ 41
Figura 27: Archivo de configuración para la persistencia de Explanations .................................... 42
Figura 28: Comunicación con el Config para la persistencia de Explanations .............................. 42
Figura 29: La clase de arranque para la persistencia de Explanations .......................................... 43
Figura 30: Contenedores desplegados en un entorno...................................................................... 43
Figura 31: Compilando la aplicación en un contenedor de construcción. ...................................... 46
Figura 32: Ejecución del comando Maven. ........................................................................................ 46
Figura 33: Ejecución del comando de construcción del Docker ...................................................... 47
Figura 34: Comando del ejecutador del contenedor. ........................................................................ 47
Figura 35: Visualizador de contenedores ejecutados. ...................................................................... 48
Figura 36: Dependencia administrativa de Spring Cloud. ................................................................ 49
Figura 37: Dependencia de FeignClient de Spring Cloud. ............................................................... 49
Figura 38: Configuración del FeignClient. .......................................................................................... 49
Figura 39: Configuración del Cliente Feign. ....................................................................................... 50
Figura 40: Configuración POM del servicio Explanations ................................................................ 52
Figura 41: Configuración YML del servicio Explanations. ................................................................ 53
Figura 42: La clase de arranque para el servicio de Explanations.................................................. 53
Figura 43: Servicio de Registro o Eureka de los servicios. .............................................................. 54
Figura 44: Interfaz de usuario monolítica consumiendo microservicios de backend.................... 54
Figura 45: Configuración del ambiente de la comunicación con Backend. .................................... 55
Figura 46: Comandos de ejecución de la Interfaz de usuario.......................................................... 56
Figura 47: Visualización de la interfaz de usuario de Explanations. ............................................... 56
Contenido de tablas
Tabla 1: Comparación entre Aplicaciones monolíticas y basada en microservicios..................... 13
Tabla 2: Ventajas y desventajas del uso de microservicio ............................................................... 15
Tabla 3: Componentes operacionales................................................................................................. 16
Tabla 4: Conceptos Básicos de RabbitMQ ......................................................................................... 40
Tabla 5: Terminologías con Docker..................................................................................................... 45
Tabla 6: Construcción del patrón Command ...................................................................................... 51
Resumen
Hoy en día es habitual mencionar sobre los proyectos que usan o se basan en arquitecturas de
desarrollo de diferentes manera, uno de los casos más usuales son los microservicios.
Tener habilidades o el conocimientos del por qué o cómo hacerlo con estas arquitecturas es de
suma importancia para todo desarrollador de software, para el cual plantear una arquitectura a
tu aplicación se debe conocer las distintas herramientas que nos brinda el mundo de los
microservicios.
Este trabajo nos muestra una visión general del conocimiento que debemos estar al corriente
sobre las comunicaciones ente diferentes sistemas que utilizan arquitecturas similares y el
proceso iterativo con los servidores que proveen el enlace entre los sistemas.
Se eligió las tecnologías de Spring Cloud para la capa de servicios y Netflix OSS para la capa
de persistencia, teniendo dos arquitecturas funcionales para nuestra aplicación de software,
cabe mencionar también el ciclo de vida del desarrollo de microservicios, el cual se llevara a
cabo los procesos y practicas necesarias de DevOps desde una perspectiva para los
microservicios.
1. Introducción
Cada vez más, las empresas están logrando ahorros en los costes, resolviendo problemas de
despliegue de las aplicaciones y mejorando las actividades de desarrollo y operaciones, con la
utilización de servicios en contenedores. Muchas empresas han desarrollado y liberado
innovaciones con el uso de contenedores para Windows y para Linux, creando grandes
productos que se manejan en la nube, sin importar las plataformas o herramientas que utilicen.
Además, la arquitectura de microservicios está surgiendo como un enfoque importante para las
aplicaciones distribuidas de misión-critica. En una arquitectura basada en microservicios, la
aplicación se construye como una colección de servicios que se puede desarrollar, probar,
desplegar y versionar de forma independiente.
Existen mecanismos extra que es necesario considerar como el Service Discovery, API
Gateway que son temas que se verán más adelante.
Algo tan sencillo como la comunicación entre módulos en el sistema monolítico que solo
consiste en llamar a métodos y funciones de las clases. En microservicios la comunicación se
vuelve un poco más complicada, y requiere de otros elementos que se representarán en la
Comunicación entre Microservicios.
1.1. Generalidades
Los Microservicios es una forma de diseñar aplicaciones de tal forma que puedan ser utilizadas
y desplegadas de forma independiente. Generalmente implementan una funcionalidad atómica
del negocio, facilitan el despliegue automatizado, cuentan con inteligencia de endpoints y tiene
un control descentralizado de lenguajes de programación y motores de base de datos.
Este tipo de arquitecturas surge como dilema y trae una serie de ventajas respecto a las
arquitecturas monolíticas. La principal es la posibilidad de crear sistemas basados en
aplicaciones independientes de pocos recursos, que se despliegan de forma autónoma, que a
su vez se pueden combinar, reutilizar o eliminar, sin que esa modificación afecte al resto de los
componentes o servicios y sin que se produzca ninguna interrupción. Además la configuración
individual nos permite tal flexibilidad, que incluso pueden estar escritos con diferentes lenguajes
de programación.
Los contenedores también aíslan las aplicaciones de otras instaladas en un sistema operativo
(SO) compartido. Las aplicaciones contenerizadas se ejecutan en un host de contenedores
que, a su vez, se ejecuta sobre el sistema operativo (Linux o Windows). Por eso, los
contenedores son significativamente más livianos que las imágenes de máquinas virtuales
(VM).
Utilizar y aprovechar las características principales del framework Spring Cloud y Netflix
OSS, para establecer mecanismos de comunicación entre diferentes tipos de
aplicaciones utilizando REST (Transferencia de Estado Representacional).
2. Metodología
La metodología propuesta para la revisión bibliográfica puede ser aplicada a cualquier tema de
investigación para determinar la relevancia e importancia del mismo y asegurar la originalidad
de una investigación. Además, permitir que otros investigadores consulten las funestes
bibliográficas citadas, pudiendo entender y quizás continuar el trabajo realizado. La
metodología propuesta se compone de tres fases:
Debe ser lo suficientemente clara para poder realizar una búsqueda bibliográfica que responda
a las necesidades del investigador en particular, y que además aporte al estado de la técnica,
de manera que conduzca a un escenario bastante amplio y permita la retroalimentación de la
investigación.
Para el proceso de investigación bibliográfica se debe contar con material informativo como
libros, revistas de divulgación o de investigación científica, sitios Web y demás información
necesaria para iniciar la búsqueda.
La tercera fase es analizar la información ya organizada, indagando sobre cuáles son los
documentos más útiles para la temática en estudio. El análisis de la información es la tarea que
toma más tiempo en la investigación bibliográfica, ya que con ella se espera identificar el aporte
a realizar. En esta fase se debe tener un pensamiento crítico y debe ser realizada en paralelo
con la primera, dado que es un proceso constante. Es un ciclo donde se reafirman las ideas
planteadas en la formulación del problema y si se conoce bien el problema, la solución estará al
alcance.
Los microservicios ofrecen grandes beneficios, pero también plantean enormes desafíos, Los
patrones de arquitectura de microservicios son los pilares fundamentales para crear
aplicaciones basadas en microservicios.
Esos servicios ahora se pueden implementar como contenedores Docker, lo que resuelve
problemas de despliegue, porque todas las dependencias están incluidas en la imagen del
contenedor. Sin embargo, cuando necesite escalar aplicaciones SOA, puede tener problemas
de escalabilidad y disponibilidad si está desplegando en base a hosts Docker únicos. Aquí es
donde el software de gestión de cluster Docker o un orquestador le ayudarán, tal como se
explica en secciones posteriores donde describimos enfoques de despliegue para
microservicios.
¿Por qué una arquitectura de microservicios? En resumen, porque proporciona agilidad a largo
plazo. Los microservicios facilitan el mantenimiento en sistemas complejos, grandes y que
requieren alta escalabilidad, porque permiten crear aplicaciones basadas en muchos servicios,
que se despliegan independientemente y que tienen ciclos de vida granulares y autónomos.
Entre las principales diferencias entre las arquitecturas monolíticas y los microservicios es que,
Una de las principales características de esta arquitectura es que, cada microservicio puede
tener su propia base de datos y el acceso es a través de la interfaz de usuario.
3.4. Beneficios y desventajas de microservicios
Ahora ya sabemos que son los microservicios así como su arquitectura y características
principales. Por ello, vamos a detallar algunas de sus ventajas y desventajas.
Ventajas Desventajas
Divide los componentes de una aplicación en Mayor complejidad, el desarrollo puede ser
varios servicios independientemente, teniendo riesgoso cuando la funcionalidad es muy
diferentes servicios como parte de la compleja para ser fragmentada en servicios
aplicación.
Los componentes de servicio se pueden Mayor gestión, se debe asegurar que todos
implementar en diferentes máquinas virtuales los desarrolladores conozcan cada uno de los
en función a su carga de trabajo. servicios, esto implica un alto nivel de
comunicación del equipo.
Spring Cloud es un nuevo proyecto de la familia spring.io con un conjunto de componentes que
se pueden usar para implementar nuestro modelo de operaciones. En gran medida, Spring
Cloud se basa en componentes de Netflix OSS. Spring Cloud integra los componentes de
Netflix en el entorno de Spring de una manera muy agradable utilizando la configuración
automática y la convención sobre la configuración similar a cómo funciona Spring Boot.
La siguiente tabla asigna los componentes genéricos en el modelo de operaciones a los
componentes reales que usaremos más adelante:
4. Comunicación de microservicios
Esto significa que el modelo conceptual del dominio puede diferir entre subsistemas o
microservicios. Muchas aplicaciones empresariales de gestión de relaciones con los clientes
(CRM – Customer Relationship Management), los subsistemas de compras transaccionales y
los subsistemas de atención al cliente, utilizan cada uno atributos y datos particulares del
cliente, pero cada uno ve al cliente de una forma particular y emplea un sistema autónomo
diferente.
Por otro lado, el enfoque tradicional utilizado en muchas aplicaciones, es tener una base de
datos única y centralizada. A menudo se trata de una base de datos relacional normalizada que
se utilizara para toda la aplicación como se muestra en la Figura 2.
Figura 2: Comparación de la soberanía de datos: base de datos monolítica versus microservicios
Yendo aún más lejos, los microservicios diferentes podrían usar distintos tipos de base de
datos. Las aplicaciones modernas almacenan y procesan diversos tipos de datos y una base de
datos relacional no siempre es la mejor opción. Para algunos casos, una base de datos NoSQL
como MongoDB podría ser un modelo más conveniente y ofrecer un mejor rendimiento y
escalabilidad que un base de datos SQL como SQL server o MySql. Por lo tanto, las
aplicaciones basadas en microservicios a menudo usan una mezcla de base de datos SQL y
NoSQL, que a veces se denomina enfoque de persistencia poliglota
[https://martinfowler.com/bliki/PolyglotPersistence.html].
Los clientes y los servicios pueden tener distintos tipos de comunicación, cada una de los
cuales apunta a un escenario y objetivos diferentes. Inicialmente, esos tipos de comunicación
pueden clasificar en dos ejes o dimensiones.
• Protocolo asíncrono: Otros protocolos como AMQP (un protocolo admitido por muchos
sistemas operativos y entornos de nube) usan mensajes asíncronos. El código del cliente
o el remitente del mensaje generalmente no espera una respuesta. Simplemente envía el
mensaje como cuando se envía un mensaje a una cola de RabbitMQ o cualquier otro
intermediario de mensajes.
• Receptor individual: Cada petición debe ser procesada por exactamente un receptor o
servicio. Por ejemplo para esta comunicación es el patrón Command.
• Receptores múltiples: Cada petición se puede procesar por muchos o ningún receptor.
Este tipo de comunicación debe ser asíncrona. Por ejemplo es el mecanismo de
publicación/suscripción utilizado en los patrones como la arquitectura orientada a
eventos. Esto se basa en una interfaz de bus de eventos o agente de mensajes
(Message broker) al propagar actualizaciones de datos entre múltiples microservicios a
través de eventos; generalmente se implementa a través de un bus de servicio o
artefacto, mediante el uso de los temas y suscripciones del servicio.
Es bueno conocer estas dos dimensiones, para tener claridad sobre los posibles mecanismos
de comunicación, sin embargo, estas no son las preocupaciones importantes al desarrollar
microservicios. Ni la naturaleza asíncrona de la ejecución ni del protocolo seleccionado, son los
puntos importantes al integrar microservicios. Lo importante es poder integrar sus
microservicios de forma asíncrona, manteniendo la independencia entre ellos, como se explica
en la siguiente sección.
Figura 3: Patrones y anti-patrones en la comunicación entre microservicios
Se puede utilizar cualquier protocolo para comunicar y propagar datos de forma asíncrona
entre microservicios. Como se mencionó anteriormente, se podrían usar eventos de integración
con bus de eventos o un message broker o incluso, se podría usar HTTP polling hacia otros
servicios. En realidad, no importa. La importante es no crear dependencias síncronas entre los
microservicios.
En las secciones siguientes se explican los múltiples estilos de comunicación que se pueden
usar en una aplicación basada en microservicios.
Existen muchos protocolos y opciones que pueden usar, según el tipo de comunicación que se
requiera. Si se está usando un mecanismo basado en peticiones/respuesta síncrona, el
protocolo HTTP y el enfoque REST son los más comunes, especialmente si los servicios están
publicados fuera del host Docker o del cluster de microservicios. Para la comunicación interna
entre servicios, también pueden utilizar mecanismos de comunicación binarios, como la
comunicación remota de Service Fabric o WCF utilizando el protocolo TCP. Por otro lado
también se pueden usar mecanismos asíncronos basados en mensajes como AMQP.
Se puede usar un formato no estándar para la comunicación interna entre los microservicios, si
trabaja dentro de un host Docker o clúster de microservicio o para aplicaciones cliente
propietario que hablen con los microservicios.
4.2.1. Comunicación con HTTP y REST
Entre otra posibilidad generalmente para usos diferentes de REST es una comunicación en
tiempo real y uno a muchos con frameworks de nivel superior como Spring Boot y protocolos
como WebSockets.
Como se muestra en la siguiente figura 5, la comunicación HTTP en tiempo real significa que el
servidor puede enviar el contenido a los clientes conectados, a medida que los datos estén
disponibles, en lugar de que el servidor espere las peticiones de nuevos datos por los clientes.
Dado que la comunicación se realiza en tiempo real, las aplicaciones cliente muestran los
cambios casi instantáneamente. Esto generalmente es manejado por un protocolo como
WebSockets, usando muchas conexiones, una por cliente. Un ejemplo típico es cuando un
servicio comunica un cambio en el puntaje de un juego de deportes a muchas aplicaciones web
cliente simultáneamente.
Una de las reglas más importantes que se debe seguir, en la medida de lo posible, es usar solo
mensajes asíncronos entre los servicios internos y usar comunicación síncrona solo desde las
aplicaciones cliente a los servicios de interfaz de usuario (API Gateway más el primer nivel de
microservicios).
Hay dos tipos de mensajería asíncrona: comunicación basada en mensajes de receptor único o
en mensajes de receptores múltiples. En las siguientes secciones entraremos en detalles sobre
ellos.
La comunicación asíncrona basada en mensajes con un receptor único, significa que hay una
comunicación punto a punto que envía un mensaje a exactamente uno de los consumidores
que está leyendo desde el canal y que el mensaje se procesa solo una vez. Sin embargo, hay
situaciones especiales.
Un punto importante es que se puede necesitar comunicación con múltiples microservicios que
están suscritos al mismo evento. Para hacerlo, se pueden usar los mensajes de
publicación/suscripción basados en eventos, como se muestra en la Figura 7. Este mecanismo
de publicación/suscripción no es exclusivo de la arquitectura de microservicios. Es similar a la
forma en que propagan las actualizaciones desde la base de datos de escritura hacia la base
de datos de consulta en el patrón arquitectónico Command and Query Responsibility
Segregation (CQRS). El objetivo es tener una consistencia eventual entre múltiples fuentes de
datos en un sistema distribuido.
Cuando se usa un bus de eventos, se puede usar un nivel de abstracción (como una interfaz de
bus de eventos) basado en una implementación usando la API de un message broker como
RabbitMQ. También se puede usar un bus de servicio de nivel superior como NServiceBus,
MassTransit o Brighter para coordinar el bus de eventos y el sistema de
publicación/suscripción.
5. Proceso de desarrollo
Como se mencionó en secciones anteriores, se puede hacer uso del Framework Spring Cloud y
Spring Boot para el desarrollo del proyecto ya sea open source para desarrollar aplicaciones en
contenedores Docker. Se puede desarrollar en Java cuando se apunta a contenedores Linux o
Windows, dependiendo de cuál Framework se utilice.
Cada contenedor (una instancia de una imagen Docker) incluye los siguientes componentes:
Esta sección describe el flujo de trabajo del bucle interno para el desarrollo de aplicaciones
basadas en contenedores Docker. El bucle interno significa que no tiene en cuanta el flujo de
trabajo de DevOps más amplio (que puede incluir hasta el despliegue en producción) y solo se
centra en el trabajo de desarrollo realizado en la máquina del desarrollador. No se incluyen el
paso inicial para configurar el entono, ya que se realizan solo una vez.
Una aplicación se compone de los servicios propios más las librerías adicionales. Los
siguientes son los pasos básicos que por lo general son necesarios para construir una
aplicación Docker, como se ilustra en la Figura 8.
Figura 8: Flujo de trabajo, paso-a-paso para desarrollar aplicaciones Docker contenerizadas
Spring es un framework basado en Java el cual es el más popular para crear aplicaciones
empresariales. El framework Spring Boot proporciona un ecosistema de proyectos para abordar
las necesidades de aplicaciones modernas, como seguridad, acceso simplificando a las bases
de datos relacionales y No relacionales, procesamiento por lotes, integración con sitios de
redes sociales, procesamiento de flujos de datos, etc. Como Spring es un framework muy
flexible y personalizable, generalmente hay varias formas de configurar la aplicación. Aunque
es bueno tener múltiples opciones.
Spring Boot resuelve el problema de aplicaciones que necesitan una configuración compleja
mediante el uso de su poderoso mecanismo de configuración automática.
Como se puede observar en la anterior figura, que es posible crear un proyecto basado en
Maven o Gradle, también se puede definir el lenguaje del proyecto el cual puede ser Java,
Kotlin o Grovy, también se elige la versión de Spring Boot y el namespace además del nombre
del proyecto, adicionalmente se puede seleccionar las dependencias del proyecto.
En la sección de Spring Boot demuestra las versiones más actuales que prefiera conveniente,
también demuestra el buscador de las dependencias que desee utilizar en su nuevo proyecto,
una vez configurado el proyecto, con la opción “Generate the project”, iniciara la descarga
respectiva del proyecto pre-configurado, el cual se podrá importar en cualquier IDE de soporte
Maven o Gradle.
La aplicación tiene que ser recompilada y/o redistribuida. Para evitar esto, es aconsejable
separará completamente la información de configuración del código de la aplicación. Esto
facilita la realización de cambios en la configuración sin pasar por un proceso de compilación,
pero también introduce complejidad porque ahora tiene otro artefacto que necesita ser
administrado y desplegado con la aplicación.
Figura 11: Los datos de configuración de la aplicación se leen durante la fase de arranque del servicio.
En la Figura 12 se ocupa de declarar las dependencias específicas de Spring Cloud que usará
en el servicio. La primera dependencia es el spring-cloud-starter-config, el cual es usado para
todos los proyectos Spring Cloud. La segunda dependencia es el spring-cloud-config-server
arrancador del proyecto.
Figura 12: Configuración del pom.xml para el servidor de configuración de Spring Cloud
Lo primero que debe hacer es configurar un nuevo directorio, el cual será de almacenaje de los
archivos de configuración de los microservicios.
Esta clase de bootstrap contendrá dos cosas: un método main() de Java que actúa como punto
de entrada para el inicio del Servicio y un conjunto de anotaciones de Spring Cloud que le
indican al servicio de inicio para qué tipo de comportamientos de Spring Cloud se lanzará el
servicio, como se puede apreciar en la Figura 14.
Para comenzar sobre la arquitectura del servicio Discovery, necesitamos entender cuatro
conceptos. Estos conceptos generales se comparten en todas las implementaciones de dicho
servicio:
• Búsqueda de cliente de la dirección del servicio: ¿Cuáles son los medios por los cuales
un cliente del servicio busca información sobre el servicio?
Figura 15: El equilibrio de carga del lado del cliente almacena en caché la ubicación de los servicios
En esta sección, configurará nuestro servicio Eureka propio de Netflix OSS utilizando Spring
Boot. Al igual que el servicio de configuración de Spring Cloud, la configuración de un servicio
Spring Cloud Eureka comienza con la construcción de un nuevo proyecto de Spring Boot y la
aplicación de anotaciones y configuraciones. Comencemos con su Maven pom.xml.
La siguiente Figura 16 el cual muestra las dependencias de servicio de Eureka que necesitará
para el proyecto Spring Boot que está configurando.
Figura 16: Configuración del pom.xml para el servicio de Eureka de Spring Cloud
Cada servicio registrado con Eureka tendrá dos componentes asociados: el ID de la aplicación
y el ID de la instancia. El ID de la aplicación se utiliza para representar una instancia de servicio
de grupo. En un microservicio basado en Spring-Boot, el ID de la aplicación siempre será el
valor establecido por la propiedad spring.application.name. Para el servicio de su organización,
su spring.application.name se denomina creativamente servicio de organización. El ID de
instancia será un número aleatorio destinado a representar una única instancia de servicio.
Figura 17: El archivo application.properties del servicio Eureka de Spring Cloud
Solo usa una nueva anotación para decirle a su servicio que sea un servicio de Eureka; el cual
es @EnableEurekaServer. En este punto, puede iniciar el servicio Eureka ejecutando el mvn
spring-boot: ejecute el JAR o ejecute docker-compose para iniciar el servicio. Una vez que se
ejecuta este comando, tendrá un servicio Eureka en ejecución sin servicios registrados en él.
En una arquitectura distribuida como una de microservicios, véase la Figura 19; llegará un
punto en el que deberá asegurarse de que se produzcan comportamientos clave como la
seguridad, el registro y el seguimiento de los usuarios en múltiples llamadas de servicio. Para
implementar esta funcionalidad, deseará que estos atributos se apliquen de manera consistente
en todos sus servicios sin la necesidad de que cada equipo de desarrollo cree sus propias
soluciones.
Spring Cloud se integra con el proyecto de código abierto Zuul de Netflix. Zuul es una puerta de
enlace de servicios que es extremadamente fácil de configurar y usar a través de las
anotaciones de Spring Cloud. Zuul ofrece una serie de capacidades, incluyendo
• Mapeo de las rutas de todos los servicios en su aplicación a una única URL (cada punto
final del servicio obtiene su propia asignación de rutas).
• Creación de filtros que pueden inspeccionar y actuar sobre las solicitudes que llegan a
través de la puerta de enlace.
Figura 19: Arquitectura del servicio Gateway usando los servicios de registros y configuraciones
Para construir un servidor Zuul, debe configurar un nuevo servicio Spring Boot y definir las
dependencias de Maven correspondientes. Afortunadamente, poco se necesita para la
configuración de Zuul en Maven, Solo necesita definir una dependencia en su archivo pom.xml:
spring-cloud-starter-zuul, como se puede apreciar en la Figura 21; esta dependencia le dice al
framework Spring Cloud que este servicio se ejecutará Zuul e inicializa a Zuul apropiadamente.
La cola de mensajes permite a los servidores web responder a las solicitudes de forma rápida
en lugar de verse obligados a realizar en el lugar procedimientos con muchos recursos.
Aquí hay algunos conceptos importantes que deben describirse para profundizar en RabbitMQ.
El cual es bueno tener una idea de lo que es.
Articulo Conceptos
Cuando se utiliza base de datos relacionales como MySQL, SQL Server, Oracle o PostgreSQL,
un enfoque recomendado es implementar la capa de persistencia simplificando las
transacciones en su base de datos.
Para nuestro caso se tendrá una arquitectura basada en microservicios para la infraestructura
de la persistencia y de la misma manera para la infraestructura de los servicios del proyecto,
para ello se puede apreciar la Figura 24.
De manera repetitiva, realizamos el mismo proceso para los siguientes microservicios como ser
de Notifications, Security y entre otros futuros microservicios interconectados en dicha
arquitectura de persistencia.
Las imágenes Docker pueden correr de forma nativa en Linux o Windows, sin embargo, las
imágenes solo se pueden ejecutar en host Linux, entendiendo host como un servidor o una
máquina virtual.
5.5.1. Terminología Docker
En esta sección se presentan los términos y definiciones que debe manejar antes de entrar en
profundidades con Docker.
Conceptos Terminología
Otro beneficio de Docker es que puede construir su aplicación desde un contenedor pre-
configurado, como se muestra en la Figura 31, por lo que no necesita crear una máquina o
máquina virtual para construir su aplicación. Puede usar o probar ese contenedor ejecutándolo
en su máquina de desarrollo. Pero lo que es aún más interesante es que puede usar el mismo
contendor de compilación desde su proceso integración continua.
Entonces tendremos nuestro Docker construido y solo queda ejecutarlo, teniendo en cuenta
con la identificación de nombres únicos del contenedor, para nuestro caso la arquitectura de la
persistencia usaremos los contenedores de MySQL y MongoDB de igual manera con el
RabbitMQ. Podemos observar en la siguiente Figura 34; el comando de ejecución del Docker
con el microservicio.
De ese modo se debe realizar con todos los microservicio como podemos apreciar en la
siguiente Figura 35, donde los servicio de la persistencia estarán ejecutados en base a
contenedores con las configuraciones apropiadas los cuales facilitan con Spring Cloud, como
conclusión se puede apreciar la Figura 25 del servicio de Eureka.
Figura 35: Visualizador de contenedores ejecutados.
FeignClient es una librería para la creación de clientes de API REST de forma declarativa.
Entonces, en lugar de codificar manualmente los clientes para la API remota y tal vez usar
Spring RestTemplate declarando una definición de dicho cliente y el resto se genera durante el
tiempo de ejecución para su uso.
Ahora, podemos agregar la dependencia a Feign con el arrancador clásico de Spring Boot
véase la Figura 37.
Los FiegnClient utiliza un enfoque declarativo para acceder a la API. Para usarlo, primeramente
debemos habilitar el soporte de Spring Cloud en nuestra aplicación Spring Boot con la
anotación @EnableFeignClients en el nivel de clase Bootstrap, véase la Figura 38.
Ahora, podemos inyectar el nuestro cliente con nuestro código como cualquier otro Spring
Bean. En el inicio, Spring Cloud configurara el cliente Feign para nosotros y nos dará un Spring
Proxy regular para que podamos comenzar a trabajar con el extremo remoto.
El patrón de command es una solicitud para que el sistema realice una acción que cambie el
estado del sistema. Los comandos son imprescindibles y se deben procesar solo una vez.
Los comandos se pueden originar desde la interfaz del cliente Feign, como resultado de un
usuario que inicia una petición o desde un administrador de procesos, cuando este le está
pidiendo un agregar o actualizar para realizar dicha acción.
Es importante que solo se procese una vez. Un comando es idempotente si se puede ejecutar
varias veces sin cambiar el resultado, ya sea por la naturaleza del comando o por la forma en
que el sistema lo maneja.
Es una buena practica hacer que sus comandos y actualizaciones sean idempotentes, cuando
tenga sentido bajo las reglas en invariantes del negocio en su dominio. Por ejemplo, para el
comando CreateMessageCmd llega a su sistema varias veces, debe poder identificarlo y
asegurarse de no crear varias órdenes.
Se debe tomar en cuenta la compatibilidad con las versiones de Spring Boot y Spring Cloud,
cada microservicio implementado se registrara en el servicio de Eureka para ello en necesario
realizar la configuración adecuada para la intercomunicación del servicio, como se puede
apreciar en la Figura 41.
Figura 41: Configuración YML del servicio Explanations.
De igual manera, con el resto de los servicios que presenta nuestro proyecto, cuando todos los
microservicios estén funcionando en una misma arquitectura, estarán registradas en el servicio
de Eureka de la siguiente manera, véase la Figura 43.
Figura 43: Servicio de Registro o Eureka de los servicios.
Como se presentó anteriormente, lo primero que se tiene que hacer en cada proyecto de
microservicio es agregar o crear los servicios de configuración, de registro y del enrutamiento,
básicamente independientes de otros microservicios.
La arquitectura de microservicios a menudo comienza con el manejo de los datos y la lógica del
lado del servidor. Sin embargo, un enfoque más avanzado es diseñar la interfaz de usuario (UI)
basada también en microservicios. Eso significa tener una interfaz de usuario compuesta
producida por los microservicios, en lugar de tener microservicios en el servidor y una
aplicación monolítica que consuma los microservicios. Con este enfoque, se pueden construir
microservicios completos, que incluyan tanto la lógica como la presentación visual.
Para concluir, tenemos como resultado nuestro proyecto funcional con tres arquitecturas
basadas en microservicios intercomunicados de manera independientes o por capas a nivel de
persistencia, a nivel de servicios y de aplicación. Ahora se podrá realizar la visualización de
nuestra respectiva interfaz de usuario, como se puede apreciar en la Figura 47.
La curva de aprendizaje del framework Spring Boot no es compleja y se tiene una gran
comunidad de desarrolladores, que ofrecen una amplia gama de librerías que aceleran la
construcción de microservicios. Además Spring Boot es open source.
La arquitectura de microservicios nos brinda muchas ventajas, entre las principales se tiene:
Eureka Netflix. (2018, Octubre 21). service registration and discovery. Recuperado el Octubre
2018, de spring.io: https://spring.io/guides/gs/service-registration-and-discovery/
Publish/Subscribe Channel
http://www.enterpriseintegrationpatterns.com/patterns/messaging/PublishSubscribeChannel.htm
l
Hystrix. (2018, Octubre 21). circuit-breaker. Retrieved Octubre 2018, from spring.io:
https://spring.io/guides/gs/circuit-breaker/