Migración de una aplicación monolítica de backend a una arquitectura de microservicios - 1ª parte

Imagen destacada de la aplicación de migración

Por lo general, el software de las empresas se construye en un sistema de tres partes: un lado del cliente/interfaz de usuario, una base de datos y una aplicación de servidor lateral llamada monolito. Los monolitos suelen construirse como un único ejecutable lógico, en un solo nivel con múltiples capas: presentación, lógica de negocio y acceso a datos. Estas aplicaciones son fáciles de diseñar y desarrollar, aunque son difíciles de mantener y hacer evolucionar, lo que las hace tecnológicamente bloqueadas y no adaptadas a la nube. Para seguir la evolución del Cloud Computing y de la Arquitectura Orientada a Servicios (SOA), los microservicios (MS) han surgido de forma natural como la siguiente tendencia debido a las ventajas que proporcionan. Estos Las ventajas incluyen una mayor capacidad de mantenimiento, una mejor escalabilidad y una mejor sinergia general con técnicas DevOps. Esto hace que la migración del software heredado hacia una arquitectura orientada a los microservicios (MSA) sea una perspectiva atractiva para las organizaciones.

Comparación de la arquitectura monolítica y de microservicios
Figura 1: Comparación entre la arquitectura monolítica y la de microservicios

¿Qué son los microservicios?

La arquitectura orientada a los microservicios es un estilo de arquitectura para desarrollar una única aplicación como un conjunto de pequeños servicios, cada uno de los cuales se ejecuta en su propio proceso y se comunica con mecanismos ligeros (recurso HTTP, API). Estos servicios se construyen en torno a las capacidades del negocio y se pueden desplegar de forma independiente mediante una maquinaria de despliegue totalmente automatizada. Hay un mínimo de gestión centralizada de estos servicios, que pueden estar escritos en diferentes lenguajes de programación y utilizar diferentes tecnologías de almacenamiento de datos.
Las MSA pueden ser más complejas de organizar y pueden aumentar los requisitos tecnológicos y el uso de la red, aunque muestran una gran adaptabilidad tecnológica, modularidad, alta escalabilidad, reutilización y pueden ser desarrolladas de forma independiente por pequeños equipos.
La arquitectura de microservicios es más compleja de organizar y con mayores requisitos tecnológicos y de uso de la red, sin embargo, muestra una alta adaptabilidad tecnológica, modularidad y acoplamiento suelto, es altamente escalable, reutilizable y puede ser desarrollada de forma independiente en pequeños equipos.

¿Cómo avanzamos hacia los microservicios?

La arquitectura de migración de aplicaciones monolíticas a microservicios puede dividirse en dos pasos.
El primer paso es identificar una arquitectura orientada a los microservicios a partir del código fuente del monolito. Su principal objetivo es extraer la arquitectura de la aplicación objetivo para ayudar a los arquitectos a modernizar su aplicación.
El segundo paso es transformar el código fuente existente en uno que implemente el MSA identificado. Esa es la materialización.

El proceso de dos etapas de la migración hacia un MSA
Figura 2: El proceso de dos etapas de la migración hacia un AMS

Fase de recuperación: Enfoque de identificación por capas

Este primer paso consiste en identificar y reorganizar las funcionalidades del monolito en clases para proponer un conjunto de candidatos a microservicios que guíen la fase de transformación. Sin embargo, no todas las clases son iguales, algunas son estructurales y otras están orientadas a los datos. Proponemos un enfoque de identificación que tiene en cuenta ambas funciones.

El enfoque de identificación por capas aprovecha patrones de diseño y antipatrones bien establecidos para guiar el proceso de identificación de microservicios. Nuestro enfoque tiene en cuenta estos patrones y antipatrones de diseño y propone una proceso de identificación en tres pasos:

  • Recuperar los artefactos OO de la fuente OO.
  • Categorizar los artefactos OO en diferentes capas de la arquitectura (presentación, negocio y acceso a datos).
  • A partir de los artefactos extraídos de la arquitectura de capas internas, se identifican los candidatos a microservicio mediante un enfoque de agrupación automática.

Analizamos la capa de presentación del monolito para determinar el punto final de cada funcionalidad de negocio y, a continuación, aplicamos una descomposición vertical a estos puntos finales con el fin de encontrar las clases necesarias para implementar cada funcionalidad como un microservicio. En este proceso, también definimos un contexto delimitado de la capa de acceso a los datos para cada microservicio.

Recuperación de la arquitectura por capas mediante ingeniería inversa

Identificar los candidatos a microservicio, tenemos que extraer los artefactos de la arquitectura por capas del código existente de la aplicación monolítica. Se trata de identificar sus elementos estructurales y la relación entre ellos mediante el análisis del código fuente existente. A partir de estos artefactos, se puede revelar la arquitectura por capas mediante técnicas de ingeniería inversa. Para facilitar el proceso de etiquetado y representar la arquitectura por capas extraída, proponemos el Metamodelo de Arquitectura por Capas (LAMM) que se presenta en la figura siguiente.

