Microservices con muchos repositorys desactualizados

En una architecture de microservices, ¿cuál es la mejor estrategia para mantener actualizados muchos entornos de desarrollador en múltiples repositorys de código fuente?

Supongamos que hay 10 equipos de 10 desarrolladores trabajando en 200 microservices en git. Todo desarrollador debería get regularmente de cada repository. Esto podría hacerse con scripts, pero ¿hay una mejor manera? ¿Estamos haciendo esto mal porque parece una gran sobrecarga?

No aconsejaría que cada desarrollador construya cada microservice. Propondría algún tipo de entorno de continuous integration. Un server de compilation centralizado conectado a todos los repositorys git.

Cada vez que se actualiza un repository, el server de compilation debe detectar el cambio, crear el código, ejecutar testings de unidades (y / o funcionales) y luego enviar el service a algún tipo de entorno de integración. El server de compilation también puede ejecutar algunas testings de integración contra el service implementado.

La mayoría de los desarrolladores deberían poder hacer todo su desarrollo y testing sin necesidad de acceder a los otros microservices. Si un desarrollador está construyendo el service X, que depende de Y & Z y A es dependiente de A y B, entonces el desarrollador, en su mayor parte, solo debe tener el service X. Para los services de testing unitaria, Y & Z debe ser simulado / burlado.

El desafío será evitar que el desarrollador rompa los services A y B al hacer un cambio al service X. Ese tipo de testings de integración tiende a ser más complicado ya que los desarrolladores que trabajan en el service X a menudo desconocen detalles (o incluso cómo usarlos). ) services en sentido ascendente (por ejemplo, A y B).

La forma de abordar eso, creo, sería realizar testings de integración regulares, ya sea desencadenadas por la compilation del service X o ejecutadas regularmente. Con un proyecto así de complicado, una filosofía de testing de unidad fuerte y robusta y un marco de testing de integración serán esenciales.

Esto se networkinguce a lo bueno que es su location / tecnología de detección de service. Todo lo que un service necesita saber es dónde enviar una request X para get una respuesta Y de un service en particular. Si esto está bien implementado. muy bien podría hacer que cada desarrollador ejecute cualquier subset de services en los que esté trabajando directamente y que el rest de los services se ejecute en un entorno común (llamémoslo Remoto)

El control remoto se configurará para ejecutar todos los services en su plataforma y tendrá alguna forma de get el código más reciente (basado en la cadencia o en intervalos regulares). Los entornos locales podrían configurarse para que todos los services que se ejecutan localmente sabrán qué más se está ejecutando localmente y sabrán cómo llegar a los services remotos cuando necesiten información. Para entornos de desarrollador, agregue convenciones donde cada desarrollador ejecute la cantidad mínima de services necesarios para el desarrollo productivo. Esto significa que si no está trabajando con el código de un service, ejecútelo de forma remota para que sepa que está ejecutando el último código y no está desactualizado.

Un par de errores con este enfoque

  1. podría ejecutar el service A localmente y tener el service B funcionando en remoto. lo testing todo localmente y parece funcionar, por lo que decide presionar. Mientras empuja, otro desarrollador también empuja los cambios a B y ahora sus cambios ya no son compatibles.
  2. Si está ejecutando los services A y C localmente y B de forma remota, debería ser bastante sencillo enviar las requestes al service B al entorno remoto. Sin embargo, debe tener cuidado de que si A llama a B y B a llamar a C, entonces la llamada a C necesita enrutarse desde el entorno remoto a su service C local y no a su service Remote C.
  3. Pruebas: puede superar una gran cantidad de problemas relacionados con las testings en un entorno complejo como este con dos sets de testings distintos. 1. Pruebas unitarias: testings que testingn componentes individuales en su service con todas las llamadas a otro service que se burla. 2. testings de integración del entorno: estas testings validan la comunicación entre diferentes services. La Suite 1 verificará el código interno de su service y la Suite 2 se ejecutará después de que envíe sus cambios a control remoto y se asegurará continuamente de que la comunicación entre services sea la esperada.

Espero que ayude