<?xml version="1.0"?>
<oembed><version>1.0</version><provider_name>Setblau</provider_name><provider_url>https://setblau.com/blog</provider_url><author_name>Llu&#xED;s Gonz&#xE0;lez</author_name><author_url>https://setblau.com/blog/author/lgonzalez/</author_url><title>Romper el monolito - Setblau</title><type>rich</type><width>600</width><height>338</height><html>&lt;blockquote class="wp-embedded-content" data-secret="2zbYVByXEb"&gt;&lt;a href="https://setblau.com/blog/romper-el-monolito/"&gt;Romper el monolito&lt;/a&gt;&lt;/blockquote&gt;&lt;iframe sandbox="allow-scripts" security="restricted" src="https://setblau.com/blog/romper-el-monolito/embed/#?secret=2zbYVByXEb" width="600" height="338" title="&#xAB;Romper el monolito&#xBB; &#x2014; Setblau" data-secret="2zbYVByXEb" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" class="wp-embedded-content"&gt;&lt;/iframe&gt;&lt;script type="text/javascript"&gt;
/* &lt;![CDATA[ */
/*! This file is auto-generated */
!function(d,l){"use strict";l.querySelector&amp;&amp;d.addEventListener&amp;&amp;"undefined"!=typeof URL&amp;&amp;(d.wp=d.wp||{},d.wp.receiveEmbedMessage||(d.wp.receiveEmbedMessage=function(e){var t=e.data;if((t||t.secret||t.message||t.value)&amp;&amp;!/[^a-zA-Z0-9]/.test(t.secret)){for(var s,r,n,a=l.querySelectorAll('iframe[data-secret="'+t.secret+'"]'),o=l.querySelectorAll('blockquote[data-secret="'+t.secret+'"]'),c=new RegExp("^https?:$","i"),i=0;i&lt;o.length;i++)o[i].style.display="none";for(i=0;i&lt;a.length;i++)s=a[i],e.source===s.contentWindow&amp;&amp;(s.removeAttribute("style"),"height"===t.message?(1e3&lt;(r=parseInt(t.value,10))?r=1e3:~~r&lt;200&amp;&amp;(r=200),s.height=r):"link"===t.message&amp;&amp;(r=new URL(s.getAttribute("src")),n=new URL(t.value),c.test(n.protocol))&amp;&amp;n.host===r.host&amp;&amp;l.activeElement===s&amp;&amp;(d.top.location.href=t.value))}},d.addEventListener("message",d.wp.receiveEmbedMessage,!1),l.addEventListener("DOMContentLoaded",function(){for(var e,t,s=l.querySelectorAll("iframe.wp-embedded-content"),r=0;r&lt;s.length;r++)(t=(e=s[r]).getAttribute("data-secret"))||(t=Math.random().toString(36).substring(2,12),e.src+="#?secret="+t,e.setAttribute("data-secret",t)),e.contentWindow.postMessage({message:"ready",secret:t},"*")},!1)))}(window,document);
//# sourceURL=https://setblau.com/blog/wp-includes/js/wp-embed.min.js
/* ]]&gt; */
&lt;/script&gt;
</html><thumbnail_url>https://setblau.com/blog/wp-content/uploads/2018/10/comepiedras.jpg</thumbnail_url><thumbnail_width>640</thumbnail_width><thumbnail_height>484</thumbnail_height><description>&#xBF;Qu&#xE9; desacoplar y cu&#xE1;ndo? A medida que los sistemas monol&#xED;ticos se vuelven demasiado grandes para lidiar con ellos, muchas empresas est&#xE1;n dispuestas a dividirlos en el estilo arquitect&#xF3;nico de los microservicios, como se hizo en su d&#xED;a en el desarrollo con OOP, ahora le ha llegado el momento a los sistemas.&#xA0;Es un viaje que vale la pena, pero no es f&#xE1;cil.&#xA0;Hemos aprendido que para hacer esto bien, debemos comenzar con un servicio simple, pero luego extraer servicios basados &#x200B;&#x200B;en capacidades verticales que sean importantes para el negocio y est&#xE9;n sujetas a cambios frecuentes.&#xA0;Estos servicios deben ser grandes al principio y, de preferencia, no dependen del monolito restante.&#xA0;Debemos asegurarnos de que cada paso de la migraci&#xF3;n representa&#xA0;una mejora at&#xF3;mica de la arquitectura general que adem&#xE1;s de justificar los costes nos permite motivarnos m&#xE1;s.&#xA0; La migraci&#xF3;n de un sistema monol&#xED;tico a un&#xA0;ecosistema de microservicios&#xA0;es un viaje &#xE9;pico.&#xA0;Los que se embarcan en este viaje tienen aspiraciones como aumentar la escala de operaci&#xF3;n, acelerar el ritmo del cambio y escapar del alto costo del cambio.&#xA0;Quieren aumentar su n&#xFA;mero de equipos al tiempo que les permite entregar valor en paralelo e independientemente uno del otro.&#xA0;Quieren experimentar r&#xE1;pidamente con las capacidades centrales de su negocio y entregar valor m&#xE1;s r&#xE1;pido.&#xA0;Tambi&#xE9;n quieren escapar del alto costo asociado con hacer cambios en sus sistemas monol&#xED;ticos existentes. Para trabajar bien no hace falta cambiar de arquitectura.. quiz&#xE1;s sus mismos servicios si fueran &#x2018;SOLID oriented&#x2019; cumpl&#xED;an todas sus necesidades.&#xA0;Vale la pena estudiar el escenario en que aplica cada paradigma. Decidir qu&#xE9; capacidad de desacoplar cu&#xE1;ndo y c&#xF3;mo migrar de manera incremental son algunos de los desaf&#xED;os arquitect&#xF3;nicos de descomponer un monolito a un ecosistema de microservicios.&#xA0;En este art&#xED;culo, compartimos algunas t&#xE9;cnicas que pueden guiar a los equipos de entrega (desarrolladores, arquitectos, gerentes t&#xE9;cnicos) para tomar estas decisiones de descomposici&#xF3;n a lo largo del viaje. El ecosistema del microservicio Antes de embarcarse, es fundamental que todos tengan un entendimiento com&#xFA;n de un ecosistema de microservicios. El ecosistema de microservicios es una plataforma de servicios que encapsula una capacidad empresarial. Una capacidad comercial representa lo que hace una empresa en un dominio particular para cumplir sus objetivos y responsabilidades. Cada microservicio expone una API que los desarrolladores pueden descubrir y utilizar de forma autom&#xE1;tica. Los microservicios tienen un ciclo de vida independiente. Los desarrolladores pueden construir, probar y lanzar cada microservicio de forma independiente. El ecosistema de microservicios impone una estructura organizativa de equipos aut&#xF3;nomos de larga vida, cada uno es responsable de uno o varios servicios. Contrariamente a la percepci&#xF3;n general y al &#x2018;micro&#x2019; en microservicios, el tama&#xF1;o de cada servicio es lo m&#xE1;s importante y puede variar seg&#xFA;n la madurez operativa de la organizaci&#xF3;n. Roadmap Antes de sumergirse en la gu&#xED;a, es importante saber que hay un alto costo general asociado con la descomposici&#xF3;n de un sistema existente para microservicios y puede tomar muchas iteraciones. Es necesario que los desarrolladores y arquitectos eval&#xFA;en detenidamente si la descomposici&#xF3;n de un monolito existente es el camino correcto y si los microservicios en s&#xED; son el destino correcto . Habiendo aclarado eso, vamos a repasar la gu&#xED;a. Calentando motores con una capacidad simple y bastante desacoplada Iniciar una ruta hacia los microservicios requiere un nivel m&#xED;nimo de preparaci&#xF3;n operativa. Requiere acceso al entorno de implementaci&#xF3;n, la creaci&#xF3;n de nuevos canales, integraci&#xF3;n continua para construir, probar e implementar de forma independiente los servicios ejecutables, y la capacidad de proteger, depurar y monitorear una arquitectura distribuida. Se requiere madurez de preparaci&#xF3;n operacional y equipos bien formados ya sea para un nuevo proyecto o descomponiendo un sistema existente. Nuestra sugerencia es que los desarrolladores y los equipos de operaci&#xF3;n construyan la infraestructura subyacente, los procesos de integraci&#xF3;n continua y el sistema de administraci&#xF3;n de API con el primer y segundo servicio que descomponen o construyen. Comience con las capacidades que est&#xE1;n bastante desacopladas del monolito, no requieren cambios en muchas aplicaciones de cara al cliente que actualmente usan el monolito y posiblemente no necesitan un almac&#xE9;n de datos. Lo que los equipos est&#xE1;n optimizando es validar sus enfoques de entrega, mejorar la capacidad de los miembros del equipo y desarrollar la infraestructura m&#xED;nima necesaria para entregar servicios seguros de implementaci&#xF3;n independiente que exponen las API de autoservicio. Primero recomendamos desacoplar los servicios simples. A continuaci&#xF3;n, adoptamos un enfoque diferente: capacidades de desacoplamiento profundamente integradas en el sistema monol&#xED;tico. Aconsejamos realizar servicios de vanguardia primero porque al comienzo del viaje, el mayor riesgo de los equipos de entrega es no operar los microservicios correctamente. Por lo tanto, es bueno usar los servicios perimetrales para practicar los requisitos previos operativos que necesitan. Una vez que han abordado eso, pueden abordar el problema clave de dividir el monolito. Minimiza la dependencia de regreso al monolito Como principio fundamental, los equipos de entrega necesitan minimizar las dependencias de los microservicios reci&#xE9;n formados para el monolito. Un beneficio importante de los microservicios es tener un ciclo de lanzamiento r&#xE1;pido e independiente. Tener dependencias en el monolito (datos, l&#xF3;gica, API) acopla el servicio al ciclo de lanzamiento del monolito, lo que proh&#xED;be este beneficio. A menudo, la principal motivaci&#xF3;n para alejarse del monolito es el alto costo y el lento ritmo de cambio de las capacidades bloqueadas en &#xE9;l, por lo que queremos avanzar progresivamente en una direcci&#xF3;n que desacople estas capacidades b&#xE1;sicas al eliminar las dependencias del monolito. Si los equipos siguen esta gu&#xED;a a medida que desarrollan capacidades en sus propios servicios, lo que encuentran es, en cambio, dependencias en la direcci&#xF3;n inversa. Del monolito a los servicios. Esta es una direcci&#xF3;n de dependencia deseada, ya que no ralentiza el ritmo de cambio para los nuevos servicios. Las siguientes pautas ofrecen otras formas de decidir el orden en el que los desarrolladores desacoplan los servicios. Esto significa que es posible que no siempre puedan evitar las dependencias al monolito. En los casos en que un nuevo servicio termina con una llamada al monolito, sugiero exponer una nueva API del monolito. Es mejor crear una capa en el nuevo servicio para asegurarse de que los conceptos de monolito no se filtren. Esfu&#xE9;rcese por definir la API que refleje los conceptos y estructuras de dominio bien definidos, aunque la implementaci&#xF3;n interna del monolito podr&#xED;a ser diferente. En este desafortunado caso, los equipos de entrega sufragar&#xE1;n el costo y la dificultad de cambiar el monolito, probar y liberar los nuevos servicios junto con el lanzamiento del monolito. Separar las funcionalidades acopladas Estoy asumiendo que en este punto los equipos de entrega se sienten c&#xF3;modos con la creaci&#xF3;n de microservicios y est&#xE1;n listos para atacar los problemas persistentes. Sin embargo, pueden verse limitados con las capacidades que pueden desacoplar a continuaci&#xF3;n sin una dependencia del monolito. La causa principal de esto, a menudo es una capacidad dentro del monolito con fugas, no bien definida como un concepto de dominio, con muchas de las capacidades del monolito que dependen de &#xE9;l. Para poder progresar, los desarrolladores necesitan identificar la funcionalidad acoplada, deconstruirla en conceptos de dominio bien definidos y luego replicar esos conceptos de dominio en servicios separados. Por ejemplo, en un monolito basado en web, la noci&#xF3;n de &#x2018;sesi&#xF3;n (web)&#x2019; es uno de los factores de acoplamiento m&#xE1;s comunes.&#xA0; A menos que abordemos el desacoplamiento, la deconstrucci&#xF3;n y la replicaci&#xF3;n de la actual &#xAB;sesi&#xF3;n&#xBB;, nos esforzaremos por desacoplar muchas de las capacidades futuras ya que se enredar&#xE1;n con el monolito a trav&#xE9;s de los conceptos de la sesi&#xF3;n con fugas. Los desarrolladores pueden extraer microservicios de forma progresiva de las funcionalidades acopladas a un servicio a la vez. Como ejemplo, es posible refactorizar primero la &#x2018;lista de deseos del cliente&#x2019; y extraer eso en un nuevo servicio, luego refactorizar las &#x2018;preferencias de pago del cliente&#x2019; en otro microservicio y rep&#xED;talo. Desacoplar verticalmente y liberar los datos El principal impulsor de las capacidades de desacoplamiento de un monolito es poder liberarlas de forma independiente. Este primer principio deber&#xED;a guiar todas las decisiones que los desarrolladores toman sobre c&#xF3;mo realizar el desacoplamiento. Un sistema monol&#xED;tico a menudo est&#xE1; compuesto de capas estrechamente integradas o incluso de m&#xFA;ltiples sistemas que deben liberarse juntos y tener interdependencias fr&#xE1;giles. La mayor&#xED;a de los intentos de desacoplamiento comienzan con la extracci&#xF3;n de componentes orientados al usuario y algunos servicios de front-end para proporcionar API de f&#xE1;cil uso para las interfaces de usuario modernas, mientras que los datos permanecen bloqueados en un esquema y sistema de almacenamiento. Aunque este enfoque ofrece algunas ventajas r&#xE1;pidas, como cambiar la interfaz de usuario con m&#xE1;s frecuencia, cuando se trata de capacidades b&#xE1;sicas, los equipos de entrega solo pueden moverse tan r&#xE1;pido como la parte m&#xE1;s lenta, el monolito y su almac&#xE9;n de datos monol&#xED;tico. En pocas palabras, sin desacoplar los datos, la arquitectura no es microservicios. Mantener todos los datos en el mismo almac&#xE9;n de datos es contrario a la caracter&#xED;stica de administraci&#xF3;n de datos descentralizada de los microservicios. La estrategia es mover las capacidades verticalmente, desacoplar la capacidad central con sus datos y redirigir todas las aplicaciones de front-end a las nuevas API. Tener m&#xFA;ltiples aplicaciones de escritura y lectura desde y hacia los datos compartidos centralmente es el principal bloqueador para desacoplar los datos junto con el servicio. Los equipos de entrega deben incorporar una estrategia de migraci&#xF3;n de datos que se adapte a su entorno en funci&#xF3;n de si son capaces de redirigir y migrar todos los lectores / escritores de datos al mismo tiempo o no. La estrategia de migraci&#xF3;n de datos de cuatro fases se aplica a muchos entornos que requieren migrar de manera incremental las aplicaciones que se integran a trav&#xE9;s de la base de datos, mientras que todos los sistemas bajo cambio deben ejecutarse continuamente. Desacople lo que es importante para el negocio y los cambios con frecuencia La capacidad de desacoplamiento del monolito es dif&#xED;cil. Extraer una capacidad implica extraer cuidadosamente los datos, la l&#xF3;gica, los componentes del usuario y redirigirlos al nuevo servicio. Debido a que esta es una cantidad de trabajo no trivial, los desarrolladores necesitan evaluar continuamente el costo de la disociaci&#xF3;n con los beneficios que obtienen, por ejemplo, ir m&#xE1;s r&#xE1;pido o crecer en escala. Por ejemplo, si el objetivo de los equipos de entrega es acelerar las modificaciones a las capacidades existentes bloqueadas en un monolito, deben identificar la capacidad que m&#xE1;s se est&#xE1; modificando para sacar. Desacople partes del c&#xF3;digo que est&#xE1;n continuamente cambiando y recibiendo mucho cari&#xF1;o por parte de los desarrolladores y las est&#xE1;n limitando para entregar valor r&#xE1;pidamente. Los equipos de entrega pueden analizar los patrones de compromiso de c&#xF3;digo para descubrir qu&#xE9; ha cambiado hist&#xF3;ricamente m&#xE1;s, y superponer eso con la hoja de ruta y la cartera del producto para comprender las capacidades m&#xE1;s deseadas que recibir&#xE1;n atenci&#xF3;n en el futuro cercano. Necesitan hablar con los gerentes de negocios y de productos para comprender las capacidades de diferenciaci&#xF3;n que realmente les interesan. y superponga eso con la hoja de ruta y la cartera del producto para comprender las capacidades m&#xE1;s deseadas que recibir&#xE1;n atenci&#xF3;n en el futuro cercano. Necesitan hablar con los gerentes de negocios y de productos para comprender las capacidades de diferenciaci&#xF3;n que realmente les interesan. y superponga eso con la hoja de ruta y la cartera del producto para comprender las capacidades m&#xE1;s deseadas que recibir&#xE1;n atenci&#xF3;n en el futuro cercano. Necesitan hablar con los gerentes de negocios y de productos para comprender las capacidades de diferenciaci&#xF3;n que realmente les interesan. Capacidad de desacoplamiento sin reescribir Cuando los desarrolladores desean extraer un servicio de un sistema existente, tienen dos formas de hacerlo: extraer c&#xF3;digo o reescribir la capacidad. A menudo, de forma predeterminada, la extracci&#xF3;n del servicio o la descomposici&#xF3;n monol&#xED;tica se imagina como un caso de reutilizaci&#xF3;n de la implementaci&#xF3;n existente tal como est&#xE1; y de extraerla en un servicio separado. En parte porque tenemos un sesgo cognitivo hacia el c&#xF3;digo que dise&#xF1;amos y escribimos. El trabajo de construir, no importa cu&#xE1;n doloroso sea el proceso o el resultado imperfecto, nos hace crecer el amor por &#xE9;l. De hecho, esto se conoce como el efecto IKEA . Desafortunadamente, este sesgo va a frenar el esfuerzo de descomposici&#xF3;n del monolito. Hace que los desarrolladores y, lo que es m&#xE1;s importante, los gerentes t&#xE9;cnicos ignoren el alto costo y el bajo valor de extraer y reutilizar el c&#xF3;digo. Alternativamente, los equipos de entrega tienen la opci&#xF3;n de volver a escribir la capacidad y retirar el c&#xF3;digo anterior. La reescritura les da la oportunidad de revisar la capacidad del negocio, iniciar una conversaci&#xF3;n con negocio para simplificar el proceso heredado y desafiar las suposiciones y restricciones antiguas incorporadas con el tiempo en el sistema. Tambi&#xE9;n brinda la oportunidad de una actualizaci&#xF3;n tecnol&#xF3;gica, implementando el nuevo servicio con un lenguaje de programaci&#xF3;n y una pila de tecnolog&#xED;a que es m&#xE1;s adecuado para ese servicio en particular. Esta capacidad es posiblemente un buen candidato para reutilizaci&#xF3;n y extracci&#xF3;n. En contraste, el &#x2018;perfil del cliente&#x2019; es una capacidad CRUD simple que se compone principalmente de c&#xF3;digo repetitivo para la serializaci&#xF3;n, manejo de almacenamiento y configuraci&#xF3;n, por lo tanto, es un buen candidato para volver a escribir y retirarse. En nuestra experiencia, en la mayor&#xED;a de los escenarios de descomposici&#xF3;n, es mejor que los equipos reescriban la capacidad como un nuevo servicio y retiren el c&#xF3;digo anterior. Esto est&#xE1; considerando el alto costo y el bajo valor de la reutilizaci&#xF3;n, debido a las siguientes razones: Existe una gran cantidad de c&#xF3;digo repetitivo que se ocupa de las dependencias del entorno, como el acceso a la configuraci&#xF3;n de la aplicaci&#xF3;n en tiempo de ejecuci&#xF3;n, el acceso a los almacenes de datos, el almacenamiento en cach&#xE9; y se construye con marcos antiguos. La mayor parte de este c&#xF3;digo repetitivo debe ser reescrito. La nueva infraestructura para alojar un microservicio es muy diferente del tiempo de ejecuci&#xF3;n de la aplicaci&#xF3;n desde hace d&#xE9;cadas y requerir&#xE1; un tipo muy diferente de c&#xF3;digo repetitivo. Es muy probable que las capacidades existentes no se construyan alrededor de conceptos de dominio claros. Esto resulta en el transporte o almacenamiento de estructuras de datos que no reflejan los nuevos modelos de dominio y requieren una gran reestructuraci&#xF3;n. Un c&#xF3;digo heredado de larga duraci&#xF3;n que ha pasado por muchas iteraciones de cambio podr&#xED;a tener un alto nivel de toxicidad de c&#xF3;digo y un bajo valor para su reutilizaci&#xF3;n. A menos que la capacidad sea relevante, alineada con un concepto de dominio claro y con alta propiedad intelectual, recomiendo encarecidamente volver a escribir y retirar el c&#xF3;digo anterior. Primero macro, luego micro Encontrar los l&#xED;mites del dominio en un monolito heredado es tanto un arte como una ciencia. Como regla general, la aplicaci&#xF3;n de t&#xE9;cnicas de dise&#xF1;o controladas por dominio para encontrar los contextos delimitados que definen los l&#xED;mites de los microservicios es un buen lugar para comenzar. Con demasiada frecuencia, vemos una sobrecorrecci&#xF3;n de monolito grande a servicios realmente peque&#xF1;os, servicios realmente peque&#xF1;os cuyo dise&#xF1;o est&#xE1; inspirado e impulsado por la vista normalizada existente de los datos. Este enfoque para identificar los l&#xED;mites de los servicios casi siempre conduce a un gran n&#xFA;mero de servicios id&#xE9;nticos para acceder a los recursos de CRUD. Para muchos nuevos en la arquitectura de microservicios, esto crea un entorno de alta fricci&#xF3;n que, en &#xFA;ltima instancia, falla la prueba de la liberaci&#xF3;n y ejecuci&#xF3;n independientes de los servicios. Crea un sistema distribuido que es dif&#xED;cil de depurar, un sistema distribuido que se rompe a trav&#xE9;s de los l&#xED;mites transaccionales y, por lo tanto, dif&#xED;cil de mantener consistente, un sistema que es demasiado complejo para la madurez operativa de la organizaci&#xF3;n. Aunque hay algunas pistas, sobre c&#xF3;mo de &#x2018;micro&#x2019; debe ser el microservicio: el tama&#xF1;o del equipo, el tiempo para volver a escribir el servicio, la cantidad de comportamiento que debe encapsular, etc. Nuestro consejo es que el tama&#xF1;o depende de cu&#xE1;ntos servicios pueden proporcionar los equipos de entrega y operaci&#xF3;n de forma independiente liberar, monitorear y operar. Comience con servicios m&#xE1;s grandes en torno a un concepto de dominio l&#xF3;gico, y divida el servicio en m&#xFA;ltiples servicios cuando los equipos est&#xE9;n listos para la operaci&#xF3;n. Migrar en pasos evolutivos at&#xF3;micos La idea de desvanecer un legado monolito en el aire al disociarlo en microservicios bellamente dise&#xF1;ados es algo as&#xED; como un mito y posiblemente indeseable. Cualquier ingeniero experimentado puede compartir historias de migraciones e intentos de modernizaci&#xF3;n que se planificaron e iniciaron con un optimismo total y, en el mejor de los casos, se abandonaron en un momento suficientemente bueno. Los planes a largo plazo de tales esfuerzos se abandonan debido a que cambian las condiciones macro: el programa se queda sin dinero, la organizaci&#xF3;n gira su enfoque hacia otra cosa o el liderazgo en su apoyo. Por lo tanto, esta realidad debe dise&#xF1;arse en la forma en que los equipos abordan el viaje del monolito al microservicio. Yo llamo a este enfoque &#x2018;migraci&#xF3;n en pasos at&#xF3;micos de la evoluci&#xF3;n de la arquitectura&#x2019;, donde cada paso de la migraci&#xF3;n deber&#xED;a acercar la arquitectura a su estado objetivo. Cada unidad de evoluci&#xF3;n puede ser un peque&#xF1;o paso o un gran salto, pero es at&#xF3;mica, ya sea completa o revierte. Esto es especialmente importante ya que estamos adoptando un enfoque iterativo e incremental para mejorar la arquitectura general y los servicios de desacoplamiento. Cada incremento debe dejarnos en un lugar mejor en t&#xE9;rminos del objetivo de la arquitectura, la funci&#xF3;n de la aptitud arquitect&#xF3;nica despu&#xE9;s de cada paso at&#xF3;mico de la migraci&#xF3;n debe generar un valor m&#xE1;s cercano al objetivo de la arquitectura. Imagine que el objetivo de la arquitectura de microservicio es aumentar la velocidad de los desarrolladores modificando el sistema general para ofrecer valor. El equipo decide desacoplar la autenticaci&#xF3;n del usuario final en un servicio separado basado en el protocolo OAuth 2.0. Este servicio est&#xE1; destinado tanto a reemplazar la forma en que la aplicaci&#xF3;n cliente existente (arquitectura antigua) autentica al usuario final, como a los nuevos servicios de arquitectura que validan al usuario final. Llamemos a este incremento en la evoluci&#xF3;n, &#x2018;Introducci&#xF3;n al servicio de autenticaci&#xF3;n&#x2019;. Una forma de presentar el nuevo servicio es seguir estos pasos primero: Cree el servicio Auth, implementando el protocolo OAuth 2.0. Agregue una nueva ruta de autenticaci&#xF3;n en el back-end monolito para llamar al servicio Auth para autenticar al usuario final en cuyo nombre est&#xE1; procesando una solicitud.Si el equipo se detiene aqu&#xED; y gira para construir otro servicio o caracter&#xED;stica, deja la arquitectura general en un estado de mayor entrop&#xED;a. En este estado, hay dos formas de autenticar al usuario, la nueva ruta base de OAuth 2.0 y la ruta basada en contrase&#xF1;a / sesi&#xF3;n del antiguo cliente. En este punto, los equipos est&#xE1;n realmente m&#xE1;s lejos de su objetivo general de hacer cambios m&#xE1;s r&#xE1;pido. Cualquier nuevo desarrollador del c&#xF3;digo monolito necesita lidiar con dos rutas de c&#xF3;digo, una mayor carga cognitiva de comprensi&#xF3;n del c&#xF3;digo y un proceso m&#xE1;s lento para cambiarlo y probarlo. Reemplace la autenticaci&#xF3;n basada en contrase&#xF1;a / sesi&#xF3;n del antiguo cliente con la ruta OAuth 2.0 Retire la ruta del c&#xF3;digo de autenticaci&#xF3;n anterior del monolito En este punto, podemos argumentar que los equipos se han acercado a la arquitectura de destino. A menudo encontramos que los equipos finalizan la migraci&#xF3;n de una capacidad fuera del monolito y claman la victoria tan pronto como se construye la nueva capacidad sin retirar la ruta del c&#xF3;digo antiguo, el anti-patr&#xF3;n descrito anteriormente. Las razones principales para esto son: (a) El enfoque en los beneficios a corto plazo de la introducci&#xF3;n de una nueva capacidad y (b) La cantidad total de esfuerzo requerido para retirar las implementaciones antiguas al tiempo que se enfrentan a prioridades competitivas para crear nuevas caracter&#xED;sticas. Para hacer lo correcto, debemos esforzarnos por hacer los pasos at&#xF3;micos lo m&#xE1;s peque&#xF1;os posible. Al migrar con este enfoque, podemos dividir el viaje en viajes m&#xE1;s cortos. Podemos detenernos, revivir y sobrevivir con seguridad en este largo viaje, matando al monolito. Herramientas Para llevar a cabo un desarrollo orientado a microservicios, las &#xAB;nuevas&#xBB; herramientas como docker y los nuevos servicios en la nube (PaaS) son un gran aliado si nuestro negocio nos permite alojar nuestros datos en una nube p&#xFA;blica. Para implementar de una forma escalable y sin complejas adaptaciones en nuestro departamento de sistemas podemos usar kubernetes&#xA0;on premise o con nuestro PaaS de confianza. Conclusiones Adem&#xE1;s del volumen hay que tener en cuenta el tema de la complejidad. Es decir, para nosotros, la ventaja la ves cuando tienes una plataforma empresarial donde la gente implanta soluciones, etc, y empiezas a identificar temas recurrentes como: Autenticaci&#xF3;n/Autorizaci&#xF3;n, o un servicio de subida de im&#xE1;genes. No tiene sentido que cada aplicaci&#xF3;n que tenga que subir una imagen lo vuelva a implementar. Si implementas un servicio de subida de im&#xE1;genes (que adem&#xE1;s as&#xED; lo tienes optimizado y que si hay cualquier cambio no tiene impacto en cada una de las soluciones que lo consumen) y de paso estandarizas, monitorizas recursos, etc. De estas forma descargas a los proveedores que desarrollan aplicaciones de negocio de servicios cross que implican integrarse en tu infraestructura, etc, etc. Partiendo de escenarios reales, esto lo acabas viendo en plan &#xAB;arquitectura emergente&#xBB;.. a partir de cada soluci&#xF3;n puedes ver la funcionalidad que es candidata a ser Cross. Pero.. si por contra quieres hacer Cross toda una soluci&#xF3;n de negocio.. por un lado puede que en s&#xED; mismo no tenga sentido (voy a poner la funci&#xF3;n de planificar una reuni&#xF3;n as a service para toda la compa&#xF1;&#xED;a?) lo que implica puede no ser viable por costes, tiempo y complejidad de implantaci&#xF3;n ya que: Por lo pronto tienes que refactorizar el c&#xF3;digo para aislarlo por dominios, subdominios, etc Al atomizar los componentes tienes m&#xE1;s complejidad de operaci&#xF3;n y de trazabilidad.. a nivel de testing se complican las pruebas de integraci&#xF3;n, etc. Tienes que incorporar un message queue o ESB, etc, con lo que es m&#xE1;s infraestructura que gestionar. Las alternativas cloud han simplificado un poco esto, pero crea otros problemas en operaci&#xF3;n / TIC. Pero volviendo al refactor de c&#xF3;digo, tienes que saber manejar: Patrones como Strangler para aislar dominios. Log Aggregators para centralizar los logs Patrones como SAGA para orquestar el acceso a base de datos para garantizar la transaccionalidad ya que ahora cada microservice tiene su propio repositorio y no puedes hacer cosas tan b&#xE1;sicas como un &#xAB;drop cascade&#xBB; Un Service Registry para que cada servicio se registre y que los servicios clientes no tengan que guardar urls que pueden romperse, verificar que los servicios est&#xE1;n activos etc. Si todo esto no lo tienes muy claro o la gente que lo implementa no tiene experiencia esto se acaba estancando y eternizando. Si adem&#xE1;s se plantea como un proyecto SCRUM de &#xAB;vamos haciendo y mockeando que a alg&#xFA;n sitio llegaremos&#xBB; sin una definici&#xF3;n de la arquitectura.. pues.. acabas teniendo una chapuza luego inmantenible y sobre todo que genera muchos m&#xE1;s problemas que una aplicaci&#xF3;n cl&#xE1;sica, cada problema es m&#xE1;s dif&#xED;cil de diagnosticar, etc.. Como suele pasar, cuando no hay planificaci&#xF3;n y te consumes el presupuesto.. los tests se abandonan.. con lo que despu&#xE9;s de todo el sufrimiento tienes una fant&#xE1;stica aplicaci&#xF3;n Legacy en producci&#xF3;n de nuevo cu&#xF1;o. En general, en la vida real el problema es la falta de la figura del arquitecto.. tanto los &#xAB;responsables&#xBB; como los chavales quieren probar cosas nuevas &#xAB;porque est&#xE1;n de moda&#xBB;.. pero.. luego.. &#xBF;qui&#xE9;n paga la fiesta? Bibliograf&#xED;a: https://martinfowler.com/articles/break-monolith-into-microservices.html &nbsp; &nbsp; &nbsp;</description></oembed>