Metamodelo de arquitectura por capas (LAMM)
Figura 3: Metamodelo de arquitectura por capas (LAMM)

Este metamodelo puede dividirse en tres puntos de vista:

  • Arquitectura por capas: responsable de representar la típica arquitectura de 3 capas (presentación, lógica de negocio y acceso a datos).
  • DI/IoC: responsable de representar el mecanismo de desacoplamiento para crear artefactos de capas de alta cohesión.
  • Persistencia de datos: responsable de representar los distintos tipos de datos que se encuentran en las aplicaciones web.

Se aplica un proceso semiautomático para colocar las clases de la aplicación en una de estas tres, mapeándolas a una de las entidades LAMM. Una vez que hemos mapeado las clases en la entidad apropiada, analizamos las dependencias con sus contrapartes de capa. Una vez que todas las entidades y su relación han sido mapeadas al modelo LAMM, comienza el paso de identificación del microservicio.

Proceso de identificación de microservicios mediante artefactos extraídos

Utilizamos un algoritmo de clustering jerárquico para crear un dendrograma que se corta siguiendo un algoritmo de profundidad-primera y se presenta al usuario para su validación.
Para guiar la agrupación, combinamos dos medidas de similitud. La primera medida calcula la cohesión estructural entre las clases de un candidato a microservicio y produce una similitud que promueve la cohesión estructural premiando los clusters en los que hay más relaciones internas. Cuando se aplique a nuestro modelo LAMM, propondrá idealmente una descomposición que favorezca los microservicios verticales centrados en las capacidades del negocio y limitará el riesgo de crear cortes erróneos. La segunda medida calcula la cohesión de datos de un candidato a microservicio para favorecer los clústeres con clases que manipulan la misma clase y promover los clústeres que son autónomos de datos. Cuando se aplica a un algoritmo de clustering, propondrá idealmente una descomposición que favorezca la agrupación de clases que manipulan los mismos datos y limitará el riesgo de crear una Persistencia Compartida entre microservicios creando una propiedad de datos.

Figura 4: Ejemplo de dendograma
Figura 4: Ejemplo de dendograma
ejemplo de descomposición
Figura 5: Ejemplo de descomposición según nuestro enfoque

La principal contribución de este enfoque basado en modelos es la identificación de microservicios a partir del código fuente original. El enfoque propuesto aprovecha la arquitectura interna en capas de las aplicaciones monolíticas al tiempo que proporciona una herramienta de visualización para ayudar a los expertos en la validación de la identificación.
La arquitectura interna suele detallarse en el código fuente a través de anotaciones de clases, espacios de nombres y archivos de configuración. El enfoque propuesto utiliza la arquitectura en capas para descomponer verticalmente un monolito y minimizar el acoplamiento entre los microservicios. En particular, pudimos demostrar que la adición de artefactos sobre la arquitectura en capas de la aplicación monolítica tuvo un impacto positivo en el proceso de identificación.
En futuros trabajos, pretendemos ampliar nuestro enfoque de identificación para integrar la refactorización, el empaquetado y el despliegue del MSA identificado. Para fortalecer aún más nuestra validación, tenemos la intención de utilizar este enfoque de migración de extremo a extremo para generar y evaluar la calidad de nuestro MSA en tiempo de ejecución.

Para continuar...

Referencias

