Hola a todos!
Recientemente, en una conferencia de PGConf en Mosc煤, uno de los oradores demostr贸 una arquitectura de "microservicio", mencionando de paso que todos los microservicios heredan de una clase base com煤n. Aunque no hubo explicaciones para la implementaci贸n, parec铆a que en esta compa帽铆a el t茅rmino "microservicios" no se entend铆a de la misma manera que los cl谩sicos parec铆an ense帽arnos. Hoy trataremos uno de los problemas interesantes: cu谩l puede ser el c贸digo com煤n en los microservicios y si puede serlo.
驴Qu茅 es un microservicio? Esta es una aplicaci贸n independiente. No es un m贸dulo, no es un proceso, no es algo que simplemente se implementa por separado, sino una aplicaci贸n independiente, real y completa. Tiene su propia funci贸n principal, su propio repositorio en el git, sus propias pruebas, su propia API, su propio servidor web, su propio archivo README, su propia base de datos, su propia versi贸n, sus propios desarrolladores.
Al igual que los contenedores, los microservicios comenzaron a usarse cuando la potencia inform谩tica de HW y la confiabilidad de las redes alcanzaron un nivel tal que puede permitirse una llamada de funci贸n que dura 100 veces m谩s que antes, puede permitirse el consumo de memoria 100 veces m谩s alto, puede permitirse el lujo para establecer a cada "abuela" no solo en un "departamento" separado, sino en una "casa" separada. Al igual que cualquier soluci贸n arquitect贸nica, la arquitectura de microservicios una vez m谩s sacrifica el rendimiento, ganando en la mantenibilidad del c贸digo para los desarrolladores. Pero dado que la persona y la velocidad de su reacci贸n permanecieron iguales, los sistemas contin煤an satisfaciendo los requisitos.
驴Por qu茅 dividirse en aplicaciones separadas? Porque distribuimos parte de la complejidad del sistema ya a nivel de arquitectura del sistema. El proceso de programaci贸n generalmente habla de un "corte" gradual de la gran "pieza de complejidad" inicial, y la descomposici贸n (en clases, m贸dulos, funciones y, en nuestro caso, aplicaciones completas) es la implementaci贸n de parte de esta complejidad en forma de estructura. Cuando dividimos el sistema en microservicios, tomamos una decisi贸n arquitect贸nica (exitosa o no), que los desarrolladores ya no necesitan tomar en el futuro al implementar partes espec铆ficas de la funcionalidad. Se sabe que este microservicio en particular es responsable del env铆o de correos electr贸nicos, y este, para autorizaci贸n, ya se ha establecido, por lo que todas mis nuevas funciones "caen" en este patr贸n sin discusi贸n.
Un aspecto clave de los microservicios es la mala conectividad. Los microservicios deben ser independientes de la palabra "completamente". No tienen estructuras de datos comunes, y cada microservicio puede / debe tener su propia arquitectura, tecnolog铆a, m茅todo de ensamblaje (y as铆 sucesivamente). Por definici贸n Porque es una aplicaci贸n independiente. Los cambios en el c贸digo de un microservicio no deber铆an afectar a los dem谩s de ninguna manera, a menos que la API se vea afectada. Si tengo N microservicios escritos en Java, entonces no deber铆a haber ning煤n factor limitante para no escribir el microservicio N + 1st en Python, si esto es repentinamente rentable por alguna raz贸n. Est谩n poco acoplados y, por lo tanto, un desarrollador que comienza a trabajar con un microservicio espec铆fico:
a) Supervisa de manera muy sensible su API, porque es el 煤nico componente visible desde el exterior;
b) Se siente completamente libre en la refactorizaci贸n;
c) Comprender el prop贸sito del microservicio (aqu铆 recordamos acerca de SRP) e implementa una nueva funci贸n en consecuencia;
d) Selecciona el m茅todo de persistencia m谩s adecuado;
etc.
Todo esto es bueno y suena l贸gico y armonioso, como muchas ideolog铆as y teor铆as (y aqu铆 el te贸rico ideol贸gico pone fin y se va a cenar), pero estamos practicando. El c贸digo no tiene que estar escrito en
martinfowler.com . Y tarde o temprano nos enfrentamos al hecho de que todos los microservicios:
- informaci贸n de registro;
- contener autorizaci贸n;
- Acceda a los corredores de mensajes
- devolver los mensajes de error correctos;
- debe comprender de alguna manera las entidades generales del sistema, si las hay;
- debe funcionar con un formato de mensaje com煤n (y protocolo);
y hazlo de manera id茅ntica.
Y en alg煤n momento, el arquitecto ideol贸gico viene a trabajar por la ma帽ana y descubre que por la noche apareci贸 una "biblioteca" en el sistema, un nuevo repositorio con un c贸digo com煤n que se utiliza en muchos microservicios. 驴Deber铆a un arquitecto estar horrorizado?
Depende
Para evaluar correctamente la situaci贸n, debemos volver a la idea principal: los microservicios son una colecci贸n de aplicaciones independientes que interact煤an entre s铆 a trav茅s de una API (de red). En esto vemos la principal ventaja y simplicidad de la arquitectura. Y no queremos perder esta ventaja bajo ninguna circunstancia. 驴El c贸digo general que se coloc贸 en la "biblioteca" interfiere con esto? Veamos algunos ejemplos.
1. La clase de usuario (o alguna otra entidad comercial) vive en la biblioteca.
- es decir una entidad comercial no est谩 encapsulada en un microservicio, sino que se distribuye de manera diferente (de lo contrario, 驴por qu茅 ponerla en una biblioteca de c贸digo compartido?);
- es decir los microservicios se conectan a trav茅s de esta entidad comercial; cambiar la l贸gica de trabajar con una entidad afectar谩 a varios microservicios;
- es malo, muy malo, no son microservicios en absoluto, aunque no es "una gran bola de lodo", pero muy r谩pidamente la visi贸n del mundo del equipo dar谩 lugar a una "gran bola de lodo distribuido";
- pero los microservicios en el sistema funcionan con los mismos conceptos, y los conceptos son a menudo entidades, o simplemente estructuras con campos, 驴qu茅 debo hacer? lea DDD, se trata exactamente de c贸mo encapsular entidades dentro de microservicios para que no "vuelen" a trav茅s de la API.
Desafortunadamente, cualquier l贸gica de negocios colocada en una biblioteca compartida tendr谩 tal efecto. Las bibliotecas de c贸digos generales tienden a crecer, lo que da como resultado que el medio del sistema forme un "tumor" l贸gico que no pertenece a ning煤n microservicio en particular, y la arquitectura se bloquea. El "centro de gravedad l贸gica" del sistema comienza a moverse a un repositorio con un c贸digo com煤n, y obtenemos una mezcla infernal de monolitos y microservicios, y no necesitamos ir all铆 en absoluto.
2. El c贸digo de an谩lisis para el formato del mensaje se coloca en la biblioteca.
- El c贸digo es m谩s probable en Java si todos los microservicios est谩n escritos en Java;
- Si ma帽ana escribo un servicio en Python, no podr茅 usar el analizador, pero parece que no es un problema en absoluto, escribir茅 una versi贸n de Python;
- Punto clave: si estoy escribiendo un nuevo microservicio en Java, 驴debo usar este analizador? Si, probablemente no. Quiz谩s no estoy obligado, aunque, como desarrollador de microservicios, puede ser muy 煤til. Bueno, como si encontrara algo 煤til en el repositorio de Maven.
Un analizador de mensajes, o un registrador mejorado, o un cliente envuelto para enviar datos a RabbitMQ, es como ayudantes, componentes auxiliares. Est谩n a la par con las bibliotecas est谩ndar de NuGet, Maven o NPM. El desarrollador de microservicios es siempre el rey; decide si usar la biblioteca est谩ndar, o hacer su propio c贸digo nuevo, o usar el c贸digo de la biblioteca auxiliar compartida. C贸mo ser谩 m谩s conveniente para 茅l, porque escribe una APLICACI脫N SEPARADA E INDEPENDIENTE. 驴Puede un ayudante particular evolucionar? Tal vez probablemente tenga versiones. Deje que el desarrollador consulte una versi贸n espec铆fica en su servicio, nadie lo obliga a actualizar el servicio, al actualizar los ayudantes, esta es una pregunta para qui茅n apoya el servicio.
3. Interfaz Java, clase base abstracta, rasgo.
- O otra pieza de la categor铆a de "c贸digo roto";
- Es decir Estoy aqu铆, independiente e independiente, y una parte de mi h铆gado yace en otro lugar;
- Aqu铆 aparece la coherencia de los microservicios a nivel de c贸digo, por lo que no lo recomendaremos;
- En las etapas iniciales, esto probablemente no traer谩 ning煤n problema tangible, pero la esencia del dise帽o arquitect贸nico es la garant铆a de comodidad (o incomodidad) en los a帽os venideros.
El equipo que comienza a trabajar en un nuevo producto sienta las bases para la arquitectura y tiene la mayor influencia en las tendencias que tendr谩 el producto. Si los principios de SRP, descomposici贸n exitosa, baja conectividad, etc. se incorporan inicialmente en el sistema, entonces tiene la oportunidad de continuar desarroll谩ndose correctamente. De lo contrario, la aceleraci贸n centr铆fuga de los "factores de tiempo" (otro equipo, poco tiempo, parches urgentes, falta de documentaci贸n) arrojar谩 este sistema m谩s al margen m谩s r谩pido de lo que parece.
La cuesti贸n de un c贸digo com煤n en microservicios sigue siendo dif铆cil porque est谩 asociada con alg煤n tipo de compensaci贸n: sopesamos lo que ser谩 m谩s rentable en el futuro: el grado de independencia de los microservicios, menos repeticiones en el c贸digo, las calificaciones de los ingenieros, la simplicidad del sistema, etc. Cada vez se trata de reflexiones y debates, que pueden conducir a diferentes decisiones arquitect贸nicas espec铆ficas. Sin embargo, resumamos algunas de las recomendaciones:
Recomendaci贸n 0: No llame a los microservicios cualquier cosa que se rompa en partes existentes de forma independiente. No todas las tablas con columnas son una matriz, usemos los t茅rminos correctamente.
Recomendaci贸n 1: es altamente deseable que los microservicios no tengan ning煤n c贸digo com煤n.
Recomendaci贸n 2: si todav铆a hay un c贸digo com煤n, que sea una colecci贸n (biblioteca) de "ayudantes" opcionales. El desarrollador del servicio decide si usarlos o escribir su propio c贸digo.
Recomendaci贸n 3: bajo ninguna circunstancia debe haber l贸gica de negocios en el c贸digo com煤n. Toda la l贸gica de negocios est谩 encapsulada en microservicios.
Recomendaci贸n 4: deje que la biblioteca de c贸digo com煤n se dise帽e como un paquete est谩ndar (NuGet, Maven, NPM, etc.), con la opci贸n de versionar (o, mejor a煤n, varios paquetes separados).
Recomendaci贸n 5: El "centro de gravedad l贸gica" del sistema siempre debe permanecer en los microservicios mismos, y no en el c贸digo com煤n.
Recomendaci贸n 6: Si planea escribir en el formato de microservicios, concilie de antemano que el c贸digo entre ellos a veces se duplicar谩. Hasta cierto punto, nuestro "instinto SECO" natural debe ser suprimido.
Gracias por su atenci贸n y microservicios exitosos.