
Nota perev. - Con este artículo, comenzamos una serie de traducciones dedicadas al tema de la implementación de tiempo de inactividad cero. Las siguientes publicaciones destacarán la implementación de nuevas versiones de la aplicación con la base de datos y la implementación en Kubernetes.
A pesar de que la solución técnica que se describe a continuación es controvertida, el propósito de este artículo es familiarizar al lector directamente con el enfoque de implementación Blue-Green, que, por cierto, es aplicable no solo a las aplicaciones Spring.
El objetivo de la implementación Blue-Green es eliminar el tiempo de inactividad durante la implementación de una nueva versión de la aplicación.
El tiempo de inactividad está relacionado con la falta de disponibilidad del servidor cuando se instala una nueva versión de una aplicación para reemplazar la anterior. La idea de la implementación Azul / Verde es implementar la nueva versión de la aplicación en un lugar separado donde pueda realizar las pruebas, hasta que se tome la decisión final de cambiar a la principal.

En este artículo, veremos cómo configurar la implementación Azul-Verde de las aplicaciones de arranque Spring. Utilizaremos Nginx como el servidor web principal para redirigir las solicitudes entrantes a nuestras aplicaciones.
Configuración del servidor
Esta guía asume que tiene un servidor y una aplicación de arranque Spring que se puede implementar en él.
En el servidor, vaya a su directorio de inicio y cree dos carpetas: blue
y green
. Entonces necesitamos dos enlaces simbólicos available
y de testing
. Estos enlaces apuntarán a una carpeta azul o verde. Por ejemplo, si available
puntos available
green
, testing
puntos de testing
blue
.
mkdir blue mkdir green ln -s ./green ./available ln -s ./blue ./testing
Cada carpeta contendrá su propia aplicación Spring y configuración Nginx. En algún momento durante la implementación, ambas aplicaciones funcionarán simultáneamente (aunque en puertos diferentes), y para cambiar de la aplicación azul a la verde, solo necesitamos cambiar la configuración de Nginx a verde o azul.

Configuraciones de Nginx
Digamos que tenemos un dominio springsite.com. La configuración verde de Nginx redirigirá todas las llamadas a springsite.com/api/ a la aplicación green
en el puerto 8080, y todas las llamadas a springsite.com/api-test/ a la aplicación blue
en el puerto 8090.
Vamos a crear estos archivos de configuración. Abra su editor favorito y agregue el siguiente contenido.
http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name mysite.com; location /api { proxy_pass http://localhost:8090/api; } location /api-test { proxy_pass http://localhost:8080/api; } } include servers/*; }
http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name mysite.com; location /api { proxy_pass http://localhost:8080/api; } location /api-test { proxy_pass http://localhost:8090/api; } } include servers/*; }
La estructura del archivo debería verse así:
--root |--- blue |--- nginx.conf.blue |--- app-V2.jar |--- green |--- nginx.conf.green |--- app-V1.jar |--- available -> ./green |--- testing -> ./blue
Supongamos que queremos implementar una nueva versión en un contenedor blue
. Podemos probarlo mientras la versión anterior todavía está disponible . Una vez que todos estén contentos con la nueva versión, ¡solo necesitaremos cambiar los enlaces!
Cree el archivo swap.sh
en la carpeta que contiene las carpetas blue
y green
:
touch swap.sh chmod +x swap.sh
Agregue el siguiente contenido al archivo swap.sh
:
#!/bin/bash testing_now=$(ls -l ./ | grep testing) if [[ "$testing_now" == *blue ]] then testing="blue" active="green" else testing="green" active="blue" fi #remove current links rm ./available rm ./testing rm -f /etc/nginx/nginx.conf #create new links with the active/inactive reversed ln -s ./$inactive ./available ln -s ./$active ./testing ln -s /home/ubuntu/spring/$active/nginx.conf /etc/nginx/nginx.conf #reload the http server service nginx reload echo swap completed $active is now available
En este punto, podemos ejecutar 2 aplicaciones Spring en los puertos 8090 y 8080 y cambiarlas ejecutando sudo ./swap.sh
.
Implementar
Gracias a los enlaces simbólicos, sabemos que la aplicación principal siempre está indicada por available
, y la aplicación de prueba por testing
. Por lo tanto, siempre debemos implementar una nueva versión de la aplicación en la carpeta de testing
usando un enlace simbólico. Se supone que acabamos de empaquetar la aplicación, y ahora podemos descargarla usando scp
.
scp -r -i ~/.ssh/MyKeyPair.pem <package name.jar> <user>@<ip>:spring/testing
Seguir adelante
Configurar una implementación Azul-Verde en su servidor reducirá significativamente el tiempo de inactividad . Esta guía explica cómo implementar nuevas versiones de su aplicación que residen en el mismo servidor físico. Se puede adaptar a situaciones con múltiples servidores físicos y un equilibrador de carga. Sin embargo, esto requerirá tener el doble de entornos de producción que sea necesario. Para una infraestructura muy grande, esto es imposible o extremadamente costoso.
Esto lleva a la pregunta: ¿Cómo logran las grandes compañías lanzar nuevas versiones de sus aplicaciones sin tiempo de inactividad? ¡Piense en Google o Facebook que siempre están disponibles!
El uso de la implementación Azul-Verde aquí no es realista debido a la gran cantidad de servidores necesarios. Las actualizaciones de la aplicación se llevan a cabo gradualmente: los servidores se sacan del servicio uno por uno y se devuelven después de la actualización. Además, las nuevas versiones también se lanzan gradualmente: al principio, solo una pequeña parte de los servidores funcionará con la nueva versión. Luego, si no se encontraron problemas o errores, cada vez más servidores comenzarán con el nuevo código. En este punto, se evalúan las métricas de rendimiento importantes, como el rendimiento de la CPU, la memoria y la consulta. Si todo salió bien, el lanzamiento está completo y se lanzará una nueva versión de la aplicación en todos los servidores del mundo.
Conclusión
Espero que ahora comprenda cómo resolver el problema del tiempo de inactividad gracias a la implementación Blue-Green. Ahora puede configurar la implementación básica Blue-Green de su aplicación Spring con NGINX.
Como habrá notado, cuando usamos esta solución, las versiones anterior y actual de sus aplicaciones funcionan simultáneamente y ambas están conectadas a la base de datos. Esto puede provocar problemas inesperados al cambiar la estructura de la base de datos. Este gran artículo https://spring.io/blog/2016/05/31/zero-downtime-deployment-with-a-database describe cómo lidiar con tales situaciones.
Y, por último, puede interesarle el hecho de que tanto AWS como Google Cloud Compute ofrecen servicios de implementación Blue-Green listos para usar:
https://aws.amazon.com/quickstart/architecture/blue-green-deployment/
https://cloud.google.com/solutions/continuous-delivery/
Lea también otros artículos en nuestro blog: