Professional Documents
Culture Documents
Moreno (2022)
Moreno (2022)
Trabajo final presentado como requisito parcial para optar al título de:
Magíster en Ingeniería - Ingeniería de Sistemas y Computación
«Master of Engineering - Systems and Computer Science»
Dirigido por:
Jeisson Andrés Vergara Vargas, M.Sc.
Línea de investigación:
Arquitectura de Software
Grupo de Investigación:
Colectivo de Investigación en Ingeniería de Software (ColSWE)
- Galileo Galilei
Agradecimientos
En primer lugar agradezco a Dios por su guía y acompañamiento durante toda mi vida, por las
bendiciones concedidas y permitirme alcanzar un logro más en mi vida académica. A mi familia
y allegados por su apoyo incondicional y motivación continua durante el proceso de realización
de este trabajo final.
Por último agradezco a todos los autores citados en este documento, que con sus trabajos y
publicaciones proporcionaron las bases para este trabajo investigativo.
ix
Título en español
Modelo de Evolución Arquitectónica de Monolito a Microservicios para el Sistema de Infor-
mación ISys de la Dirección Nacional de Admisiones de la Universidad Nacional de Colombia.
Title in English
Architectural Evolution Model from Monolith to Microservices for the ISys Information Sys-
tem of Dirección Nacional de Admisiones of the Universidad Nacional de Colombia.
x
Resumen
El trabajo final presenta el estudio de caso de la evolución de un sistema de información con
arquitectura monolítica hacia microservicios. El trabajo realizado se basa en la creación, imple-
mentación y validación de un modelo de evolución que surge a partir del contexto del sistema
identificado mediante el análisis arquitectónico detallado y en consideración a los requisitos
técnicos y operativos de la Dirección Nacional de Admisiones de la Universidad Nacional de
Colombia. El modelo de evolución permite priorizar los módulos del sistema mediante el análi-
sis de dependencias ascendentes y el impacto positivo previsto de la evolución, y presenta las
adaptaciones requeridas a tres patrones de arquitectura utilizados como estrategia principal para
la evolución de manera iterativa e incremental, sin necesidad de interrumpir parcial o totalmente
la operación del sistema o la dependencia.
Abstract
The final work presents the case study of the evolution of an information system with mono-
lithic architecture towards microservices. The work done is based on the creation, implementa-
tion and validation of an evolution model that emerge from the context of the system identified
through the detailed architectural analysis, and in consideration of the technical and operational
requirements of Dirección Nacional de Admisiones of the Universidad Nacional de Colombia.
The evolution model allows system modules to be prioritized by analyzing upstream depen-
dencies and the expected positive impact of evolution, and presents the required adaptations
to three architecture patterns used as the main strategy for evolution in an iteratively and in-
crementally, without need to partially or totally halt the operation of the system or dependency.
Agradecimientos vii
Resumen x
1. Introducción 1
1.1. Introducción al Problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2.1. Objetivo General . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2.2. Objetivos Específicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3. Contribución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2. Marco Teórico 4
2.1. Arquitectura de Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2. Arquitecturas Monolíticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3. Arquitecturas de Microservicios . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.4. Evolución Arquitectónica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.5. Diseño Guiado por el Dominio (DDD) . . . . . . . . . . . . . . . . . . . . . . . . 16
3. Trabajos Relacionados 18
Bibliografía 54
Lista de Figuras
3-1. Enfoques de análisis para la migración de una arquitectura monolítica a una ar-
quitectura de microservicios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Este trabajo exponen el estudio de caso del sistema de información integrado (ISys o Integrated
System) de la Dirección Nacional de Admisiones (DNA) de la Universidad Nacional de Colom-
bia (UNAL), que como parte del plan tecnológico de la dependencia, requiere evolucionar la
arquitectura monolítica de ISys a microservicios, conservando su operación constante, evitando
reprocesos operativos y manteniendo los datos históricos. Se plantea como objetivo del estudio
la generación de un modelo que permita la evolución entre arquitecturas, a través del análisis de
la descomposición modular y de componentes y conectores. El modelo se basa en un conjunto
de patrones que permiten transiciones progresivas entre la arquitectura origen y la arquitectura
destino.
El estudio se fundamenta en la arquitectura de software que define las estructuras de los sis-
temas con base en un conjunto de elementos, relaciones y propiedades. La especificación de las
estructuras basadas en un contexto pueden conformar un estilo o un patrón y se representan
mediante vistas arquitectónicas. Todos los estilos y patrones arquitectónicos tienen caracterís-
ticas que permiten diferenciar unos de otros [46]. Definir el contexto de una arquitectura es
complejo, por ello se han desarrollado técnicas como el diseño guiado por el dominio que per-
mite modelar el contexto de un sistema inspirado en el contexto real del negocio [17].
Para realizar la evolución de una arquitectura monolítica hacia microservicios existen diferentes
estrategias en la literatura: Big Bang, rama por abstracción, composición de interfaz de usuario y
aplicación estranguladora. Cuando la evolución se realiza de manera transitiva se deben asumir
2 1 Introducción
ciertos retos derivados del proceso, como identificar el tamaño adecuado de los microservicios
[22], determinar el orden de evolución de los servicios [40], implementar transacciones dis-
tribuidas [44], conservar los datos históricos [47], la seguridad del sistema [44], entre otros.
ISys cumple un papel fundamental en la DNA y requiere adaptabilidad para garantizar que se-
mestre a semestre las normas y reglamentos definidos para los procesos de la dependencia se
cumplan. Sin embargo, debido a limitaciones de la tecnología se dificulta realizar los cambios
y actualizaciones requeridas para el sistema, razón por la cual se decidió evolucionar ISys de
una arquitectura monolítica hacia una arquitectura de microservicios. Comprender el contexto
y estado actual de un sistema se puede realiza a través del análisis de vistas como la vista de
descomposición modular, vista de capas, vista de usos, vista de modelos de datos, vista de com-
ponentes y conectores y vista de despliegue [13].
El modelo de evolución arquitectónica que se propone para realizar la evolución del sistema
de información ISys describe en detalle los aspectos técnicos y operativos relevantes sobre los
cuales se fundamentan las decisiones, describe las variables de entrada y salida del modelo, la
forma de priorizar los servicios que se evolucionarán mediante el nivel de acoplamiento o in-
terdependencia entre módulos del sistema y las adaptaciones que requieren los patrones para
poder evolucionar el sistema de la manera deseada.
La validación del modelo de evolución comprende dos fases. Durante la primera fase se aplica
el modelo al sistema de información ISys y se evoluciona un submódulo. En la segunda fase se
realiza el análisis de los resultados obtenidos, los cuales son evaluados a partir de las variables
de salida del modelo.
microservicios y desea ejecutarla de forma transparente para el usuario, sin afectar la operación
de la dependencia ni la operación del sistema de información.
1.2. Objetivos
1.2.1. Objetivo General
Diseñar un modelo de evolución arquitectónica de monolito a microservicios para el sistema de
información ISys de la Dirección Nacional de Admisiones de la Universidad Nacional de Colom-
bia mediante estrategias de desacoplamiento.
2. Analizar los componentes y conectores del sistema de información ISys actual mediante
elementos, relaciones y propiedades arquitectónicas.
3. Diseñar una estrategia de transición progresiva del sistema de información ISys a una ar-
quitectura de microservicios a partir de los análisis de la arquitectura monolítica.
1.3. Contribución
La contribución de este trabajo final es un modelo de evolución arquitectónica validado a partir
de la aplicación en un submódulo de ISys, que permite la transición de la arquitectura monolítica
del sistema hacia una arquitectura de microservicios, el cual cubre las necesidades técnicas y
operativas de la DNA de la UNAL. El modelo resultante proporciona un conjunto de estrategias
para realizar la evolución de forma iterativa e incremental.
2. Marco Teórico
La arquitectura de software no es una fase específica del desarrollo, pero está presente en cada
etapa de vida del software y se manifiesta en todas las fases de desarrollo, constituye las prin-
cipales decisiones de diseño que influyen en la calidad de producción de software [50] y su
consideración desde tempranas etapas generalmente impacta positivamente la calidad del soft-
ware. Es correcto pensar que la arquitectura de software comienza su intervención en la etapa
de diseño, pero incorrecto asimilar que toda la etapa de diseño se limita a la arquitectura de
software, pues según [9], Grady Booch recalca que “toda arquitectura es diseño pero no todo diseño es
arquitectura”, las decisiones arquitectónicas son fundamentales para el sistema y cualquier cam-
bio arquitectónico impacta de forma relevante el costo. Que un sistema carezca de un diseño
arquitectónico no significa que también carezca de una arquitectura, pues uno de los fundamen-
tos de la arquitectura de software refiere que todos los sistemas tienen una arquitectura [50] y
por ende todos los sistemas pueden ser analizados y estudiados a partir de la arquitectura de
software.
Para el análisis y estudio de los sistemas, la arquitectura de software se compone de una colec-
ción de elementos, relaciones y propiedades. Los elementos representan las unidades com-
putacionales de un sistema y detallan las funciones que cumplen dentro de la arquitectura [13],
pueden existir en tiempo de ejecución, en tiempo de desarrollo o incluso de forma física [11].
Las relaciones representan las interacciones entre los elementos del sistema, definen el proceso
de comunicación, coordinación y cooperación, y proporcionan estandarización sobre cómo los
elementos pueden o no estar relacionados unos con otros [13]. Las relaciones al igual que los
elementos, pueden existir en tiempo de ejecución, en tiempo de desarrollo o de forma física [11].
Las propiedades representan comportamientos visibles o medibles del sistema como los requisi-
tos funcionales o de calidad [50]. Las propiedades describen información complementaria sobre
2.1 Arquitectura de Software 5
Los elementos y sus relaciones definen las estructuras del sistema. Una estructura es una colec-
ción de elementos y relaciones que proporcionan detalles de algunas características de com-
posición del sistema. Las estructuras en arquitectura de software se agrupan en tres categorías
según su naturaleza. La primera categoría comprende las estructuras modulares que dividen
el sistema en diferentes partes basadas en unidades de implementación, las cuales pueden in-
terpretarse como estructuras estáticas ya que la definición de los elementos y las relaciones
se producen en tiempo de diseño. Cada módulo definido tiene una o varias responsabilidades
coherentemente asociadas dentro del sistema. La segunda categoría abarca las estructuras de
componentes y conectores que detallan las relaciones que se presentan entre elementos del sis-
tema en tiempo de ejecución, y expresan su comportamiento ante estímulos internos o externos
del sistema, razón por la cual se interpretan como estructuras dinámicas. La tercera y última ca-
tegoría contiene las estructuras de asignación las cuales reflejan las decisiones de las estructuras
indirectamente relacionadas con el software en ambientes de desarrollo o ejecución, como el
hardware, el sistema operativo o el equipo de desarrollo asignado [7].
La disposición de las estructuras proporcionan diferentes perspectivas del sistema, pero los ele-
mentos y las relaciones de una estructura no son completamente independientes de otras es-
tructuras. Por la naturaleza de la estructura analizada se pueden omitir algunas relaciones que
no aportan significado en el análisis, lo cual no indica una carencia de otro tipo de relación entre
los elementos de otras estructuras [7]. Una especialización concreta de las estructuras con un
conjunto de restricciones crean un estilo arquitectónico [13].
la adaptación del contexto, inspiración de una solución, o incluso motivación para el surgimiento
de nuevos estilos [46]. Un sistema puede tener múltiples estilos, dependiendo de la perspectiva
arquitectónica que sea revisado y su categoría.
Los patrones arquitectónicos (o simplemente patrones), al igual que los estilos, son una generali-
zación de estructuras arquitectónicas comunes de los sistemas. La gran diferencia con los estilos
radica en que los patrones se fundamentan en un problema recurrente de diseño para contex-
tos que tienen ciertas características [11], mientras que los estilos solo requieren del contexto.
En otras palabras, un patrón es una posible solución de diseño aplicable a un problema de un
conjunto definido de contextos [46]. Según [50] los estilos y patrones difieren en al menos tres
aspectos importantes: el alcance (los estilos arquitectónicos son estratégicos mientras que los
patrones son herramientas de diseño táctico), la abstracción (los estilos requieren interpretación
humana y por si mismos no crean un diseño concreto del sistema, mientras que los patrones de-
finen elementos concretos que corresponden al sistema) y la relación (un patrón puede aplicarse
en múltiples estilos según su definición pero siempre será aplicado en el contexto del estilo,
mientras que un estilo puede incluir múltiples patrones).
Cada uno de los artefactos construidos durante el proceso de diseño y desarrollo del software
deben ser documentados de forma eficaz, y el proceso arquitectónico no es la excepción. “The
best architects produce the best documentation not because it’s “required”, but because they see that it is essential
to the matter at hand: producing a high-quality product, predictably and with as little rework as possible” [Los
mejores arquitectos producen la mejor documentación no porque sea “requerida”, sino porque
ven que es esencial para el asunto en cuestión: producir un producto de alta calidad, de manera
predecible y con el menor trabajo posible] ([13], p.12). Uno de los conceptos más importantes
dentro de la documentación de la arquitectura de un sistema es el de vista arquitectónica [13].
Las vistas arquitectónicas son representaciones de las estructuras del sistema. Las representa-
ciones poseen diferentes grados de formalidad en su documentación y varían en el tipo de no-
tación. La notación informal no hace uso de ningún estándar para representar las estructuras
del sistema, puede utilizar elementos gráficos o textuales particulares para la vista y debe ir
acompañada de un resumen (bien sea textual u oral) que permita interpretar el significado de la
notación. Las notaciones informales no tienen bases para un análisis formal [13]. La notación
semiformal se expresa mediante una notación gráfica estandarizada que provee elementos con
significado, pero sin un tratamiento semántico completo [13]. El Lenguaje de Modelado Unifi-
cado (Unified Modeling Language en inglés, UML) es por lo general la forma en la cual se repre-
sentan las arquitecturas con notación semiformal. La notación formal a diferencia de la notación
semiformal, provee elementos con significado y un tratamiento semántico completo. Esencial-
mente las notaciones formales tienen base matemática y la forma más común de representación
es mediante los Lenguajes de Descripción de Arquitectura (Architecture Description Languages
en inglés, ADLs). Una vista arquitectónica tiene un objetivo concreto que desea representar,
2.1 Arquitectura de Software 7
Las vistas de módulos permiten desglosar las estructuras del sistema en unidades de imple-
mentación coherentemente relacionadas. Cada vista puede tener el nivel de detalle deseado o
según se necesite. [13] resalta esta categoría por la ayuda que brinda principalmente a la co-
municación con los stakeholders, construcción y análisis del sistema. Las vistas de módulos
definen como único tipo de elemento los módulos que son unidades de implementación de soft-
ware agrupadas por responsabilidades comunes [13]. Las relaciones posibles en esta categoría
son: es parte de que representa una contenencia submodular entre dos elementos, depende de que
define una relación de dependencia de un módulo a otro y es un que concreta una relación he-
reditaria de un módulo general a un módulo específico [13]. Las propiedades pertenecientes a
las vistas de módulos son las siguientes: nombre que provee el principal identificador de distin-
ción, responsabilidad que proporciona el rol del módulo en el sistema, visibilidad de la(s) interfaz(ces)
que define la exposición para uso de un módulo o submódulo en el entorno e información de la
implementación que atañe información relevante adicional al tipo de vista que se documenta [13].
Las estructuras estáticas permiten definir la manera en que el sistema fue o será desarrollado,
la composición y generalización del sistema, qué tan dependiente son unos módulos de otros
internamente, cuál es su nivel de dependencia con elementos externos, qué módulos o aspectos
se encargan de funcionalidades transversales en el sistema o la relación directa existente entre
los módulos y los datos [13].
analizar la organización entre los componentes que definen el comportamiento interno del sis-
tema y la interacción con el entorno. Generalmente las vistas de componentes y conectores
apoyan el razonamiento sobre los atributos de calidad de un sistema [13]. Los elementos que dis-
tinguen las vistas de componentes y conectores son dos. Los componentes denotan las unidades de
procesamiento y almacenamiento de datos, y los conectores representan la interacción entre com-
ponentes a través de rutas establecidas [50]. Los componentes pueden comunicarse con otros
componentes a través de puertos (o interfaces del componente) [13]. La unión es la relación que
las vistas definen y permite la conexión entre los componentes y conectores. Cuando un conec-
tor se relaciona con un componente debe ir acompañado de un rol (o interfaz de un conector),
que define el alcance de la relación. Los elementos de las vistas de componentes y conectores de-
berían tener las propiedades básicas como lo son nombre (provee el principal identificador) y tipo
(definición genérica del elemento). También existen otras propiedades opcionales (comúnmente
no funcionales) según el tipo de vista representada como concurrencia, rendimiento, confiabilidad, se-
guridad o recursos necesarios, entre otras [13].
Las vistas de asignación permiten relacionar el software con estructuras que no son de soft-
ware pero que desempeñan un rol en los entornos de organización, desarrollo, instalación y
ejecución de los sistemas [7], [11], con el propósito de analizar el desempeño y estudiar formas
de optimizar los recursos proveídos, la gestión de equipos para la continuidad del proyecto y
la administración de los archivos para mantener la integridad del sistema [13]. Los elementos
pertenecientes a las vistas de asignación son los elementos de software propios y relacionados con
las vistas de módulos o las vistas de componentes y conectores, y los elementos de ambiente que
pueden referirse al hardware requerido para el ambiente productivo, los equipos de desarrollo
que intervienen en el proceso de construcción o los sistemas de gestión de archivos [13]. Cada
elemento de software debe tener al menos la asignación (allocated to en inglés) a un elemento de
ambiente, y de la misma manera cada elemento de ambiente debe tener al menos un elemento
de software asignado. Sin embargo, la relación entre elementos puede ser muchos a muchos
[13]. Las propiedades de las vistas de asignación frecuentemente exhiben las características que
el software requiere y las características que el ambiente provee, con el propósito de determinar
el éxito o fracaso de la asignación a través de comparaciones [13]. La vista de asignación más
conocida es la vista de despliegue [13].
capas a considerar. La primera es la interfaz de usuario que se ejecuta principalmente al lado del
cliente, el servidor le provee los recursos que por lo general poseen el formato HTML, JavaScript
o CSS. La segunda capa es la lógica del negocio que se encarga de interpretar las peticiones de
los clientes y generar respuesta a ellas. Por último se tiene la tercera capa que es de datos, en-
cargada de persistir la información [29].
iv. Repositorio de control de versiones unificado: Como lo explica [36], aunque el estilo
monolítico no exige que todo el código base de la aplicación se encuentre unificado, en
la mayoría de las aplicaciones con esta arquitectura es común que así sea, por lo cual el
control de versiones se concentra en un repositorio.
Estas propiedades le proporcionan a las arquitecturas monolíticas una serie de ventajas y desven-
tajas. Algunas de las ventajas que proporcionan el estilo arquitectónico monolítico son las si-
guientes:
10 2 Marco Teórico
• Topología simple de despliegue: [36] Para tener un sistema funcional se requiere ejecu-
tar los componentes internos del sistema, pero a causa de la propiedad i., el número de
componentes tiende a ser bajo ya que el monolito posee gran parte de la funcionalidad.
Esto permite que los despliegues sean sencillos desde su concepción, pues para poner
nuevas versiones del sistema en producción la mayoría de veces será suficiente detener el
proceso principal (monolito), realizar el cambio de los archivos o el compilado y ejecutar
nuevamente el proceso.
• Monitoreo del sistema: [36] Esta ventaja también es resultado de la propiedad i. ya que
monitorear un sistema monolítico se ve reducido a monitorear el bajo número de com-
ponentes del sistema. Esto es un gran beneficio especialmente cuando se poseen equipos
pequeños o un presupuesto ajustado, pues requiere menor esfuerzo y poca o nula tecnifi-
cación para realizar la vigilancia.
Sin embargo, las arquitecturas monolíticas poseen desventajas que han motivado la transición a
través del tiempo de este tipo de arquitecturas clásicas hacia arquitecturas modernas. Algunas
de ellas son:
la propiedad i., es que cuando aumenta la demanda del sistema y se utiliza escalamiento
horizontal como respuesta a dicha demanda, se obliga a crear otras instancias idénticas que
consumirán una cantidad de recursos similar. Esto aumenta los costos de la infraestructura
y hace que sea inviable a largo plazo mantener el modelo de escalamiento. Si adicional-
mente se suma que en la mayoría de los casos el aumento de demanda se da por un servicio
en específico y que en realidad no es necesario escalar todo el componente, es una gran
desventaja para el estilo.
Algunas de las propiedades más importantes de los microservicios son las siguientes:
ii. Arquitectura distribuida: Al ser una arquitectura que posee múltiples componentes, en
gran cantidad de ocasiones se requiere consultar dos o más de ellos para completar la
respuesta a una solicitud. Cada uno de los componentes brindará la porción de informa-
ción que corresponde a su dominio y de esta manera se reúne la información total para la
respuesta.
iii. Comunicación mediante protocolos ligeros: Por ser una arquitectura distribuida con pro-
cesos independientes, la comunicación entre microservicios a través de memoria no es
viable. Por ello la comunicación entre componentes se debe realizar mediante mecanis-
mos de red que permitan una ágil transmisión de datos. Entre los más comunes tenemos
REST y gRCP que utilizan el protocolo HTTP [44].
iv. Base de datos independiente: Una característica derivada de los servicios independientes
definidos por un contexto o dominio, es la posibilidad de tener bases de datos (incluyendo
sus motores) de forma independiente, que materialice las entidades comprendidas por el
límite definido para el servicio.
Las ventajas que proveen este tipo de arquitectura son diversas, entre las más destacadas son
las siguientes:
2.3 Arquitecturas de Microservicios 13
• Mayor autonomía para grandes equipos de desarrollo: [36] Cuando el área de tecnología
de una organización requiere de bastantes desarrolladores, es habitual que se establezcan
pequeños grupos de entre cuatro y siete integrantes. En una arquitectura de microser-
vicios cada uno de los equipos tiene el límite de sus obligaciones bien definido, pues la
responsabilidad de cada uno viene delimitado por el alcance del dominio del conjunto
de microservicios asignados. Como los microservicios son diseñados y desarrollados de
forma modular, el equipo posee total control y autonomía sobre el conjunto de microser-
vicios a su cargo, sin una alta dependencia hacia otros equipos.
• Reducción del Time to market: Una de las grandes ventajas que poseen los microservicios es
la capacidad de despliegue independiente. Ello se ve reflejado en la frecuencia con la que
se lanzan a producción cambios pequeños o nuevas funcionalidades [36]. Mientras que
en arquitecturas centralizadas como las aplicaciones monolíticas muchas veces se debe
esperar a que un conglomerado de cambios se encuentre disponible para que la indispo-
nibilidad del sistema sea justificada, en este tipo de arquitecturas distribuidas se puede
realizar de manera independiente sin afectar fuertemente la disponibilidad del sistema.
• Acoplamiento limitado: Gracias a las fronteras trazadas por los microservicios, la interde-
pendencia también se verá limitada al lindero del microservicio.
• Dominio de datos: Cada microservicio define su propio dominio del negocio según la
propiedad iv. Esto quiere decir que cada componente tiene injerencia únicamente en
sus datos, lo cual permite tomar decisiones tecnológicas más asertivas como por ejemplo
decidir si utilizar una base de datos relacional o no relacional, el nivel de carga que ha de
soportar la base de datos y si se requiere alguna táctica arquitectónica, entre otras.
A pesar de las ventajas que brindan las arquitecturas de microservicios, existen algunas desven-
tajas que vale la pena tener en cuenta cuando se toman decisiones de este tipo:
• Aumento de la latencia en el sistema: Todos los sistemas con el estilo cliente servidor
tienen una latencia que depende de la calidad de la red utilizada. En arquitecturas tradi-
cionales como las monolíticas, el tiempo de respuesta para una petición no solo depende
de la velocidad de procesamiento de los componentes de aplicación y base de datos, sino
también de la latencia del conector que hay entre los componentes. Muchas de las peti-
ciones que se realizan a arquitecturas de microservicios requieren de dos o más compo-
nentes para completar la respuesta a la petición, pero debido a las propiedades ii. y iii.
inevitablemente se inducen latencias adicionales en el sistema.
• Dependencia del canal de comunicación: Otra de las grandes desventajas que tienen este
tipo de arquitecturas es que se convierten dependientes del canal de comunicación, pues
como ya se ha mencionado anteriormente en reiteradas ocasiones, en muchas de las peti-
ciones los microservicios requieren interoperar con otros microservicios y no hay forma
2.4 Evolución Arquitectónica 15
• Alto costo en los errores de diseño: Los errores de diseño de las arquitecturas distribuidas
tienen un mayor costo en comparación con las arquitecturas tradicionales [36]. Si bien
se ha dicho que adoptar nuevas tecnologías y actualizaciones es más sencillo para esta
arquitectura, el desarrollo completo y los cambios en los límites de un microservicio es
más costoso en tiempo y esfuerzo que una arquitectura monolítica, ya que se necesita
configurar las interacciones con los demás componentes de la manera como se especifica
en la propiedad iii.
• Complejidad para las transacciones en el sistema: Cuando una transacción sólo com-
prende un microservicio, la complejidad puede ser la misma que en una aplicación mo-
nolítica. Pero en las circunstancias en donde las transacciones comprenden más de un
microservicio, el proceso se complica. Una consecuencia de la propiedad iv. es la pérdida
de la integridad referencial que habitualmente proveen los motores de bases de datos,
trasladando la responsabilidad a los microservicios o a una capa intermedia que provea
esa funcionalidad. Cualquiera de las dos posibles soluciones planteadas, requiere un alto
esfuerzo y aumenta la complejidad del sistema.
En la actualidad existen muchos sistemas heredados que las organizaciones intentan evolucionar
con algún objetivo particular, bien sea a otras arquitecturas o a la misma arquitectura. A pesar
16 2 Marco Teórico
de que suene atractivo hacer nuevamente un sistema desde cero en el proceso, [44] enfatiza en
no es lo mejor, pues el sistema heredado contiene sabiduría y entendimiento de la organización
que volver a implementar resultaría costoso y riesgoso. Existen diversas incógnitas y retos al
evolucionar una arquitectura tal como lo describen [6], entre las más destacadas se encuentran
la capacidad limitada de recursos, la operatividad continua y funcional requerida, y el riesgo
existente en la incorporación de nuevas tecnologías.
Evans [17] define algunos conceptos que son relevantes en DDD. El primero es el de entidad que se
refiere a una instancia de un modelo del dominio que tiene identidad propia y que son mutables.
El segundo es el de objeto de valor que describe una característica de la entidad y que es inmutable,
por lo tanto cuando una entidad cambia de característica, realmente está reemplazando su objeto
de valor. Las entidades deben encapsular los comportamientos de forma cohesiva y para aque-
llas operaciones de dominio que conceptualmente no pertenecen a las entidades nace la tercera
definición que es servicio, el cual implementará gran parte del comportamiento del dominio de
forma stateless [52]. Luego se tienen los agregados que son los responsables de limitar la transac-
cionalidad de un conjunto no vacío de entidades y cuando se tiene más de una entidad dentro
de un agregado debe existir una entidad raíz. Continuando con los conceptos clave, existen dos
relacionados con las entidades que son repositorio y fábrica. Los repositorios son referentes al
patrón repository el cual se encarga de separar el dominio del mapeo de datos a través de capas
[19], y las fábricas referentes al método u objeto de fábrica que encapsula la creación compleja
de entidades [20]. Adicionalmente existen dos conceptos relacionados dentro del enfoque que
son los comandos y eventos. Los comandos (o modificadores) son operaciones que ejecutan los
actores (como un usuario o sistema externo) y producen cambios de estados en el sistema [17],
y los eventos de dominio son resultado de la reacción de un agregado a un comando, que cap-
turan ocurrencias del sistema [52].
2.5 Diseño Guiado por el Dominio (DDD) 17
Este tipo de evolución de monolito a microservicios conlleva una serie de retos frecuentes. El
primero de ellos es hallar el tamaño adecuado y los candidatos de microservicios [22]. En la
actualidad existen diferentes métodos automáticos [26], [14], [16], [1], [21], [5], [27], [12], [4],
semiautomáticos [25], [49], [28], [30], [31], [39], [53], [2] y manuales para la descomposición.
Los métodos automáticos son de bajo costo y rápida implementación pero demasiado rígidos,
mientras que los métodos manuales son de alto costo y requiere extensos tiempos de imple-
mentación pero bastante flexibles en diseño [32].
El segundo reto cuando la evolución se realiza de manera transitiva, es determinar qué servicios
se evolucionarán primero a microservicios, para lo cual se utilizan algunos enfoques. En los tra-
bajos previos que abordan evoluciones de arquitecturas monolíticas a microservicios se utilizan
diversos enfoques [41], [10], [40], [22] que se pueden resumir como se muestra en la tabla 3-1.
Estos enfoques no son excluyentes entre sí [40], al contrario en muchas ocasiones pueden ser
complementarios. Con base en estos enfoques se generan nuevos métodos de análisis que per-
miten estructurar la información recolectada y generar nuevos modelos de evolución, como
19
Enfoque Descripción
Tabla 3-1.: Enfoques de análisis para la migración de una arquitectura monolítica a una arqui-
tectura de microservicios.
análisis basados en grafos y patrones [10], análisis algorítmicos [41] o análisis de datos de car-
gas de trabajo [22]. Adicionalmente, es importante establecer parámetros de priorización en
la migración, los cuales ayudan a identificar el orden en que los microservicios serán extraídos
del monolito y desarrollados en microservicios. [36] describe una técnica basada en dependen-
cias ascendentes y descendentes entre los candidatos identificados, priorizando los servicios
de menor a mayor según el número de dependencias ascendentes que posea, pues cada depen-
dencia ascendente requiere una adaptación del servicio dependiente. El objetivo del análisis
es reducir la cantidad de cambios que requiere el proceso, aunque el método no contempla la
dificultad que puede representar el cambio. Otra técnica descrita por [36] para priorizar a los
candidatos es determinando la urgencia y necesidad del cambio o el beneficio obtenido del pro-
cedimiento. Ambas técnicas pueden ser combinadas.
El tercer reto está relacionado con las transacciones del sistema. En un monolito las transac-
ciones se realizan de forma simple y en muchas ocasiones la integridad de la información la
administra la base de datos, pero en una arquitectura de microservicios una transacción puede
llevarse a cabo empleando más de un microservicio y almacenar información en dos o más bases
de datos [48]. Para este inconveniente la literatura provee dos opciones: la primera de ella es
el protocolo two-phase commit que consta de una fase de preparación y una fase de realización,
generalmente coordinado por un administrador de transacciones [48]; la segunda opción es me-
diante el patrón sagas que consiste en ejecutar una secuencia de transacciones locales en cada
microservicio y luego publicar un evento o un mensaje indicando que puede ejecutarse la si-
guiente transacción local [44].
El cuarto reto de la evolución está relacionado con la migración y conservación de los datos del
sistema heredado. En la gran mayoría de casos, es necesario realizar una reestructuración del
diseño de la base de datos y adecuar según el dominio de los microservicios. Idealmente cada
20 3 Trabajos Relacionados
microservicio tendrá relación con un conjunto de datos y la separación puede ser a nivel lógico
o físico [36]. El reto es mantener operativo y disponibles los datos del sistema heredado con la
estructura antigua, junto con la nueva estructura obtenida del diseño de los microservicios. Una
alternativa es realizar procesos de extracción, transformación y carga (ETL) como lo recomiendan
[13], [47] y [33].
El quinto reto es un tema sensible y una decisión crucial para la seguridad del sistema, pues está
relacionado con la autenticación y la autorización de los usuarios. Algunos sistemas hereda-
dos luego de autenticar a un usuario, utilizan sesiones con estado, otros utilizan un token que
requiere una llave secreta para generar y validar la legitimidad. [44] categoriza tres opciones
para mantener una misma autenticación para la aplicación monolítica y para la aplicación en mi-
croservicios. La primera opción es adaptar la aplicación de microservicios a la seguridad de la
aplicación monolítica, aunque es contraproducente cuando los monolitos tienen sesiones cen-
tralizadas y usan contextos de seguridad en memoria, pues lo convierte en una aplicación con
estado. La segunda opción es realizar la adaptación del sistema monolítico para coexistir con las
sesiones sin estado habituales de los microservicios, lo cual resulta conveniente especialmente
porque todos los servicios podrán conocer la identidad del usuario e implementar de forma in-
dependiente sus controles de acceso. La tercera opción es mantener un modelo híbrido que
conserve el método de seguridad antiguo para el monolito e implemente un método nuevo para
los microservicios, aunque el mayor inconveniente es mantener integridad entre los usuarios,
los permisos y las sesiones de ambos métodos.
4. Sistema de Información ISys
El acceso a la educación superior es un privilegio al que pocos estudiantes pueden acceder en
Colombia. Para 2019, alrededor de 1.600.000 personas aspiraban obtener un cupo para técnicos,
tecnólogos y carreras profesionales, de los cuales tan solo 51,6 % de los candidatos lo logró. Del
total de aspirantes, 69 % pretendían ingresar en una institución pública para realizar sus estu-
dios [34]. La Universidad Nacional de Colombia (UNAL) se caracteriza por sus altos estándares
académicos y por ser la universidad más apetecida del país para estudiar una carrera profesional.
En la última década, anualmente más de 100.000 aspirantes compitieron para clasificar a uno de
los 97 programas académicos que se ofrecen en pregrado, de los cuales aproximadamente 12.000
consiguieron hacerlo. Con un índice de admisión inferior al 12 % la UNAL debe garantizar un
proceso de selección objetivo, íntegro y transparente. Adicionalmente la UNAL se caracteriza
por brindar oportunidades de acceso a poblaciones vulnerables y en desventaja social, imple-
mentando diferentes programas de admisión especial para pregrado. Así mismo, la universidad
brinda programas de posgrado como especialidades, especializaciones, maestrías y doctorados,
que también son altamente demandados.
Desde 1940, la UNAL implementa pruebas de admisión como filtro para seleccionar a sus estu-
diantes, siempre enfocadas a capacidades cognitivas de la persona. En sus principios, el instituto
de psicología aplicada de la UNAL era la dependencia encargada de construir y aplicar la prueba
a los candidatos, posteriormente entre los años 1952 y 1961 se delegó a cada facultad la respon-
sabilidad de aplicar los procesos y pruebas de admisión correspondientes. No es sino hasta el
año 1964 que se crea una dependencia específicamente para realizar los procesos de admisión, la
cual fue nombrada como División de Admisiones, Registro y Control Académico, en 1972 cambia
su nombre a Departamento de Admisiones e Información Profesional, hasta que en 1998 recibe
el nombre actual de Dirección Nacional de Admisiones (DNA) [15]. Cada una de las etapas del
proceso era realizada de forma manual y requería de una ardua labor humana.
4.1. Antecedentes
A través del tiempo, la prueba y el modelo de admisión se han reformulado en numerosas oca-
siones, variando los componentes de la prueba, cantidad de preguntas y métodos de calificación
de respuestas, modelo de clasificación y selección de programa, distribución de aspirantes en
grupos de selección de carrera de pregrado, entre otras variables [15]. Para los procesos de ad-
22 4 Sistema de Información ISys
misión del segundo semestre de 2007, la DNA incorporó un sistema de información que permite
a los aspirantes realizar la inscripción y posteriormente consultar los resultados obtenidos del
proceso, sistema que recibe por nombre ISys (Integrated System) y apoya la labor operativa de
la dependencia, por lo cual ha tenido que responder a los cambios y adaptar su funcionamiento
según corresponde a los nuevos requisitos del modelo de admisión periodo a periodo. La evolu-
ción continua del sistema ha sido realizada por múltiples colaboradores y trae consigo el legado
de cada una de las adaptaciones que ha requerido, convirtiéndose así en un sistema heredado,
complejo y de gran tamaño.
ISys soporta tres procesos principales de la DNA: admisión de pregrado (con sus diferentes moda-
lidades y métodos de admisión), admisión de posgrado (es el proceso más plural ya que depende
mucho del programa y los requisitos) y clasificación o certificación de lengua extranjera inglés (los admiti-
dos de pregrado, el siguiente semestre a su admisión deben presentar una prueba de clasificación
del nivel de inglés, mientras que algunos programas de posgrado requieren un nivel mínimo de
inglés por lo cual los aspirantes deben realizar una prueba que certifique el nivel exigido). Todos
los procesos contienen cuatro subprocesos cronológicos de la siguiente manera: Configuración del
proceso, inscripción de los candidatos, aplicación de la prueba y calificación de la prueba. Adicionalmente,
los procesos de pregrado y posgrado conllevan un subproceso adicional que es el de admisión de
los aspirantes, el cual se realiza a posteriori del subproceso de calificación en el cual se determinan
los aspirantes que logran obtener uno de los cupos para estudiar en la universidad.
ISys es un monolito construido en Java, con Spring MVC y Struts. En sus inicios fue desarrollado
en la versión 1.6 de Java y actualizado posteriormente a Java 1.7. Para la versión 1.8 de Java,
se incluyeron nuevas características al lenguaje como funciones lambdas, streams e implementa-
ciones de seguridad y cambios en varias de las clases principales del paquete util como Date y
Time [37] entre otros, que llevaron a la obsolescencia la mayoría de las dependencias del sis-
tema. Durante varios meses se intentó actualizar las tecnologías sin resultados positivos, pues
la incompatibilidad entre las versiones y dependencias del proyecto estropearon el monolito.
Adicionalmente, sumada a la evolución del framework de Spring MVC a Spring Boot, el equipo
técnico junto con la dirección de la dependencia, planearon un proyecto de actualización del
monolito para modernizar las tecnologías y corregir algunos errores de diseño introducidos du-
rante la evolución continua, lo cual es común en los sistemas heredados [46]. Este proyecto no
pudo completarse debido a múltiples factores que habitualmente afectan a los monolitos, des-
critos por [44] como el infierno monolítico, entre ellos la complejidad de evolucionar un sistema
de gran tamaño, el lento desarrollo y la continua operatividad del sistema y la confiabilidad de
entrega de un sistema nuevo construido a partir de nuevos stack tecnológicos. Luego de varias se-
siones de análisis y revisión de alternativas, los microservicios prometieron solucionar muchos
de los inconvenientes experimentados en los dos procesos fallidos de modernización, añadiendo
una propuesta de valor que es la característica natural de los microservicios de ser una arquitec-
tura evolutiva.
4.2 Vistas de Módulos 23
ISys posee una arquitectura modular basada en el dominio, con una separación lógica en tres
capas, tradicional de las aplicaciones web. El modelo de datos es relacional, diseñado a partir
del paradigma de objetos. La aplicación provee algunos recursos y consume otros de sistemas
externos con quienes se comunica mediante protocolos de comunicación.
ISys
Admisión Inscripción Reportes Común
Configuración Idioma
Idioma
Configuración Idioma
Convenciones
una implementación obsoleta del proceso idioma en los módulos de color azul de la figura 4-1.
La razón por la cual existe el módulo de idioma de esa manera es debido a un cambio radical
en los subprocesos de idioma, que requería conservar el histórico de la información y el deseo
de desacoplar el proceso como un desarrollo independiente del sistema, lo que deriva en esa
decisión.
Aplicación
Monolito
Presentación Común
«permitido
Interfaz de Usuario usar»
«permitido usar»
Acción
«permitido usar»
Lógica de negocio
sedadilitU
«permitido
OTD
Controlador usar»
Servicio
«permitido usar»
Acceso a datos
«permitido
DAO usar»
«permitido usar»
Datos
Base de datos
Datos
Convenciones
Aunque la vista de usos permite detallar las dependencias entre los elementos, cuando el sis-
tema posee una gran cantidad de módulos, tiende a ser complicado detectar todas las relaciones
existentes. Es por ello que otra representación común de la vista es la matriz de estructura de depen-
dencia, la cual lista los módulos del sistema como filas y columnas de una matriz. En las matrices
de estructura de dependencia, los módulos localizados en las columnas son dependientes de los
módulos ubicados en las filas si la intersección de la columna y la fila posee un valor diferente
de vacío. Por ejemplo: suponga que en una matriz de estructura de dependencia M , un módulo
x se encuentra ubicado en la fila i y un módulo y se encuentra en la columna j. Si el valor de
Mij es diferente de vacío, significa que el módulo y usa el módulo x. El valor en la intersección
de la fila y la columna depende del nivel de abstracción. Si el análisis del estilo de usos es de alto
nivel de abstracción, probablemente solo se desee contabilizar el uso del módulo, por lo cual
su valor será vacío cuando no tengan relación, y 1 cuando tengan una relación de dependencia.
Si se desea un análisis más detallado, el valor de la intersección puede ser un número que re-
presente la cantidad de submódulos que usa, la cantidad de clases del módulo que utiliza o las
veces que realiza el llamado a una funcionalidad del módulo. En cualquier caso, toda la matriz
debe manifestar el mismo nivel de detalle requerido.
Las tablas 4-1 y 4-2 representan matrices de estructura de dependencia en diferente nivel de
detalle de la vista presentada en la figura 4-3. La tabla 4-1 posee un nivel de abstracción alto,
por lo tanto asigna el valor de 1 cuando existe una relación entre los módulos y un valor vacío
cuando no. En la tabla 4-2 se representan más detalles del sistema, por lo cual el valor de la
28 4 Sistema de Información ISys
intersección indica la cantidad de veces que el módulo de la columna usa una funcionalidad del
módulo localizado en la fila.
A B C D A B C D
A A
B 1 1 1 B 5 1 2
C 1 C 2
D 1 D 3
Tabla 4-1.: Matriz de estructura de dependen- Tabla 4-2.: Matriz de estructura de dependen-
cia de módulo. cia detallada por usos de funciona-
lidad.
Para analizar el sistema de información ISys se usó una matriz de dependencia elaborada de ma-
nera automática por la herramienta Structure 101 que mediante el análisis de código fuente per-
mite identificar el número de dependencias ascendentes y descendentes. El resultado obtenido
tiene como base los paquetes del sistema, aunque según el análisis de descomposición un mó-
dulo está compuesto por uno o más paquetes. La matriz obtenida por la herramienta es la repre-
sentada por el anexo A. Con base en la matriz de la herramienta, se realizó la clasificación de los
paquetes en uno de los módulos identificados en el análisis de descomposición, de la siguiente
manera:
Módulo Paquetes
externas de los módulos del sistema, por ello se obvian las dependencias internas. La tabla 4-4
detalla los resultados obtenidos.
Gracias a la matriz de dependencias se logra evidenciar los módulos que poseen menos depen-
dencias ascendentes como reportes, idioma, intercambio de información y aplicación; y menos
dependencias descendentes como reportes, común e intercambio de información. Teóricamente
los módulos con menor cantidad de dependencias ascendentes representan un menor esfuerzo
en la evolución hacia microservicios [36].
El navegador utiliza un conector HTTP para realizar la conexión con isys_lb, aunque durante la
operación está siempre interceptado por el componente isys_waf quien provee protección con-
tra algunos ataques de seguridad. El componente isys_lb redirige hacia isys_app las peticiones a
través de un conector HTTP. Las peticiones son interpretadas y procesadas por el componente
isys_app quien dependiendo de la solicitud puede consultar sistemas externos como unal_ldap
para la autenticación de usuario mediante el conector LDAP o consultar históricos de los estu-
diantes de la universidad a través de JDBC a sia. Habitualmente isys_app almacena y consulta la
información en el componente isys_db por medio de JDBC. También existe consumos por parte
de sistemas externos por REST a isys_app, como en el caso de psdda, admisiones y sia.
4.4 Vista de Despliegue 31
«Cliente»
navegador
«Cortafuego»
HTTP isys_waf
«Balanceador de Carga»
isys_lb
REST
HTTP
«Sistema Externo» «Sistema Externo»
psdda REST
sia
JDBC
«Monolito»
isys_app
REST
«CMS» LDAP «LDAP»
admisiones unal_ldap
JDBC
«Base de Datos»
isys_db
Convenciones
Sistema ISys
Sistemas externos
«Nodo» «Nodo»
Servidor de Aplicación Servidor de Base de Datos
{Proveedor = AWS-EC2, {Proveedor = AWS-EC2,
«Servicio en la Nube» OS = Centos 7, OS = Centos 7,
Web Application «Servicio en la Nube» TipoInstancia = t2.xlarge}
Elastic Load Balancing TipoInstancia = t2.xlarge}
Firewall {Proveedor = AWS-ELB}
{Proveedor = AWS-WAF} «Entorno de Ejecución»
Tomcat 7.0 / JRE 1.7 : 8080 «Entorno de Ejecución»
PostgreSQL 9.5 : 5432
«Monolito»
isys_app
«Cortafuego» «Balanceador de Carga» «Base de Datos»
isys_waf isys_lb «Artefacto» isys_db
sitio.war
Convenciones
AWS - VPC
AWS - Sub VPC pública
AWS - Sub VPC privada
La arquitectura posee una nube virtual privada (o VPC por sus siglas en inglés) que se compone
de dos segmentos: una sub VPC pública que permite el acceso de las peticiones del cliente
hacia el Elastic Load Balancing (o ELB), y una VPC privada que aísla las instancias de Servidor de
Aplicaciones y Servidor de Base de Datos por cuestiones de seguridad. Adicionalmente se tiene la
instancia de un Web Application Firewall (WAF), el cual protege el ingreso a la VPC de solicitudes
de algunos atacantes. Como se mencionó en la sección anterior, debido a que tanto el WAF
como el ELB son administrados por el proveedor no tienen un entorno de ejecución identificado
en la arquitectura. El servidor de aplicaciones posee un sistema operativo Centos 7 y es una
instancia de tipo t2.xlarge que posee altas características en memoria y procesamiento. Dentro
del entorno de ejecución se tiene un tomcat 7.0 ejecutado sobre JRE 1.7 de Java expuesto sobre
el puerto 8080, y el artefacto que se asigna al entorno es un WAR que contiene todo el monolito
compilado. El servidor de base de datos también posee un sistema operativo Centos 7 y tiene
configurado una instancia del tipo t2.xlarge, su entorno operativo es la base de datos relacional
postgres 9.5 expuesta por el puerto 5432 el cual sólo es accesible desde la instancia de servidor
de aplicaciones por razones de seguridad.
5. Modelo de Evolución Arquitectónica
El análisis preliminar del sistema permite una visión general del monolito y establece una base
concisa para modelar una estrategia de evolución que cumpla con los requisitos operativos y
tecnológicos de la DNA, pues de lo contrario puede verse afectada la dependencia en sus pro-
cesos. Se definieron cinco requisitos no funcionales, de los cuales dos de ellos son atributos de
calidad:
• Operatividad del sistema: es de vital importancia que el sistema mantenga una operación
continua en todos los procesos que actualmente brinda a la dependencia debido al alto
número de inscritos para los procesos.
• Conservar los datos históricos: para el sistema es elemental mantener disponibles y acce-
sibles los datos históricos, ya que con ellos se realizan algunas validaciones normativas de
los procesos.
• Impacto imperceptible para el usuario: este requisito se fundamenta en evitar que los
usuarios deban hacer reprocesos en sus labores diarias, ya que se pueden afectar los tiem-
pos operativos ocasionando sobrecostos.
• La seguridad del sistema no será comprometida: es esencial que la seguridad del sistema
no se vea comprometida en ningún momento del proceso de evolución.
El modelo provee una estrategia transicional que cumple con los requisitos no funcionales, el
cual permite segmentar y separar uno a uno los módulos del sistema. La figura 5-1 brinda una
visión general del modelo, el cual recibe las variables de entrada y de forma iterativa implementa
los patrones definidos por el modelo durante la evolución del sistema, generando unas salidas
que son entradas para la siguiente iteración del modelo.
34 5 Modelo de Evolución Arquitectónica
API Gateway
Aplicación Aplicación
0 Aplicación
0
Estranguladora Estranguladora Estranguladora
Entrada Entrada Entrada
Salida
Token de Acceso
Salida Salida
Convenciones
Matriz de dependencias
Variables de entrada y salida
Implementación del patrón
Tabla 5-1.: Definición y descripción de las variables de entrada y salida del modelo.
de los expertos del dominio; donde el valor 1 representa un bajo impacto positivo y 10 un alto
impacto positivo.
Los datos resultantes se deben estructurar y graficar en un modelo de priorización de dos ejes
[36], donde el eje x representa de mayor a menor las dependencias ascendentes que posee el
sistema y el eje y representa el impacto positivo. También es necesario calcular el promedio
de los valores de cada uno de los ejes, para dividir la gráfica en cuadrantes. Los cuadrantes
permiten identificar de manera rápida los mejores candidatos a evolucionar, considerando los
módulos del cuadrante superior derecho como los mejores candidatos, pues suponen una mayor
facilidad y un alto impacto positivo en el sistema. Finalmente se debe analizar y debatir según
criterio de expertos, cuál de los módulos ubicados en el cuadrante superior derecho es el más
indicado para iniciar el proceso de evolución.
Este proceso deberá repetirse siempre que se desee evolucionar un servicio, con los nuevos
valores de la matriz de dependencias ascendentes y el impacto positivo de los módulos, pues al
extraer un servicio del monolito, los valores de referencia cambian haciendo variar el resultado
de la gráfica.
El orden de extracción de los servicios del monolito se debe realizar según lo definido en la sec-
ción 5.2. Una vez seleccionado el servicio a evolucionar se debe analizar y diseñar a través de
DDD, identificando los conceptos clave con la ayuda de event storming. Primero se identifican los
eventos del sistema ordenados cronológicamente, luego los comandos y los actores que invo-
can dicha acción. Cuando un comando se ejecuta en un sistema externo, este se debe identificar
junto con el evento resultante de dicha acción. Posteriormente, es necesario identificar los agre-
gados involucrados en cada uno de los eventos. Si no es el primer módulo extraído del sistema,
se debe ensamblar los dominios analizados hasta el momento. Con un solo dominio construido,
se debe identificar los límites de los microservicios agrupando los eventos que poseen agregados
cercanos, los cuales implementarán las funciones del módulo que se estrangula. La relación en-
tre los módulos y los microservicios es plural, pues se representa como uno a uno, uno a muchos
o muchos a uno, por lo tanto no se limita la evolución a que arquitectónicamente un microser-
vicio pueda implementar una o varias de las funcionalidades de uno o diferentes módulos. El
proceso descrito se puede resumir mediante la figura 5-3.
Inicio
Priorización de Identificar los eventos sí
servicios en el del sistema Identificar los ¿El comando se ejecuta Referenciar el
monolito cronológicamente comandos y actores en un sistema externo? sistema externo
no
sí
Sin embargo, no solo los microservicios acogen la totalidad del módulo estrangulado, pues el
proceso se hace a través de todas las capas de la arquitectura, lo que quiere decir que también la
interfaz de usuario y los datos del módulo deben evolucionar a la nueva arquitectura. La interfaz
de usuario será acogida por un proyecto frontend, el cual implementa la totalidad de la capa de
presentación del sistema. En relación con los datos, la estructura del almacenamiento puede
cambiar, es por ello que se debe realizar un proceso de extracción, transformación y carga (ETL)
de modo que se engranen los datos al nuevo modelo de microservicios.
El modelo de evolución realiza algunas adaptaciones en el patrón API Gateway del sistema. La
primera consideración importante dentro de la arquitectura es la ubicación del monolito y el
frontend. Habitualmente el gateway en una arquitectura redirecciona únicamente hacia la capa
de lógica de negocio, es decir, los microservicios que exponen APIs para los clientes. En el
modelo de evolución se involucra dentro de las responsabilidades del gateway la redirección y
el control de acceso a la capa de presentación, lo cual brinda una serie de ventajas al sistema,
como la navegación fluida para el usuario entre las diferentes tecnologías del sistema, una sesión
con tiempo de actividad similar para ambas arquitecturas (revisar el patrón token de acceso), el
control de acceso y el uso de un solo nombre de subdominio para el acceso a todo el sistema.
La forma en la que el gateway realiza las redirecciones correctamente es a través de las rutas
definidas para cada endpoint. La figura 5-4 representa un esquema de la idea explicada anterior-
mente.
5.3 Patrones de Evolución 39
Cliente
API Gateway
Rutas 1 Rutas 2
Rutas 3 Rutas 4 Rutas 5 Rutas 6
Presentación
Lógica de Negocio
Otras de las responsabilidades del gateway dentro del modelo es la de realizar la verificación,
refresco y la adecuación del token de acceso en el sistema.
El monolito ISys utiliza un sistema basado en cookies de sesión, de tipo stateful, que mediante
roles de usuarios autoriza o deniega el acceso a los servicios. Sin embargo, dadas las característi-
40 5 Modelo de Evolución Arquitectónica
cas de los microservicios, no es viable mantener una sesión de tipo stateful para todo el sistema.
Es por ello que se requiere adaptar el modelo de autenticación del monolito para que también
genere sesiones de tipo stateless que contengan la información del usuario requerida. Esto es
posible a través de un token de acceso, el cual debe ser generado por el monolito. Para el modelo
se utiliza el estándar JSON Web Token (JWT) como token de acceso por sus características que
permiten la autenticación, la autorización, la identidad federada y sesiones de tipo stateless [38],
asegurando la integridad de la información enviada y permitiendo su validación. El JWT alma-
cena la información del usuario en el cuerpo y especifica información en las cabeceras como
el algoritmo de cifrado usado para la firma. El monolito genera el JWT a partir de la informa-
ción que posee del usuario y lo firma con el algoritmo asíncrono RSA que le permite al sistema
mantener una llave privada de manera segura y otra con acceso público para que los servicios
que desean validar la integridad del token puedan hacerlo. De esta manera, la llave pública es
conocida por todos los servicios del sistema, mientras que la llave privada solo es conocida por
el monolito. Como los servicios serán autónomos en la validación del token, por cuestiones de
seguridad el JWT debe poseer una vigencia corta, de tal manera que constantemente se requiera
la generación de un token nuevo. Para renovar el token, en este modelo no existe token de
refresco como lo sugiere OAuth 2.0, por el contrario se posee la cookie de sesión habitual del
monolito, la cual posee un tiempo de vigencia mayor al del token y le permite al monolito iden-
tificar plenamente el usuario para generar un nuevo token.
Inicio
sí sí
¿La petición tiene ¿El token es válido Fin
token? y está vigente?
no no
Como se mencionó en el patrón anterior, la puerta de enlace para el sistema es el API Gateway
quien, entre sus funciones, valida en primera instancia la autenticidad del token. Si el token está
vigente el gateway permite el flujo normal de la petición por el sistema, de lo contrario realiza la
5.3 Patrones de Evolución 41
petición al monolito quien se encarga de validar si la sesión aún se encuentra activa para generar
un nuevo token, de lo contrario le será concedida una sesión con rol público. El flujo del proceso
está representado por la figura 5-5.
La estrategia de renovación del token del modelo permite mantener vigentes durante tiempos
de actividad similares las dos sesiones, ya que cada vez que se solicita generar un token en el
monolito se reactivan las sesiones. Ambas sesiones viajan a través de cookies y por la misma
cabecera son devueltas del lado del cliente, no obstante, el API Gateway se encarga de convertir
el token en una cabecera HTTP Authorization para enviar el token de esta forma a los microser-
vicios. Cada microservicio debe implementar el control de acceso a sus endpoints basado en
roles.
6. Validación del Modelo
La validación del modelo de evolución se compone de dos actividades principales: la primera es
la aplicación de la estrategia definida en el sistema de información ISys donde se implementan
de forma práctica los patrones que componen el modelo, y la segunda es la medición y control
del desarrollo de la evolución en donde se analiza si las salidas del modelo cumplen con los
requisitos propuestos para este trabajo.
El primer proceso dentro del modelo es priorizar los servicios que posee el monolito, para lo
cual se hace uso de las dependencias ascendentes del sistema y se halla el impacto positivo
que tendría un módulo al evolucionar hacia microservicios. La tabla 6-1 muestra el resultado
obtenido del sistema de información ISys.
Priorización de Módulos
12
10
Admisión
Aplicación
8
Calificación
Común
Impacto
6 Configuración
Idioma
Inscripción
4
Intercambio de
Información
2 Reportes
0
9000 8000 7000 6000 5000 4000 3000 2000 1000 0
Número de dependencias
Se halla el promedio de cada uno de los ejes y se representa con las líneas rojas de la figura 6-1,
dividiendo en cuadrantes la gráfica. De esta manera se puede observar que a pesar de que el
módulo de reportes posee el menor número de dependencias en el sistema, no es el mejor can-
didato para evolucionar debido a su bajo impacto. También se puede observar que el módulo
común posee una alta prioridad, pero por su gran cantidad de dependencias no es un buen can-
didato, ya que extraerlo es sinónimo de bastantes cambios en el sistema. Así que los módulos
candidatos para evolucionar son Idioma, Calificación e Inscripción. Con un enfoque orientado por
el deseo de generar la menor cantidad de cambios en el monolito durante la evolución, se se-
lecciona Idioma como primer módulo para realizar su extracción. Posteriormente, con el análisis
de los expertos y considerando en su generalidad, que el módulo hace referencia a un proceso
del sistema y por ende, el módulo posee similitudes operativas en varios de los subprocesos de
los otros procesos de la dependencia, se reafirma la decisión catalogando el módulo como un
ambiente seguro para experimentar y generar conocimientos técnicos en el equipo de desarrollo.
Luego de priorizar el módulo, se realiza la adaptación del modelo de seguridad del monolito, am-
pliando su capacidad para permitir la generación del JWT con los requisitos técnicos necesarios
y retornando su contenido como se plantea en el modelo. Es evidente que por el algoritmo
asimétrico RSA512 la longitud de la firma aumenta cerca de un 400 % en comparación con el
algoritmo simétrico SHA512. La sesión en caché habitual del monolito tiene una caducidad a
los 20 minutos de inactividad. El tiempo de vigencia definido para el JWT es de 5 minutos y
44 6 Validación del Modelo
En la generación del nuevo proyecto se atendie un consejo de [36] de experimentar con tec-
nologías conocidas, por ello se escoge Java como stack tecnológico principal, dado el conoci-
miento que posee el grupo por el stack que se trabaja en el monolito. El framework predilecto es
Spring Cloud por el conjunto de herramientas que posee para los sistemas de microservicios.
Una de las herramientas acogidas es el servidor de configuración central para que los microser-
vicios puedan obtener de él las configuraciones básicas, como controles de acceso, llave RSA
pública para validación del JWT, entre otras. La tecnología seleccionada para la adaptación del
API Gateway es Spring Cloud Gateway por sus ventajas técnicas en el uso de Spring WebFlux que
permite un manejo asincrónico de las peticiones y que adicionalmente permite la flexibilidad téc-
nica para implementar las estrategias descritas por el modelo, logrando la correcta sincronía con
el monolito para el manejo de las sesiones, la conversión del token de una cookie a la cabecera
HTTP Authorization y redirecciones correctas para los servicios de presentación y lógica de ne-
gocio. Para la capa de presentación se crea un nuevo proyecto en Angular, una tecnología Node
JS basado en componentes visuales, que posee grandes beneficios en el manejo de formularios
y sus validaciones.
Para administrar, sincronizar y componer las trazas del sistema, se utiliza Apache Kafka, un
broker de mensajería robusto, de código abierto, funcional y bastante completo que brinda se-
guridad y confianza. Es un proyecto desarrollado en Java que permite adaptar los servicios a las
necesidades del modelo. Para ello se requiere incluir a la arquitectura 3 componentes: el Apache
Kafka naturalmente, Zookeeper que le permite a Kafka coordinar los procesos distribuidos y un
servicio Logger que se encarga de generar la composición de las trazas de los que requieren más
de un microservicio. Toda la información se almacena en una base de datos no relacional debido
al gran volumen de datos que se genera, con el objetivo de que la búsqueda de información se
realice de forma óptima.
Una vez la base del proyecto está completa, se procede con el análisis mediante DDD del módulo
a estrangular. Se implementa por tres sesiones Event Storming, cada una de ellas aproximadamente
de una hora, donde se logra identificar el lenguaje ubicuo, los eventos cronológicamente ordena-
dos, los comandos junto con los usuarios que intervienen en el módulo, los sistemas externos y
los agregados del sistema. Para finalizar, se hallan las relaciones más comunes entre los eventos
y agregados del sistema y con base en las propiedades comunes se identifican los candidatos a
microservicios más apropiados, todo esto guiado por los expertos del sistema.
6.2 Resultados 45
6.2. Resultados
Luego de extraer el submódulo calificación del módulo Idioma del monolito, mediante el modelo
de evolución propuesto en este documento, los resultados se pueden evidenciar a través de las
vistas actualizadas del sistema.
46 6 Validación del Modelo
ISys
Monolito
Configuración Idioma
Calificación
Calificación Idioma
Idioma
Convenciones
Figura 6-3.: Vista de descomposición del sistema con el primer submódulo evolucionado del
módulo de idioma.
6.2 Resultados 47
Presentación
Calificación
Idioma
Interfaz de usuario
«permitido usar»
Microservicio
Calificación Idioma
Controlador
«permitido
«permitido usar» usar»
Servicio
sedadilitu
oledom
ojop
«permitido usar»
Acceso a datos
«permitido
Repositorio usar»
«permitido usar»
Datos
Base de datos
Datos
Convenciones
Figura 6-4.: Vista de capas del submódulo calificación de idioma evolucionado a microservicios.
48 6 Validación del Modelo
A nivel de datos, se diseña e implementa un nuevo modelo de datos que acoge las múltiples es-
tructuras antiguas del sistema y las estructuras vigentes y se combinan como una sola estructura.
La tabla de historico_resultado_inscrito_idioma contiene los resultados de forma estandarizada
de los diferentes procesos antiguos de idioma y conserva una relación con el nombre de la tabla
del modelo antiguo por conservar la trazabilidad del sistema. La tabla resultado_idioma conserva
conserva la estructura del modelo funcional antes de la evolución.
resultado_inscrito_idioma resultado_idioma
tipo_resultado_idioma
historico_resultado_inscrito_idioma tabla_modelo_antiguo
Figura 6-5.: Modelo de datos del submódulo calificación del módulo idioma evolucionado.
Para la migración de datos, se realizó un proceso ETL en Python para transformar y cargar la
información relacionada con el modelo en la nueva base de datos.
«Cliente» Convenciones
navegador
Sistema ISys
Sistemas externos
HTTP «Cortafuego»
isys_waf
«Sistema Externo»
psdda
REST «Balanceador de Carga»
isys_lb
REST
«CMS» REST
admisiones REST HTTP
«Aplicación Web»
frontend
REST
«API Gateway»
gateway
HTTP
TCP
HTTP
REST Consumer
REST REST
«Microservicio»
logger
TCP
Figura 6-6.: Vista de componentes y conectores del sistema de información ISys con el primer
submódulo evolucionado.
Para el lanzamiento a producción del sistema resultante del modelo de evolución se requiere
algunos ajustes a la vista de despliegue. Para las bases de datos se adapta el nodo de Servidor de Base
de Datos para que posea también el entorno de ejecución de Mongodb y se reutiliza el entorno de
ejecución de PostgreSQL 9.5 para las nuevas bases de datos que requiere el sistema. Esta decisión
se toma por cuestión de presupuesto. El Servidor de Aplicación mantiene sus características. Tanto
el Servidor de Aplicación como el Servidor de Base de Datos se encuentran en una sub VPC privada.
Se hace la adquisición de un clúster de Kubernetes en AWS con tres nodos de tipo t3.medium,
donde se ejecutarán de forma administrada los nuevos componentes del sistema en sus entornos
de ejecución correspondientes. Al clúster únicamente se puede acceder a través del Gateway por
aspectos de seguridad. El clúster se encuentra dentro de otra sub VPC privada que se encuentra
en una VPC diferente a la del Servidor de Aplicación y Servidor de Base de Datos. El Elastic Load Balancing,
quien se encuentra en una sub VPC pública, permite la conexión de clientes externos al sistema.
La vista descrita anteriormente se puede ver representada por la figura 6-7.
50 6 Validación del Modelo
«Monolito»
isys_app
Convenciones «Base de Datos» «Base de Datos»
AWS - VPC «Artefacto» calificacion_db config_server_db
sitio.war
AWS - Sub VPC pública
AWS - Sub VPC privada «desplegado en» «desplegado en» «desplegado en»
«Nodo» «Nodo»
Servidor de Aplicación Servidor de Base de Datos
{Proveedor = AWS-EC2, {Proveedor = AWS-EC2,
OS = Centos 7, OS = Centos 7,
TipoInstancia = t2.xlarge} TipoInstancia = t2.xlarge}
«API Gateway»
«Cortafuego» gateway «Base de Datos» «Base de Datos»
isys_waf «Balanceador de Carga» «Microservicio» isys_db log_db
isys_lb «Artefacto» frontend
gateway.jar
«desplegado en»
«desplegado en» «desplegado en»
«desplegado en»
«Clúster»
ISys
{Proveedor = AWS-EKS}
«Nodo»
«Servicio en la Nube» «Contenedor» «Contenedor» Nodo 1
Web Application «Servicio en la Nube» Gateway Frontend {Proveedor = AWS-EC2,
Elastic Load Balancing TipoInstancia = t3.medium}
Firewall {Proveedor = AWS-ELB}
{Proveedor = AWS-WAF}
«Entorno de Ejecución» «Entorno de Ejecución»
JRE 14 : 80 NGINX : 80
«Contenedor» «Contenedor»
Servidor de Configuración Calificación
«Nodo»
«desplegado en» «Entorno de Ejecución» «Entorno de Ejecución» Nodo 2
JRE 14 : 80 JRE 14 : 80 {Proveedor = AWS-EC2,
TipoInstancia = t3.medium}
«Contenedor»
Kafka
«Entorno de Ejecución»
JRE 11 : 9092
«Nodo»
«desplegado en» Nodo 3
«desplegado en» «Contenedor» «Contenedor» {Proveedor = AWS-EC2,
Logger Zookeeper TipoInstancia = t3.medium}
Figura 6-7.: Vista de despliegue del sistema de información ISys del primer submódulo evolu-
cionado.
7. Conclusiones y Trabajo Futuro
7.1. Conclusiones
El modelo presentado permite la evolución arquitectónica de monolito a microservicios del sis-
tema de información ISys de manera transitiva, manteniendo la disponibilidad del sistema y de
los datos históricos, conservando la operación habitual de la organización sin afectar los proce-
sos y sin comprometer la seguridad del sistema. El modelo de evolución resultante es flexible, su
implementación de manera iterativa apoya la priorización de servicios y favorece el análisis y el
diálogo de expertos sobre el sistema. En el inicio de cada iteración se requiere volver a generar
la matriz de dependencias del sistema, para que a través del modelo se logre priorizar los ser-
vicios. Las variables de entrada y salida del modelo soportan en gran medida la descripción del
trabajo realizado durante el proceso de evolución arquitectónica. La adaptación de los patrones
en el modelo brinda ventajas técnicas que permiten asumir los retos particulares del sistema en
su proceso de evolución.
[5] BARESI, Luciano ; GARRIGA, Martin ; DE RENZIS, Alan: Microservices identification through
interface analysis. In: Lecture Notes in Computer Science (including subseries Lecture Notes in Artificial
Intelligence and Lecture Notes in Bioinformatics) Bd. 10465 LNCS, 2017. – ISBN 9783319672618,
S. 19–33
[6] BARNES, Jeffrey M. ; GARLAN, David ; SCHMERL, Bradley: Evolution styles: foundations and
models for software architecture evolution. In: Software & Systems Modeling 13 (2014), Nr. 2,
649–678. http://dx.doi.org/10.1007/s10270-012-0301-9. – DOI 10.1007/s10270–
012–0301–9. – ISSN 1619–1374
[7] BASS, Len ; CLEMENTS, Paul ; KAZMAN, Rick: Software Architecture in Practice. Third. Addison-
Wesley Professional, 2012. – ISBN 9780321815736
[9] BROWN, Simon: Software Architecture for Developers: Technical leadership by coding, coaching, col-
laboration, architecture sketching and just enough up front design. Leanpub, 2015. – 275 S. http:
//gen.lib.rus.ec/book/index.php?md5=5EAFB7A3F234817908D3F4C9FA05551B
[10] BUSHONG, Vincent ; ABDELFATTAH, Amr S. ; MARUF, Abdullah A. ; DAS, Dipta ; LEHMAN,
Austin ; JAROSZEWSKI, Eric ; COFFEY, Michael ; CERNY, Tomas ; FRAJTAK, Karel ; TISNOVSKY,
Pavel ; BURES, Miroslav: On Microservice Analysis and Architecture Evolution: A Systematic Mapping
Study
[11] CERVANTES, Humberto ; KAZMAN, Rick: Designing Software Architecture: A Practical Approach.
2016. – 388 S. – ISBN 9780134390789
[12] CHRISTOFOROU, Andreas ; ODYSSEOS, Lambros ; ANDREOU, Andreas S.: Migration of soft-
ware components to microservices: Matching and synthesis. In: SPANOUDAKIS, G (Hrsg.)
; DAMIANI, E (Hrsg.) ; MACIASZEK, L (Hrsg.) ; MACIASZEK, L (Hrsg.): ENASE 2019 - Proceed-
ings of the 14th International Conference on Evaluation of Novel Approaches to Software Engineering,
SciTePress, 2019. – ISBN 9789897583759, 134–146
[13] CLEMENTS, Paul ; BACHMANN, Felix ; BASS, Len ; GARLAN, David ; IVERS, James ; LITTLE, Reed
; MERSON, Paul ; NORD, Robert ; STAFFORD, Judith: Documenting Software Architectures: Views
and Beyond. Second. Addison-Wesley Professional, 2010. – 537 S. https://martinfowler.
com/articles/microservices.html. – ISBN 978–0321552686
[16] ESKI, Sinan ; BUZLUCA, Feza: An automatic extraction approach - Transition to microservices
architecture from monolithic application. In: ACM International Conference Proceeding Series Bd.
Part F1477, Association for Computing Machinery, 2018. – ISBN 9781450364225
[17] EVANS, Eric: Domain-Driven Design: Tackling Complexity in the Heart of Software. Addison Wesley,
2003. – 560 S. – ISBN 0321125215
[19] FOWLER, Martin ; RICE, David ; FOEMMEL, Matthew ; HIEATT, Edward ; MEE, Robert ;
STAFFORD, Randy: Patterns of Enterprise Application Architecture. Addison Wesley, 2002. – 560
S. – ISBN 0321127420
56 A Bibliografía
[20] FREEMAN, Eric ; FREEMAN, Elisabeth ; SIERRA, Kathy ; BATES, Bert ; LOUKIDES, Mike (Hrsg.):
Head First Design Patterns. 2013. – ISBN 9780596007126
[21] FREITAS, F ; FERREIRA, A ; CUNHA, J ; MELIUZ: Refactoring Java Monoliths into Executable
Microservice-Based Applications. In: 25th Brazilian Symposium on Programming Languages, SBLP
2021, held in conjunction with the Brazilian Conference on Software: Theory and Practice, CBSoft 2021,
Association for Computing Machinery, 2021. – ISBN 9781450390620 (ISBN), 100–107
[22] FRITZSCH, J ; BOGNER, J ; ZIMMERMANN, A ; WAGNER, S ; B., Meyer (Hrsg.) ; B., Meyer (Hrsg.) ;
M., Mazzara (Hrsg.) ; J.-M., Bruel (Hrsg.): From monolith to microservices: A classification of refac-
toring approaches. http://dx.doi.org/10.1007/978-3-030-06019-0_10. Version: 2019
[24] KALSKE, Miika ; MÄKITALO, Niko ; MIKKONEN, Tommi: Challenges When Moving from
Monolith to Microservice Architecture. Version: feb 2018. http://dx.doi.org/10.
1007/978-3-319-74433-9_3. 2018. – DOI 10.1007/978–3–319–74433–9_3. – ISBN 978–
3–319–74432–2, S. 32–47
[25] KAMIMURA, Manabu ; YANO, Keisuke ; HATANO, Tomomi ; MATSUO, Akihiko: Extracting
Candidates of Microservices from Monolithic Application Code. In: Proceedings - Asia-Pacific
Software Engineering Conference, APSEC Bd. 2018-Decem, IEEE Computer Society, 2018. – ISBN
9781728119700, 571–580
[26] KAPLUNOVICH, A: ToLambda - Automatic path to serverless architectures. In: 3rd IEEE/ACM
International Workshop on Refactoring, IWOR 2019, Institute of Electrical and Electronics Engi-
neers Inc., 2019. – ISBN 9781728122700 (ISBN), 1–8
[28] LAPUZ, N ; CLARKE, P ; ABGAZ, Y ; M., Yilmaz (Hrsg.) ; P., Clarke (Hrsg.) ; R., Messnarz (Hrsg.) ;
M., Reiner (Hrsg.): Digital Transformation and the Role of Dynamic Tooling in Extracting Microservices
from Existing Software Systems. http://dx.doi.org/10.1007/978-3-030-85521-5_20.
Version: 2021
[30] LI, S S. ; ZHANG, H ; JIA, Z J. ; LI, Z ; ZHANG, C ; LI, J Q. ; GAO, Q Y. ; GE, J D. ; SHAN, Z H.:
A dataflow-driven approach to identifying microservices from monolithic applications. In:
57
[32] MALLIDI, R K. ; SHARMA, M ; SINGH, J: Legacy Digital Transformation: TCO and ROI Analysis.
In: International Journal of Electrical and Computer Engineering Systems 12 (2021), Nr. 3, 163–170.
http://dx.doi.org/10.32985/IJECES.12.3.5. – DOI 10.32985/IJECES.12.3.5. – ISSN
18476996 (ISSN)
[33] MENS, T: Introduction and roadmap: History and challenges of software evolution. In:
Software Evolution (2008), 1–11. http://dx.doi.org/10.1007/978-3-540-76440-3_1. –
DOI 10.1007/978–3–540–76440–3_1. – ISSN 9783540764397 (ISBN)
[35] NEWMAN, Sam ; LOUKIDES, Mike (Hrsg.) ; MACDONALD, Brian (Hrsg.): Building Microservices.
O’Reilly Media, Inc., 2015. – 250 S. – ISBN 9781491950357
[36] NEWMAN, Sam: Monolith to Microservices. O’Reilly Media, Inc., 2019. – 221 S. – ISBN
9781492047834
[39] POLÁK, Marek ; HOLUBOVÁ, Irena: Information system evolution management - A complex
evaluation. In: RYSAVY, O (Hrsg.) ; VRANIC, V (Hrsg.): ACM International Conference Proceeding
Series Bd. Part F1305, Association for Computing Machinery, 2017. – ISBN 9781450348430
[40] PONCE, Francisco ; MARQUEZ, Gaston ; ASTUDILLO, Hernan: Migrating from monolithic
architecture to microservices: A Rapid Review. In: Proceedings - International Conference of the
Chilean Computer Science Society, SCCC Bd. 2019-Novem, 2019. – ISBN 9781728156132
[41] REN, Zhongshan ; WANG, Wei ; WU, Guoquan ; GAO, Chushu ; CHEN, Wei ; WEI, Jun ; HUANG,
Tao: Migrating web applications from monolithic structure to microservices architecture.
In: ACM International Conference Proceeding Series, Association for Computing Machinery, sep
2018. – ISBN 9781450365901
58 A Bibliografía
[44] RICHARDSON, Chris ; MICHAELS, Marina (Hrsg.) ; MENNERICH, Christian (Hrsg.) ; DRAGOSAVL-
JEVIÇ, Aleksandar (Hrsg.) ; WEIDERT, Lori (Hrsg.) ; COLLINS, Corbin (Hrsg.) ; BRENER, Alyson
(Hrsg.) ; MILES, Andy (Hrsg.) ; DALINNIK, Dennis (Hrsg.) ; TUDOR, Marija (Hrsg.): Microservices
Patterns. First Edit. Shelter Island : Manning Publications Co, 2019. – ISBN 9781617294549
[45] RICHARDSON, Chris ; SMITH, Floyd: Microservices - From Design to Deployment. In: Nginx
(2016), S. 80
[46] ROZANSKI, Nick ; WOODS, Eoin: Software systems architecture: working with stakeholders using
viewpoints and perspectives. Second. 2012. – 49–5717–49–5717 S. http://dx.doi.org/
10.5860/choice.49-5717. http://dx.doi.org/10.5860/choice.49-5717. – ISBN
9780321718334
[47] SANTIS, Sandro D. ; FLOREZ, Luis ; NGUYEN, Duy V. ; ROSA, Eduardo: Evolve the Monolith to
Microservices with Java and Node. In: IBM Redbooks (2016), 125. http://www.redbooks.
ibm.com/redbooks/pdfs/sg248358.pdf. ISBN 0783442119
[48] SANTOS, N ; RITO SILVA, A: A complexity metric for microservices architecture migration.
In: 17th IEEE International Conference on Software Architecture, ICSA 2020, Institute of Electrical
and Electronics Engineers Inc., 2020. – ISBN 9781728146591 (ISBN), 169–178
[50] TAYLOR, Richard ; MEDVIDOVIC, Nenad ; DASHOFY, Eric: Software Architecture: Foundations,
Theory, and Practice. Wiley, 2008. – ISBN 9780470167748
oriented architecture. In: H.-G., Fill (Hrsg.) ; M, van S. (Hrsg.) ; MACIASZEK, L (Hrsg.) ; MACI-
ASZEK, L (Hrsg.): 16th International Conference on Software Technologies, ICSOFT 2021, SciTePress,
2021. – ISBN 9789897585234 (ISBN), 78–89