Ratschläge zum Bereitstellen von Kriegsdateien im Vergleich zu ausführbaren JARs mit eingebettetem Container

87

Es scheint einen aktuellen Trend im Java-Bereich zu geben, sich von der Bereitstellung von Java-Webanwendungen in einem Java-Servlet-Container (oder Anwendungsserver) in Form einer War-Datei (oder einer Ear-Datei) zu entfernen und stattdessen die Anwendung als ausführbares JAR mit zu verpacken Ein eingebetteter Servlet / HTTP-Server wie Jetty. Und das meine ich umso mehr, als neuere Frameworks Einfluss darauf haben, wie neue Anwendungen entwickelt und bereitgestellt werden, anstatt wie Anwendungen an Endbenutzer geliefert werden (weil ich zum Beispiel verstehe, warum Jenkins einen eingebetteten Container verwendet, der sehr einfach zu greifen und zu verwenden ist ). Beispiele für Frameworks, die die ausführbare JAR-Option verwenden: Dropwizard , Spring Boot und Play (es wird nicht auf einem Servlet-Container ausgeführt, aber der HTTP-Server ist eingebettet).

Meine Frage ist, aus einer Umgebung, in der wir unsere (bis zu diesem Zeitpunkt hauptsächlich Struts2) Anwendungen auf einem einzelnen Tomcat-Anwendungsserver bereitgestellt haben, welche Änderungen, Best Practices oder Überlegungen erforderlich sind, wenn wir einen Embedded-Container-Ansatz verwenden möchten ? Derzeit haben wir ungefähr 10 selbst entwickelte Anwendungen, die auf einem einzelnen Tomcat-Server ausgeführt werden. Für diese kleinen Anwendungen ist die Möglichkeit, Ressourcen gemeinsam zu nutzen und auf einem Server verwaltet zu werden, hilfreich. Unsere Anwendungen sollen nicht an Endbenutzer verteilt werden, um sie in ihrer Umgebung auszuführen. Sollte sich dieser Ansatz jedoch ändern, wenn wir uns für die Nutzung eines neueren Java-Frameworks entscheiden? Wird die Umstellung auf ausführbare Jars durch die zunehmende Verwendung von Cloud-Bereitstellungen (z. B. Heroku) vorangetrieben?

Wenn Sie Erfahrung mit der Verwaltung mehrerer Anwendungen im Play-Stil der Bereitstellung im Vergleich zur herkömmlichen Bereitstellung von Kriegsdateien auf einem einzelnen Anwendungsserver haben, teilen Sie uns bitte Ihre Erkenntnisse mit.

Brice Roncace
quelle

Antworten:

79

Eine interessante Frage. Dies ist nur meine Ansicht zum Thema, also nimm alles mit einem Körnchen Salz. Ich habe gelegentlich Anwendungen sowohl mit Servlet-Containern als auch mit eingebetteten Servern bereitgestellt und verwaltet. Ich bin mir sicher, dass es immer noch viele gute Gründe gibt, Servlet-Container zu verwenden, aber ich werde versuchen, mich nur darauf zu konzentrieren, warum sie heute weniger beliebt sind.

Kurzversion: Servlet-Container eignen sich hervorragend zum Verwalten mehrerer Anwendungen auf einem einzelnen Host, scheinen jedoch nicht sehr nützlich zu sein, um nur eine einzige Anwendung zu verwalten. In Cloud-Umgebungen scheint eine einzelne Anwendung pro virtueller Maschine vorzuziehen und häufiger zu sein. Moderne Frameworks wollen Cloud-kompatibel sein, daher die Umstellung auf eingebettete Server.


Daher denke ich, dass Cloud-Dienste der Hauptgrund für den Verzicht auf Servlet-Container sind. Genau wie mit Servlet-Containern können Sie Anwendungen verwalten, mit Cloud-Diensten können Sie virtuelle Maschinen, Instanzen, Datenspeicher und vieles mehr verwalten. Das klingt komplizierter, aber in Cloud-Umgebungen wurde auf einzelne App-Computer umgestellt. Dies bedeutet, dass Sie häufig die gesamte Maschine so behandeln können, als wäre es die Anwendung. Jede Anwendung wird auf einem Computer mit der entsprechenden Größe ausgeführt. Cloud-Instanzen können jederzeit angezeigt werden und verschwinden, was sich hervorragend für die Skalierung eignet. Wenn eine Anwendung mehr Ressourcen benötigt, erstellen Sie mehr Instanzen.

