Comprende las ventajas de utilizar IBM Mono2Micro para automatizar la refactorización de aplicaciones – IBM Developer

Comprende las ventajas de utilizar IBM Mono2Micro para automatizar la refactorización de aplicaciones

Introducción

Los clientes están cada vez más intentando trasladar sus aplicaciones a la nube. Sin embargo, la experiencia está lejos de estar completa. En una entrevista, Arvind Krishna, CEO de IBM, señaló que alrededor del 80 % de las aplicaciones del cliente aún no se han trasladado a la nube. Un gran número de estas aplicaciones están en funcionamiento desde hace bastante tiempo. Por varias razones, no se están trasladando a la nube. Quizás son tan grandes que la simple lift-and-shift o sus variaciones, como el cambio de plataforma, pueden no ser tan atractivos. En muchos casos, los clientes desean refactorizar estas aplicaciones primero antes de desplegar las versiones refactorizadas en la nube para obtener el máximo beneficio de sus inversiones en modernización. Desafortunadamente, refactorizar una aplicación es un ejercicio complejo y no trivial. No existen metodologías sólidas pero simples para refactorizar aplicaciones monolíticas de una manera económica y no disruptiva.

IBM Mono2Micro (beta), una empresa conjunta de IBM Research e IBM Cloud and Cognitive Software es un ambicioso intento guiado por Inteligencia Artificial para refactorizar de forma automática las aplicaciones monolíticas de Java en microservicios. Mono2Micro también deriva su poder de la Inteligencia Artificial y su profundo conocimiento incorporado de la semántica del lenguaje de programación Java. Utilizando machine learning (ML) y deep learning (DL), Mono2Micro primero refactoriza las aplicaciones monolíticas en una serie de particiones disjuntas (agrupaciones de clases). Operando sobre estas particiones y guiado por la semántica del lenguaje de programación, Mono2Micro genera de forma automática código para que las particiones las realicen como microservicios.

Este artículo, después de explicar brevemente los principios operativos de Mono2Micro, destaca los interesantes resultados obtenidos de la aplicación de Mono2Micro en el campo. Este artículo compara las estrategias básicas de Mono2Micro con las de metodologías o herramientas similares para transformar aplicaciones monolíticas, señalando la utilidad práctica, la superioridad y, por lo tanto, un mejor ROI en Mono2micro en comparación con otras utilidades relacionadas en la refactorización de monolitos existentes de manera económica en un modo sano y seguro.

Principios de operación

Mono2Micro, presentado en el artículo «Transforme aplicaciones monolíticas en microservicios con IBM Mono2Micro» (IBM Developer, julio de 2020) y este video que explica cómo es posible automatizar la refactorización de aplicaciones con Mono2Micro, combina tanto el análisis estático como el de runtime de aplicaciones para generar particiones. mono2micro-bluejay, el primer componente de Mono2Micro instrumenta el código fuente de Java ingresando enunciados de impresión simples para registrar entradas y salidas de funciones con marcas de tiempo. Durante el proceso de instrumentación, el componente también extrae un número de metadatos sobre todas las clases, uno de los cuales son los atributos de miembro de las clases. Basado en dichos atributos de miembro, Mono2Micro crea una relación de dependencia de datos de contención entre clases. Hablando formalmente, existe una dependencia de datos de contención de la clase A a la clase B, si las clases A yB son tipos Java no primitivos y la clase A contiene al menos un miembro b de tipo B.

El usuario ejecuta todos los casos de uso comercial de las aplicaciones después de crear y desplegar el código instrumentado. Los archivos de registro de JVM registrarán los seguimientos de ejecución en función de los casos de uso empresarial ejecutados. Los archivos de registro junto con los metadatos generados a partir del análisis estático del código fuente se introducen en mono2micro-aipl, el componente de Inteligencia Artificial de Mono2Micro. Usando análisis de flujo temporal y técnicas no supervisadas de machine learning (ML) y deep learning (DL), mono2micro-aipl genera dos conjuntos de particiones: particiones basadas en ‘lógica empresarial’ y particiones basadas en ‘uniones naturales’. En la primera iteración, las particiones basadas en la lógica empresarial se derivan exclusivamente en función de los seguimientos de ejecución. En la siguiente iteración, todas las dependencias de datos entre particiones se eliminan al fusionar todas las particiones relacionadas para formar particiones más grandes, llegando así a uniones naturales. Las particiones basadas en uniones naturales pueden naturalmente generar microservicios sin estado y no compartir nada, lo que conducirá directamente a su escalabilidad y disponibilidad independientes.

mono2micro-ui, el componente GUI de Mono2Micro, muestra las importantes salidas de mono2micro-bluejay y mono2micro-aipl en una GUI intuitiva. En los paneles GUI se pueden ver dos gráficos dirigidos correspondientes a dos características diferentes de la aplicación monolítica original: la dependencia de datos de contención obtenida del análisis de código fuente estático y las llamadas en runtime entre clases, obtenidas del análisis de los archivos de registro de runtime. Las dos categorías de particiones también se pueden inspeccionar en la GUI. mono2micro-ui también permite al usuario ajustar las recomendaciones de partición.