[1] J. Lewis y M. Fowler, "Microservicios: una definición de este nuevo término arquitectónico", https://martinfowler.com/articles/microservices.html,
2014, consultado: 2020-06-20.
[2] L. Bass, I. Weber y L. Zhu, DevOps: A Software Architect's Perspective. Addison-Wesley Professional, 05 2015.
[3] N. Dragoni, S. Giallorenzo, A. L. Lafuente, M. Mazzara, F. Montesi, R. Mustafin y L. Safina, Microservicios: Yesterday, Today, and Tomorrow. Cham: Springer International Publishing, 2017, pp. 195- [En línea]. Disponible: https://doi.org/10.1007/978-3-319-67425-4 12
[4] C. Richardson, Microservices Patterns: Con ejemplos en Java. Manning Publications, 2018. [En línea]. Disponible: https://books.google.de/books?id=UeK1swEACAAJ
[5] D. Taibi, V. Lenarduzzi y C. Pahl, Microservices Anti-patterns: A Taxonomy. Cham: Springer International Publishing, 2020, pp. 111- [En línea]. Disponible: https://doi.org/10.1007/978-3-030-31646-4 5
[6] O. Al-Debagy y P. Martinek, "A microservice decomposition method through using distributed representation of source code", Scalable Comput. Pract. Exp., vol. 22, nº 1, pp. 39-52, 2021. [En línea]. Disponible: https://www.scpe.org/index.php/scpe/article/view/1836
[7] T. Lutellier, D. Chollak, J. García, L. Tan, D. Rayside, N. Medvidovic y R. Kroeger, "Comparing software architecture recovery techniques using accurate dependencies", en 2015 IEEE/ACM 37th IEEE International Conference on Software Engineering, vol. 2, 2015, pp. 69-78.
[8] Z. Wen y V. Tzerpos, "An effectiveness measure for software clustering algorithms", en 12th International Workshop on Program Comprehension (IWPC 2004), 24-26 de junio de 2004, Bari, Italia. IEEE Computer Society, 2004, pp. 194-203. [En línea]. Available: https://doi.org/10.1109/WPC.2004.1311061
[9] D. M. Le, P. Behnamghader, J. García, D. Link, A. Shahbazian y N. Medvidovic, "An empirical study of architectural change in opensource software systems", en 2015 IEEE/ACM 12th Working Conference on Mining Software Repositories, 2015, pp. 235-245.
[10] B. Pourasghar, H. Izadkhah, A. Isazadeh y S. Lotfi, "A graph-based clustering algorithm for software systems modularization", Information and Software Technology, vol. 133, p. 106469, 2021. [En línea]. Disponible: https://www.sciencedirect.com/science/article/pii/S0950584920302147
[11] W. Jin, T. Liu, Q. Zheng, D. Cui y Y. Cai, "Functionality-Oriented Microservice Extraction Based on Execution Trace Clustering", en 2018 IEEE International Conference on Web Services (ICWS), no. Octubre. IEEE, jul 2018, pp. 211-218. [En línea]. Disponible: https://ieeexplore.ieee.org/document/8456351/
[12] Y. Zhang, B. Liu, L. Dai, K. Chen y X. Cao, "Automated Microservice Identification in Legacy Systems with Functional and Non-Functional Metrics", en 2020 IEEE International Conference on Software Architecture (ICSA). IEEE, mar 2020, pp. 135-145. [En línea]. Disponible: https://ieeexplore.ieee.org/document/9101217/
[13] J. García, I. Krka, C. Mattmann y N. Medvidovic, "Obtaining groundtruth software architectures", en 2013 35th International Conference on Software Engineering (ICSE), 2013, pp. 901-910.
[14] C. Pahl y P. Jamshidi, "Microservicios: A Systematic Mapping Study", en Proceedings of the 6th International Conference on Cloud Computing and Services Science, M. Cardoso, J y Ferguson, D y Munoz, VM y Helfert, Ed. SCITEPRESS - Publicaciones de Ciencia y Tecnología, 2016, pp. 137-146.
[15] P. D. Francesco, I. Malavolta y P. Lago, "Research on Architecting Microservices: Trends, Focus, and Potential for Industrial Adoption", en 2017 IEEE International Conference on Software Architecture (ICSA), IEEE; Goteborgs Stad; Chalmers Univ Technol, Prod; Software Ctr; IEEE Comp Soc; Chalmers Univ Technol, Informat & Commun Technol; Chalmers Univ Technol, Energy; Chalmers Univ Technol, Transport; Systemite; Google; Jeppesen. IEEE, apr 2017, pp. 21-30. [En línea]. Disponible: http://ieeexplore.ieee.org/document/7930195/
[16] J. Fritzsch, J. Bogner, A. Zimmermann y S. Wagner, "From monolith to microservices: A classification of refactoring approaches", en Software Engineering Aspects of Continuous Development and New Paradigms of Software Production and Deployment - First International Workshop, DEVOPS 2018, Chateau de Villebrumier, France, March 5-6, 2018, Revised Selected Papers, ser. Lecture Notes in Computer Science, J. Bruel, M. Mazzara, y B. Meyer, Eds., vol. 11350. Springer, 2018, pp. 128-141. [En línea]. Disponible: https://doi.org/10.1007/978-3-030-06019-0 10
[17] D. Escobar, D. Cárdenas, R. Amarillo, E. Castro, K. Garcés, C. Parra y R. Casallas, "Towards the understanding and evolution of monolithic applications as microservices", en 2016 XLII Latin American Computing Conference (CLEI). IEEE, oct 2016, pp. 1-11. [En línea]. Disponible: http://ieeexplore.ieee.org/document/7833410/
[18] L. Nunes, N. Santos y A. Rito Silva, "From a monolith to a microservices architecture: An approach based on transactional contexts", en Software Architecture, T. Bures, L. Duchien y P. Inverardi, Eds. Cham: Springer International Publishing, 2019, pp. 37-52.
[19] A. Levcovitz, R. Terra y M. T. Valente, "Towards a Technique for Extracting Microservices from Monolithic Enterprise Systems", CoRR, vol. abs/1605.0, mayo de 2016. [En línea]. Disponible: http://arxiv.org/abs/1605.03175
[20] A. Selmadji, A. Seriai, H. Bouziane, R. O. Mahamane, P. Zaragoza y C. Dony, "From monolithic architecture style to microservice one based
on a semi-automatic approach", en 2020 IEEE International Conference on Software Architecture, ICSA 2020, Salvador, Brasil, 16-20 de marzo, IEEE, 2020, pp. 157-168.

Más ...

Scroll al inicio