
Hinweis perev. - Mit diesem Artikel beginnen wir eine Reihe von Übersetzungen zum Thema Zero Downtime Deployment. In den folgenden Veröffentlichungen wird die Bereitstellung neuer Versionen der Anwendung mit der Datenbank und die Bereitstellung in Kubernetes erläutert.
Trotz der Tatsache, dass die unten beschriebene technische Lösung umstritten ist, besteht der Zweck dieses Artikels darin, den Leser direkt mit dem Blue-Green-Bereitstellungsansatz vertraut zu machen, der übrigens nicht nur für Spring-Anwendungen gilt.
Ziel der blau-grünen Bereitstellung ist es, Ausfallzeiten während der Bereitstellung einer neuen Version der Anwendung zu vermeiden.
Ausfallzeiten sind mit der Nichtverfügbarkeit von Servern verbunden, wenn eine neue Version einer Anwendung installiert wird, um die alte zu ersetzen. Die Idee der Blue / Green-Bereitstellung besteht darin, die neue Version der Anwendung an einem separaten Ort bereitzustellen, an dem Sie Tests durchführen können, bis die endgültige Entscheidung getroffen wird, als Hauptversion darauf umzusteigen.

In diesem Artikel wird erläutert, wie Sie die blau-grüne Bereitstellung von Spring-Boot-Anwendungen konfigurieren. Wir werden Nginx als Hauptwebserver verwenden, um eingehende Anforderungen an unsere Anwendungen umzuleiten.
Server-Setup
In diesem Handbuch wird davon ausgegangen, dass Sie über einen Server und eine laufende Spring-Startanwendung verfügen, die auf diesem Server bereitgestellt werden können.
Wechseln Sie auf dem Server in Ihr Ausgangsverzeichnis und erstellen Sie zwei Ordner: blue
und green
. Dann brauchen wir zwei symbolische Links, die available
und testing
. Diese Links verweisen entweder auf einen blauen oder einen grünen Ordner. Wenn beispielsweise available
Punkte auf green
, werden testing
auf blue
.
mkdir blue mkdir green ln -s ./green ./available ln -s ./blue ./testing
Jeder Ordner enthält eine eigene Spring-Anwendung und Nginx-Konfiguration. Irgendwann während der Bereitstellung funktionieren beide Anwendungen gleichzeitig (obwohl an verschiedenen Ports). Um von der blauen Anwendung zur grünen zu wechseln, müssen Sie nur die Nginx-Konfiguration in grün oder blau ändern .

Nginx-Konfigurationen
Angenommen, wir haben eine Domain von springsite.com. Die grüne Konfiguration von Nginx leitet alle Anrufe an springsite.com/api/ an die green
Anwendung an Port 8080 und alle Anrufe an springsite.com/api-test/ an die blue
Anwendung an Port 8090 weiter.
Lassen Sie uns diese Konfigurationsdateien erstellen. Öffnen Sie Ihren Lieblingseditor und fügen Sie den folgenden Inhalt hinzu.
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/*; }
Die Dateistruktur sollte ungefähr so aussehen:
--root |--- blue |--- nginx.conf.blue |--- app-V2.jar |--- green |--- nginx.conf.green |--- app-V1.jar |--- available -> ./green |--- testing -> ./blue
Angenommen, wir möchten eine neue Version in einem blue
Container bereitstellen. Wir können es testen, solange die vorherige Version noch verfügbar ist . Sobald alle mit der neuen Version zufrieden sind, müssen wir nur noch die Links ändern!
Erstellen Sie die Datei swap.sh
in dem Ordner, der sowohl den blue
als auch den green
Ordner enthält:
touch swap.sh chmod +x swap.sh
Fügen Sie der Datei swap.sh
den folgenden Inhalt 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
Zu diesem Zeitpunkt können wir 2 Spring-Anwendungen auf den Ports 8090 und 8080 ./swap.sh
und sie durch Ausführen von sudo ./swap.sh
.
Bereitstellen
Dank symbolischer Links wissen wir, dass die Hauptanwendung immer durch available
und die zu testing
durch test angezeigt wird. Daher sollten wir immer eine neue Version der Anwendung im Testordner über einen symbolischen Link bereitstellen. Es wird davon ausgegangen, dass wir die Anwendung gerade gepackt haben und sie jetzt mit scp
herunterladen können.
scp -r -i ~/.ssh/MyKeyPair.pem <package name.jar> <user>@<ip>:spring/testing
Mach weiter
Durch das Einrichten einer blau-grünen Bereitstellung auf Ihrem Server werden Ausfallzeiten erheblich reduziert . In diesem Handbuch wird erläutert, wie Sie neue Versionen Ihrer Anwendung bereitstellen, die sich auf demselben physischen Server befinden. Es kann an Situationen mit mehreren physischen Servern und einem Load Balancer angepasst werden. Dies erfordert jedoch doppelt so viele Produktionsumgebungen wie erforderlich. Für eine sehr große Infrastruktur ist dies entweder unmöglich oder extrem teuer.
Dies führt zu der Frage: Wie schaffen es große Unternehmen, neue Versionen ihrer Anwendungen ohne Ausfallzeiten freizugeben? Denken Sie an Google oder Facebook, die immer verfügbar sind!
Die Verwendung der blau-grünen Bereitstellung ist aufgrund der großen Anzahl der erforderlichen Server unrealistisch. Anwendungsaktualisierungen werden schrittweise durchgeführt: Die Server werden nacheinander außer Betrieb genommen und nach der Aktualisierung zurückgegeben. Darüber hinaus werden nach und nach neue Versionen veröffentlicht: Am Anfang wird nur ein kleiner Teil der Server mit der neuen Version arbeiten. Wenn dann keine Probleme oder Fehler gefunden wurden, beginnen immer mehr Server mit dem neuen Code. Zu diesem Zeitpunkt werden wichtige Leistungsmetriken wie CPU-, Speicher- und Abfrageleistung ausgewertet. Wenn alles gut gegangen ist, ist die Version abgeschlossen und eine neue Version der Anwendung wird auf jedem Server auf der ganzen Welt gestartet.
Fazit
Ich hoffe, Sie verstehen jetzt, wie Sie das Ausfallzeitproblem dank der blau-grünen Bereitstellung lösen können. Jetzt können Sie die grundlegende Blau-Grün-Bereitstellung Ihrer Spring-Anwendung mit NGINX konfigurieren.
Wie Sie vielleicht bemerkt haben, funktionieren bei Verwendung dieser Lösung die alte und die aktuelle Version Ihrer Anwendungen gleichzeitig und beide sind mit der Datenbank verbunden. Dies kann zu unerwarteten Problemen beim Ändern der Datenbankstruktur führen. Dieser großartige Artikel https://spring.io/blog/2016/05/31/zero-downtime-deployment-with-a-database beschreibt den Umgang mit solchen Situationen.
Und schließlich könnte Sie die Tatsache interessieren, dass sowohl AWS als auch Google Cloud Compute sofort einsatzbereite Blue-Green-Bereitstellungsdienste anbieten:
https://aws.amazon.com/quickstart/architecture/blue-green-deployment/
https://cloud.google.com/solutions/continuous-delivery/
Lesen Sie auch andere Artikel in unserem Blog: