Hey, ich bin neu in Grails, und ich frage mich über die Bereitstellung. Sobald ein WAR in die Produktion implementiert wurde, wie kann ich die Anwendung ohne Ausfallzeiten aktualisieren?Ist es möglich, eine neue WAR-Anwendung zu implementieren, ohne die Anwendung zu stoppen?
Antwort
Auch wenn Sie die WAR-Datei in den Bereitstellungsmodus versetzen (indem Sie den Server nicht neu starten), wird beim Laden des Kontexts dennoch eine gewisse Downtime auftreten. Das ist keine Grails-Sache als solche, eher eine J2EE/Servlet-Sache.
Wie Dogbert sagte, am besten, eine Wartungsseite (mit Apache vor Tomcat ist eine gute Idee) und Herunterfahren der App-Server, laden Sie die neue WAR und starten Sie den Server wieder hoch.
Alles was ich weiß ist, dass Sie eine groovy-Datei oder eine .gsp-Datei ändern können und nachdem Sie die Änderungen im Browser verfügbar sind, aber wenn es andere Dateitypen gibt, bin ich mir dieser Funktion nicht sicher.
Sobald Ihre App als WAR verpackt ist, werden Änderungen an den Quelldateien nicht automatisch wie bei der Verwendung von run-app weitergegeben. Im Allgemeinen denke ich, dass insbesondere für kompilierten Code mit Code, der ständig aktiv ist, es ein bisschen riskant ist, Live-Updates durchzuführen. Sie können während der Entwicklung mit dem gelegentlichen Implementierungsfehler fertig werden, aber in der Produktion würde ich lieber auf Nummer sicher gehen und mit ein wenig Ausfallzeit leben.
Sie können zwei Tomcat-Instanzen mit einem Apache mod_proxy_balancer
davor einrichten, wie beschrieben here. Für eine Umschichtung der Anwendung einer "rollendes Upgrade" Strategie könnte angewandt werden (unter der Annahme app1 und app2 sind Ihre zwei Kater-Instanzen):
- Disable Kater @ app1 in Apache-Balancer-Manager
- Anwendung erneut bereitstellen zu tomcat @ app1
- Sie einige Tests mit app1 und sehen, ob alles funktioniert
- aktivieren tomcat @ app1 Balancer-Manager
- Disable tomcat @ app2 Balancer-Manager
- Anwendung erneut bereitstellen zu tomcat @ app2
- aktivieren tomcat @ app2 Balancer-Manager
Und du bist fertig. Sie brauchen dafür nicht mehrere physische oder virtuelle Maschinen - es ist auch auf einer einzigen Box möglich. Wenn Ihr Anwendungsupgrade Datenbankänderungen impliziert, seien Sie vorsichtig. Das obige könnte z.B. in einem gant script, so ein einfaches "Grails Cluster-redeploy" tut alles, was Sie brauchen. Solch ein Skript ist momentan auf meiner Liste, aber ich habe keine Ahnung, wann das fertig sein wird.
Wenn Sie Tomcat verwenden, ist es möglich, mit dem, was Parallel Deployment genannt:
http://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Parallel_deployment
einfach nennen Sie die WAR-Dateien mit der Versionsnummer wie im doc beschrieben:
- foo ## 42.war
- foo ## 43.war
- 1. NSURLConnection sendSynchronousRequest - ist es möglich, ohne Leck zu implementieren
- 2. Ist es möglich, Backbone "Lesen" Anfragen zu stoppen
- 3. Ist es möglich, die Ausführung in Javascript/Jquery zu stoppen?
- 4. Ist es möglich, die .NET-Garbage Collection zu stoppen?
- 5. Ist es möglich, eine Klasse zu deklarieren, ohne sie zu implementieren? (C++)
- 6. Ist es möglich, eine selbstaktualisierende ASP.NET-Webanwendung zu implementieren?
- 7. Ist es möglich, die Ausführung von R-Code innerhalb von glänzend zu stoppen (ohne den glänzenden Prozess zu stoppen)?
- 8. Ist es möglich, die Speichernutzung in einer C# -Anwendung zu verfolgen, ohne einen Profiler zu verwenden?
- 9. Ist es möglich, Webpack HMR für Polymer-Komponenten zu implementieren?
- 10. Node.js console.log - Ist es möglich, eine Zeile zu aktualisieren, anstatt eine neue Zeile zu erstellen?
- 11. Ist es möglich, eine Click-to-Run-Anwendung zu automatisieren?
- 12. Ist es möglich, die Weiterleitung zu einer anderen Link-Seite zu stoppen?
- 13. Ist es möglich, eine minimierte Anwendung zu screenshot
- 14. Ist es möglich, die gesamte .NET-Anwendung zu dekompilieren?
- 15. Ist es möglich, Code in eine Android-Anwendung zu injizieren?
- 16. Ist es möglich, eine virtuelle Azure-ARM-Maschine über eine Azure-Funktion zu stoppen/zu starten?
- 17. Ist es möglich, Q_PROPERTY READ/WRITE Accessoren zu implementieren, ohne Memberfunktionen zu verwenden?
- 18. Ist es möglich, Server Push mit Apache Camel zu implementieren?
- 19. Ist es möglich, jQuery UI * Ohne * die Farben zu verwenden?
- 20. Ist es möglich, eine Equinox + Eclipse-Anwendung ohne den GUI-Teil zu erstellen?
- 21. Ist es möglich, die Ansichtsfensterbreite (vw) ohne Bildlaufleiste zu berechnen?
- 22. Ist es möglich, GStreamer ohne eine GLib Hauptschleife zu verwenden?
- 23. Ist es möglich, ein dynamisch eingefügtes Skript-Tag zu stoppen?
- 24. Es ist möglich, von Simcard zu unserer Anwendung zu transaktionen?
- 25. Ist es möglich, dotfuscator über die Befehlszeile auszuführen, ohne die GUI-Anwendung zu öffnen.
- 26. Ist es möglich reCAPTCHA ohne iframe und Javascript zu verwenden?
- 27. Ist es möglich, ein Pharo-Image ohne .changes- und .sources-Dateien zu implementieren?
- 28. Ist es möglich, die neue Push Notifications-Unterstützung in Chrome ohne GCM zu verwenden?
- 29. Ist es möglich, friends.getMutualFriends mit FQL zu implementieren?
- 30. Ist es möglich, eine PowerShell-Pipeline innerhalb eines Filters zu beenden oder zu stoppen?
Ja, thi Es scheint definitiv der richtige Weg zu sein. Vielen Dank. – Thody