MicroServicios , una de las palabras más de moda en estos días. Todo el mundo quiere entender como funcionan estas nuevas arquitecturas. Hasta hace no mucho tiempo la mayor parte de los desarrollos se han hecho usando métodos muy standard. En el caso de Java desplegando aplicaciones a través de EARs y WARs. Cada una de estas aplicaciones era independiente. Podemos usar nuestro servidor y borrar y volver a desplegar la aplicación.
¿Son realmente independientes las aplicaciones?
La teoría nos dice que sí, que cada aplicación se ejecuta de forma independiente y es autónoma. La realidad es un poco más dura. Imaginemos que tenemos que desplegar una nueva aplicación y queremos compartir los jars para otras futuras aplicaciones. Tendremos que parar nuestro servidor y volverlo a lanzar para usar un shared lib, así que todas las aplicaciones pararán. Si una aplicación genera PDFs muy pesados quizás tengamos que cambiar los parámetros de la JVM y dar más memoria y volver a arrancar el servidor. Puede que nuestro servidor necesite mas hilos de ejecución porque una aplicación lo demande. Puede que la nueva aplicación que despleguemos se coma la memoria o la CPU de todas . Puede … pueden ocurrir muchas cosas. Así que nuestras aplicaciones no son tan independientes como parecen al estar albergadas en el mismo servidor.
Servidores y Aplicaciones
Cuando nuestras aplicaciones son sencillas y de poca importancia solemos tener varias en el mismo servidor de aplicaciones. Pero cuando las cosas se ponen serias y tenemos clientes con un alto nivel de exigencia las cosas cambian . No es fácil decir a alguien que hemos reiniciado un servidor por la aplicación de al lado y no la suya. Así pues en más de una ocasión me he encontrado en arquitecturas que tienen una aplicación grande por servidor y punto.
Es algo que al principio sorprende, pero con el paso de los años uno entiende que los administradores de sistemas tienen muchas, muchas tareas que hacer y necesitan reducir los riesgos y sobre todo aislarlos. Esa es una de lass claves , aislar las aplicaciones y hacer que cada aplicación sea completamente independiente y no influya en las otras. Es algo que suena sencillo , pero que no lo es. Tendremos muchas cosas que cambiar y habrá que ir con calma.
¿Qué es una aplicación?
Esta es una pregunta interesante, simplificando mucho podríamos decir que para un desarrollador Java es un WAR o un EAR que se despliega y realiza una funcionalidad X . Para el usuario simplemente serán las pantallas que realizan esa funcionalidad X , no le es necesario conocer el concepto de WAR.
Aplicaciones y Movilidad
¿Realmente una aplicación es un WAR ?. Vamos a suponer que desplegamos nuestra aplicación WAR y como estamos en un desarrollo moderno dispone de varios servicios REST a los cuales ligamos aplicaciones móviles.
¿Cuantas aplicaciones tenemos? Bueno tenemos 5 aplicaciones 4 aplicaciones móviles y el WAR. ¿Son 5 de verdad?. Si preguntamos a los usuarios estos nos dirán que tenemos 4 aplicaciones móviles. Es un punto sobre el cual reflexionar porque para un usuario el war no existe. Las cuatro aplicaciones serán diferentes y no aceptará de muy buen grado que paremos la aplicación A porque hay que reinstalar la B ya que tenemos que redesplegar el WAR. Eso no es fácil de asumir .
¿Qué es realmente una aplicación?. Una aplicación es un grupo de funcionalidad que genera un flujo de trabajo útil para el usuario y que se puede desplegar de forma aislada. Quizá no es la mejor definición pero cada día pienso que el concepto de “aislada” es CLAVE.
Aplicaciones y MicroServicios
Si queremos solventar el problema anterior y contentar a nuestros usuarios deberemos desplegar 4 WARS independientes a los cuales nuestras aplicaciones móviles se conecten.
Sin embargo con esta solución tampoco tendremos todo resuelto ya que todos los wars dependen del mismo servidor y como antes comente no son tan independientes como parecen en un primer momento.
Si queremos tener servicios realmente independientes tendremos que desplegar una solución como Docker basada en contenedores y en cada contenedor un WAR. De esta forma conseguiremos un aislamiento total.
MicroServicios y problemas
Este es una de las cosas que hará que cada día pensemos más en el mundo de los Microservicios. Las aplicaciones móviles presionarán sobre la evolución de nuestra arquitectura. Estas aplicaciones dependen de servicios y estos servicios deben de poderse desplegar de forma aislada. Sin este enfoque las labores de sistemas se complicarán cada día más.
Los MicroServicios aportan mucho pero también implican abordar muchos retos. El primer problema importante es que no es solo una decisión de si Spring MVC o JSF. Esas decisiones siempre han pertenecido al mundo del desarrollo. Ahora las decisiones afectaran de una forma importante al departamento de sistemas que es quien despliega y es muy posible que ellos sean los que tengan que tomar la decisión final . Los MicroServicios tienen muchos temas todavía que clarificar , transaccionalidad , modularidad , servicios transversales etc. Pero cada día esta más claro que han venido para quedarse.
Otros artículos relacionados : Java EE MicroServices con Payara ,Reactive MicroServices y Arquitectura , JAX-RS Client y JSON
Recomendarías la implementacion de microservicios a un Colegio de tamaño promedio?
Es una pregunta compleja . Pero si yo tuviera que decidir diría que el negocio de un colegio parece sencillo y no lo es para nada . Las notas las evaluaciones etc . Creo que haría una aplicación monolito pero que pudiera madurar hacia arquitecturas de MicrosServicios . Es decir la construiría con dos o tres módulos principales
Muchas gracias 🙂
De nada 🙂
Buen día Cecilio
Soy fan de tu blocg
Tengo una duda muy grande. Seria recomendable poner toda la lógica en microservicios y toda la parte de front end en otro proyecto con html5. Pero todo esta solución tanto los mircroservicios y el proyecto de front end se ejecutaría en una misma red local.
Es recomendable poner este tipo de arquitectura de microservicios en una red local.
Otra pregunta no afecta la red por el tema que proyecto de front end en html5 en consumir todos estos microservicios no pegaría en el performance.
Saludos Cordiales
El tema de los microservicios ,esta más ligado a las tareas de mantenimiento . Es decir muchos administradores preferirian tener un servidor de aplicaciones por aplicación y algo falla reinician ese servidor y punto. Ese es uno de los puntos fuertes de los microservicios que implementan esa funcionalidad. Sino tienes ese tipo de necesidad no son tan críticos
[…] artículos relacionados: JAX-RS Client y Servicios REST El porqué de los MicroServicios ,Seguridad y […]
Cecilio, muchas gracias.
Haré esa propuesta, no lo habíamos considerado!
Y excelente Blog.
Feliz Año.
Saludos desde Venezuela!!
De nada , feliz año Gustavo 🙂
“Aislamiento” concepto interesante de los microservicios. Personalmente el enfoque del los microservicios lo comprendía por el lado de la sus características como bean, ser un componente distribuido bien cohesionado.
¿Que herramientas permiten crear microservicios con la capacidad de deploy independiente? porque la alternativa mostrada en el post es costosa y entiendo que es solo un ejemplo.
La esencia de los microservicios es que sean independientes, y pueden ser detenidos o deployados sin interferir en los demás microservicios que viven en el servidor.
De antemano muchas gracias por a respuesta y feliz año
Docker y Kubernetes son dos herramientas asociadas a estas arquitecturas, feliz año igualmente 😉
Hola Cecilio. Excelente Blog, para mi es una referencia sobre el mundo de Java. Off topic, tengo una duda, ¿Recomendarías Java para una Startup? Es que somos 5 desarrolladores y tenemos una idea sobre una plataforma web educativa. Y aún no decidimos que Lenguaje/Framework/Entorno utilizar, sin mentir, cada uno de nosotros tiene una propuesta diferente (Node.Js, ASP.NET, Java, Python y Go). Actualmente estamos levantando todos los requerimientos funcionales y no funcionales. Debo agregar tres cosas: 1. No queremos invertir en la compra de licencias, 2. Habrá un módulo en nuestro proyecto que incorporará OpenCV, ya que pensamos procesar el rostro… Read more »
Felices Fiestas 😉 . Nunca hay una solución única , pero yo te dejaría una idea .Si cada uno de vosotros quiere uno diferente quizás tengais que llegar a un acuerdo. Una posible solución es hacer un cliente grande con Angular ,React o Vue que son JavaScript puro y todos os manejareis y dejar la parte servidor más pequeña. Si yo tuviera que elegir tecnología servidor probablemente optaría o por Java o por .NET ya que son los que más apoyos tienen y sus plataformas tienen una fuerte homegeneidad entre productos.
Buen dia sr Álvarez, interesante artículo. Deseo profundizar en el tema de MicroServices en java ¿Qué literatura me recomienda?
Feliz Navidad y muchas gracias.
Spring Microservices de Pack publishing está bien 😉