Dedizierte Server hingegen sind normalerweise leistungsstark, haben jedoch eine feste Größe, sodass Sie mehrere Anwendungen auf einem einzigen Computer ausführen, um die Ressourcennutzung zu maximieren. Das Verwalten von Dutzenden von Anwendungen - jede mit ihren eigenen Konfigurationen, Webservern, Routen und Verbindungen usw. - macht keinen Spaß. Die Verwendung eines Servlet-Containers hilft Ihnen also, alles überschaubar und gesund zu halten. Es ist jedoch schwieriger zu skalieren. Servlet-Container in der Cloud scheinen nicht sehr nützlich zu sein. Sie müssten für jede winzige Instanz eingerichtet werden, ohne viel Wert zu bieten, da sie nur eine einzige Anwendung verwalten.

Außerdem sind Wolken cool und Nicht-Wolken-Sachen sind langweilig (wenn wir immer noch an den Hype glauben). Viele Frameworks versuchen standardmäßig skalierbar zu sein, damit sie problemlos in den Clouds bereitgestellt werden können. Eingebettete Server lassen sich schnell bereitstellen und ausführen, sodass sie als vernünftige Lösung erscheinen. Servlet-Container werden normalerweise noch unterstützt, erfordern jedoch eine kompliziertere Einrichtung.

Einige andere Punkte:

  • Der eingebettete Server könnte für das Framework optimiert werden oder ist besser in das Framework-Tool integriert (wie zum Beispiel die Play Console).
  • Nicht alle Cloud-Umgebungen verfügen über anpassbare Maschinenabbilder. Anstatt Initialisierungsskripte zum Herunterladen und Einrichten von Servlet-Containern zu schreiben, ist die Verwendung dedizierter Software für die Bereitstellung von Cloud-Anwendungen viel einfacher.
  • Ich habe noch kein Tomcat-Setup gefunden, das Sie nicht alle paar Neubereitstellungen Ihrer App mit einem Fehler im Perm-Speicherplatz begrüßt. Das (Neu-) Starten eingebetteter Server dauert etwas länger, wenn Sie fast sofort ohne Ausfallzeiten zwischen Staging- und Produktionsinstanzen wechseln können.
  • Wie bereits in der Frage erwähnt, ist es für den Endbenutzer sehr praktisch, die Anwendung einfach auszuführen.
  • Eingebettete Server sind portabel und praktisch für die Entwicklung. Heute ist alles schnell , Prototypen und MVPs müssen so schnell wie möglich erstellt und geliefert werden. Niemand möchte zu viel Zeit damit verbringen, für jeden Entwickler eine Umgebung einzurichten.
Kapex
quelle
1
Vielen Dank für Ihre Antwort, Sie machen einige gute Punkte. Die Wolke ist der treibende Faktor! In unserer Situation würde ich mich wohler fühlen, wenn ich einen Cloud-Server nach dem Amazon Web Services-Modell (Infrastructure as a Service) besitze, als nur die Anwendung nach Google App Engine (Platform as a Service) bereitzustellen, aber ich nehme an, dass dies der Fall ist die alte Schule des Denkens. Zum Mitnehmen: Wenn wir nicht vorhaben, die Cloud auf einer Plattform als Service-Methode zu nutzen, sind Kriegsbereitstellungen der richtige Weg, anstatt mehrere eigenständige Java-Webanwendungen auf einem einzigen Server zu verwalten. Nochmals vielen Dank für Ihre Eingabe.
Brice Roncace
3
Nur 2cc: Sie können mehrere JAR-Apps auf einem Computer mit einem leichten HTTP-Server als Proxy ausführen , dh: nginx, es kann zusätzlich für typischen Webverkehr wie benutzerdefiniertes CDN, Load Balancer, Firewall usw. verwendet werden Verwenden Sie es, wenn Sie großen Datenverkehr planen (es hat eine bessere Leistung und verarbeitet dann jede einzelne Anforderung - auch für statische Ressourcen über Ihre Haupt-App).
Biesior