Aunque las particiones basadas en uniones naturales parecen ideales, según nuestra experiencia en el tratamiento de aplicaciones de clientes y el manejo de aplicaciones monolíticas tradicionales internas, el uso de uniones naturales, en general, produce una o dos particiones muy grandes que contienen todas las clases importantes. El particionamiento basado en lógica empresarial normalmente produce un mayor número de particiones y una mejor distribución de clases entre particiones. Sin embargo, el particionamiento basado en lógica empresarial casi siempre estará asociado con dependencias de datos entre particiones.

Los usuarios avanzados con un conocimiento profundo en arquitectura y dominio de la aplicación monolítica pueden decidir ajustar las particiones recomendadas por Mono2Micro. En el panel de la GUI, es posible seguir una estrategia de partición personalizada de acuerdo mutuo siguiendo este esquema:

  • Comenzar desde las divisiones naturales o las particiones basadas en lógica empresarial.
  • Cambiar de lado
  • Parar en un punto donde se obtenga un equilibrio entre tres métricas:
    • Pureza del contexto empresarial
    • Invocaciones de métodos entre particiones
    • Dependencias de datos entre particiones

Los informes generados por Mono2Micro son de gran ayuda para los usuarios a fin de conseguir particiones personalizadas de forma iterativa.

Finalmente, mono2micro-cardinal, el componente de Mono2Micro que se ocupa de la semántica de los lenguajes de programación, genera de forma automática el código para las particiones. Más específicamente, mono2micro-cardinal genera las API para invocar los microservicios y todo el código básico para manejar la gestión de objetos distribuidos, recolección de basura y traducciones de objetos locales remotos. Para algunos casos extremos en los que Mono2Micro no puede generar código, se proporciona al usuario una guía prescriptiva con sugerencias sobre cómo manejar el problema. De nuestra experiencia hasta ahora, podemos decir que mono2micro-cardinal genera más del 80 % del código necesario para realizar microservicios desde de particiones.

Los cuatro componentes principales de Mono2Micro están disponibles como contenedores en Docker Hub. Para ver detalles de los componentes y su contexto de uso, consulta la «Guía del usuario de Mono2Micro», que está disponible cuando te registras para la versión beta de Mono2Micro.

Resultados

Mono2Micro y sus primeras versiones han generado un gran interés entre los usuarios. Como ejemplo, una corporación de Fortune 100 probó una versión temprana de Mono2Micro y los resultados obtenidos fueron muy prometedores. Mono2Micro recomendó alrededor de dos docenas de particiones para una aplicación monolítica que contiene más de un millón de líneas de código en cuestión de semanas. Todas las particiones generadas fueron verificadas por pymes de la corporación. Esto contrasta fuertemente con el esfuerzo de refactorización manual, que continúa durante más de un año. Como subproducto del análisis, Mono2Micro señaló la existencia de una cantidad significativa de código muerto potencial en la aplicación que se puede eliminar para reducir el tamaño y complejidad estática de la aplicación. Se está trabajando para utilizar Mono2Micro en varias corporaciones Fortune 500 para refactorizar las aplicaciones monolíticas seleccionadas por ellas. En un artículo futuro, planeamos discutir los resultados en detalle.

Refactorización en comparación con reescritura

Mono2Micro refactoriza las aplicaciones, manteniendo los ajustes de código al mínimo. Mono2Micro nunca separa una clase; considera que una clase es la unidad más pequeña indivisible encapsulada. Los enfoques manuales convencionales de conversión de aplicaciones monolíticas en microservicios basados en el análisis conducido por dominios y contexto limitado generalmente no conservan las clases. Un número significativo de clases que implementan funcionalidades comerciales centrales se desglosan; los métodos existentes de estas clases se distribuyen entre diferentes clases, que a menudo residen en diferentes particiones. También se crean clases nuevas durante el proceso. Este enfoque puede verse como la creación de un modelo de encapsulación diferente y, por lo tanto, una arquitectura diferente de la aplicación monolítica original, que requiere una cantidad significativa de reescritura de código. Esta reescritura es invasiva, costosa y arriesgada. Por el contrario, Mono2Micro solo considera la refactorización basada en clases, lo que da como resultado un enfoque no invasivo, seguro y altamente económico, que produce resultados que pueden demostrarse rápidamente.

Como punto de validación de nuestra hipótesis, comparamos las particiones generadas por Mono2Micro con las creadas manualmente por IBM Garage y JPMorgan Chase (Repositorio de GitHub) para la misma aplicación de muestra de open source, DayTrader. Era evidente que ambos enfoques implicaron una cantidad significativa de reescritura: han interrumpido y reescrito las clases que implementan la mayoría de las funcionalidades comerciales de DayTrader. Teniendo en cuenta la cantidad de reescritura necesaria para ambos enfoques, incluso para una aplicación de muestra, se puede especular fácilmente que las aplicaciones de la vida real pueden necesitar meses, si no es que años, de trabajo. La reescritura de clases presenta un problema adicional que se debe manejar en la mayoría de los casos. Deben desarrollarse nuevos casos de prueba para validar la funcionalidad de los microservicios reescritos. Considerando que, para los microservicios refactorizados creados por Mono2Micro, uno debería poder usar los mismos casos de prueba existentes de las aplicaciones monolíticas originales.

Mientras que el rediseño y la reescritura pueden ser apropiados en algunos casos en los que se crean nuevos microservicios; para transformar aplicaciones monolíticas existentes, el enfoque de refactorización de Mono2Micro se destaca en economía, simplicidad y efectividad. El esquema de refactorización impulsado por Inteligencia Artificial de Mono2Micro no altera la encapsulación fundamental y la arquitectura de la aplicación monolítica. Esto:

  • minimiza la necesidad de reescribir el código y
  • permite reutilizar casos de prueba existentes

proporcionando así un ROI sustancial a los usuarios.

En un artículo futuro, planeamos elaborar los enfoques de refactorización en comparación con reescritura mientras convertimos aplicaciones monolíticas en una configuración más formal y cuantificada con ejemplos ilustrativos.

Otros enfoques para transformar aplicaciones monolíticas

Hay algunos enfoques existentes para transformar aplicaciones monolíticas en microservicios. La mayoría de ellos son pautas manuales que se centran en diseño basado en dominios (DDD). Aunque DDD proporciona una buena guía arquitectónica para diseñar microservicios, la decisión sobre cómo definir el dominio correcto y cómo transformar una aplicación monolítica en el diseño deseado depende completamente del arquitecto y de los desarrolladores. Todo el proceso es informal y, por lo tanto, algo subjetivo por naturaleza. En la práctica, el proceso exige un esfuerzo manual significativo, que a menudo supera el presupuesto esperado. La cantidad de reescritura de código también puede ser extremadamente alta, lo que resulta en depuración, prueba y verificación prolongadas y, en casos extremos, se abandonan los proyectos. En comparación, Mono2Micro apunta a una metodología de transformación eficiente, consistente y efectiva, en su mayoría automatizada, que implica una mínima reescritura de código.

El enfoque basado en DDD antes mencionado puede automatizarse hasta cierto punto. Existen dos categorías de herramientas que utilizan Inteligencia Artificial para llegar a las particiones. La primera categoría usa Inteligencia Artificial en los resultados del análisis de código estático, mientras que la otra categoría usa análisis en runtime. Ambos enfoques basados en dominios padecen de las deficiencias mencionadas anteriormente. El análisis estático, aunque aparentemente simple, no puede detectar o usar el flujo temporal real de control y los volúmenes de llamadas en runtime, lo que posiblemente resulte en la producción de particiones de calidad inferior en la mayoría de los casos. Una herramienta basada en análisis estático puede crear particiones que constan de clases no utilizadas. El código muerto de las aplicaciones tradicionales también puede influir en las decisiones de partición de las herramientas basadas en análisis estáticos de forma adversa. Un enfoque basado en análisis totalmente dinámico no podrá considerar la dependencia de los datos al recomendar particiones.

Mono2Micro considera que tanto los análisis estáticos como los de runtime llegan a dos categorías de particiones, y también proporciona una guía a los usuarios para llegar a particiones personalizadas, lo cual no es compatible con ninguna herramienta disponible.

Además de la creación de particiones de calidad evidentemente superior con respecto a la refactorización, Mono2Micro tiene la capacidad única de generar código para realizar las particiones. La capacidad de generación de código puede acelerar seriamente la experiencia a la nube de cualquier corporación refactorizando rápidamente las aplicaciones monolíticas de una manera sólida, no invasiva y segura, así como desplegando los microservicios generados en IBM Cloud Pak for Applications.

Próximos pasos

Prueba las eficientes funciones de refactorización y generación de código de Mono2Micro, que está disponible hoy como oferta beta. Es posible probar todos los componentes de Mono2Micro en tus propias aplicaciones monolíticas. También es posible probar rápidamente los componentes de generación de código e Inteligencia Artificial de Mono2Micro para una aplicación monolítica de ejemplo utilizando los datos de muestra proporcionados.

En la actualidad, Mono2Micro solo maneja aplicaciones Java, pero su arquitectura modular simple permite conectar componentes para otro lenguaje también.

Mono2Micro está evolucionando. Queremos generar de forma automática la información de configuración para los microservicios junto con muchas otras funciones.

Agradecimientos

Melissa Modejski, Directora, IBM Cloud and Cognitive Software revisó meticulosamente el artículo y brindó sugerencias para mejorar la precisión técnica y calidad de la presentación. Los autores agradecen toda la ayuda y contribuciones de Danny Mace, VP de IBM Cloud and Cognitive Software; Dr. Ruchir Puri, IBM Fellow, Chief Scientist, IBM Research; Dr. Saurabh Sinha, IBM Research; Dra. Liana Chen; IBM Research y todo el equipo de desarrollo de Mono2Micro. Las sugerencias de John Meegan, Offering Manager, Cloud Integration y la excelente edición de textos de Sarah Domina mejoraron la calidad de la presentación.