2 Stimmen

Wie man eine modulare Unternehmensanwendung nur mit GWT entwickelt

Hallo Ich möchte eine große Unternehmensanwendung entwerfen und entwickeln, die nur GWT auf der Client-Seite. Ich möchte diese Unternehmensanwendung in Teile aufteilen und jedes von ihnen ein Modul (oder Bündel oder Portlet oder was auch immer!). Diese Module könnten in Beziehung zueinander stehen und einige Dienste aufrufen, die die in anderen Modulen existieren (sowohl auf der Client- als auch auf der Serverseite).

Das Problem ist, diese Module müssen Entworfen , Entwickelt , Kompiliert y Selbstständig im Einsatz y Dynamisch und sie werden platziert und in einem gemeinsamen Kontext auf dem Client angezeigt und die Abhängigkeiten zwischen den Modulen sollten überschaubar sein (sowohl auf der Client- als auch auf der Serverseite).

Was kann ich tun? Welche Technologien kann ich verwenden, um eine Unternehmensanwendung wie diese zu erstellen?

Wenn Sie eine Anwendung entwickeln, die nicht in Teile unterteilt ist (in der von mir erwähnten Weise), können Sie Ihre Anwendung nach der Erstellung Ihres Projekts problemlos bereitstellen, aber wenn Sie nur ein Formular in Ihrer Anwendung ändern, müssen Sie die gesamte Anwendung erneut erstellen und die gesamte Anwendung bereitstellen.

Bei dieser Anwendung kann ich den Server nicht anhalten, um die Anwendung erneut bereitzustellen. Ich möchte den Teil der Anwendung ändern und bereitstellen, der geändert werden soll, nicht die gesamte Anwendung!!!

Natürlich habe ich über die Art und Weise gesucht, dass ich mein Problem lösen kann!!! Ich habe herausgefunden, dass ich OSGI auf der Serverseite verwenden kann, weil es Modularität auf der Ebene der Softwarekonstruktion bietet und mir hilft, den Lebenszyklus von Modulen und viele andere Vorteile zu verwalten, die Sie kennen! Und ich habe herausgefunden, dass ich Gadgets auf der Client-Seite verwenden kann.

Was meinen Sie dazu? Sind sie eine gute Wahl?

Wenn sie eine gute Wahl sind, wie kann ich anfangen? Ich weiß, dass es verschiedene Arten von Implementierungen von OSGi gibt, wie Apache Felix, Eclipse Equinox und Knopflerfish. Welche ist gut für diese Wahl?

Wie können GWT und OSGi integriert werden? Wie können sie miteinander interagieren?

4voto

Neil Bartlett Punkte 23356

Leider ist das, was Sie tun möchten, mit GWT nicht vollständig möglich.

OSGi ist eine Modularitätslösung für Java, oder genauer gesagt für die JVM. Eine GWT-Client-Anwendung läuft nicht auf der JVM, sondern auf dem Browser in einer JavaScript-Umgebung. Daher kann OSGi nicht verwendet werden, um zur Laufzeit zusammengesetzte modulare GWT-Anwendungen zu erstellen.

Eine GWT-Anwendung peut auf Quellcode-Ebene modular sein, aber die Module müssen zum Zeitpunkt der Erstellung zu einer Anwendung zusammengefügt werden. Die resultierende Laufzeit ist monolithisch.

Es ist jedoch durchaus möglich, OSGi zu verwenden, um die GWT-Servlets zu hosten, und Sie können die volle Leistungsfähigkeit der OSGi-Laufzeitmodularität auf der Serverseite nutzen.

Als Alternative können Sie sich Vaadin ansehen. Dies ist ein Web-Framework, das GWT verwendet, um Widgets bereitzustellen, aber die Logik der Anwendung läuft auf dem Server. Infolgedessen unterstützt es volle Laufzeitmodularität durch OSGi-Bündel. Dieser Ansatz hat jedoch seinen Preis: Ihre Webanwendung ist ziemlich geschwätzig, da viel mehr Kommunikation zwischen dem Browser und dem Server stattfindet als in GWT oder in einer traditionellen Webanwendung. Es ist möglich, dass dieser Ansatz für eine sehr große Anzahl von Benutzern nicht skalierbar ist.

Ob Sie nun Equinox, Felix oder Knopflerfish verwenden, ist eigentlich egal. Halten Sie sich an die Spezifikation, und Sie können problemlos zwischen den Implementierungen wechseln.

2voto

Joseph Lust Punkte 18000

Genau das habe ich vor zwei Jahren getan: OSGi und GWT für die Bereitstellung von Projektmodulen ohne Ausfallzeiten.

Urteil: Tun Sie es nicht, es sei denn, Sie müssen es wirklich tun.

Kurz gesagt, OSGi ist ein Biest und die Nachrüstung einer bestehenden Anwendung ist alles andere als trivial . Sie erstellen jetzt keine .war-Dateien mehr (.ear) und können nicht mehr die Standard-Jars und Maven-Repositories verwenden, die Sie vorher benutzt haben. Jetzt muss alles ein Bundle sein. Das Problem ist, dass viele Dinge (GWT, Spring, tonnenweise Libs) keine Bundles sind! Und Sie müssen sie in einem Enterprise-Bundle-Repository finden oder, was noch mehr Spaß macht, die Quellen von Drittanbietern selbst neu bündeln. Noch besser ist es, den anderen Entwicklern zu sagen, dass sie alles neu schreiben sollen, was ihre Lieblings-Lib verwendet, weil das Bündeln zu komplex wäre.

El Der GWT-Teil hat nicht so viel Arbeit gemacht . Die Art und Weise, wie Kontexte für Module in gwt-servlet behandelt wurden, musste geändert werden, damit jedes Modul seinen Kontext auf dem Server finden konnte. Wir mussten auch eine Möglichkeit für die meisten GWT-Dienste schaffen, sich beim Laden zu registrieren/abzumelden, und einen Erkennungsdienst, damit sie wissen, wer sonst noch da draußen ist.

Jetzt der andere Schmerz: Projektexplosion .

Nehmen wir an, Sie haben 20 Module, die Sie unabhängig voneinander bereitstellen möchten. Nun, zu Beginn sind sie wahrscheinlich stärker gekoppelt, als Ihnen lieb ist, also haben Sie besser ein paar Wochen damit verbracht, sie in unabhängige Maven-Projekte aufzuteilen und gemeinsame Teile in ein Lib-Projekt zu verschieben. Aber jetzt haben Sie eine Menge Abhängigkeiten, die Sie im Auge behalten müssen. Wenn jemand Ihr Lib-Projekt ändert, müssen Sie dann jedes Projekt aktualisieren oder nur 7 davon? In der klassischen die Welt aufhalten Entwicklung hatten Sie nur eine Version Ihres gesamten Codes. Jetzt müssen Sie entscheiden, ob Sie für die Aktualisierung des Formulars "Passwort vergessen" auch Ihr Indexseitenmodul aktualisieren müssen. Sie werden eine Menge Versionsnummern zu erstellen und zu verfolgen haben. In unserem Fall hatten wir schnell 55 Maven-Projekte, die ständig auf unserem CI-Server gebaut wurden. Das bedeutete, dass einige Checkins 55 Builds auslösen konnten. Igitt.

Endlich, JSON-Schnittstellen .

Wir haben GWT RPC verwendet. Es ist magisch. Schreiben Sie eine Schnittstelle und alles funktioniert einfach. Es ist auch serialisiert und gzipped über das Kabel zu. Fantastisch. Aber die Serialisierungsrichtlinien hängen von Objekt- und String-Lookup-Tabellen ab, die zur Kompilierungszeit pro Modul erstellt werden. Projekt A kann also nicht per RPC auf Projekt B zugreifen. Wir haben uns für die Verwendung von JSON entschieden, weil es eine "graceful degradation" gibt, d.h. dass es nicht zu Fehlern kommt, wenn neue, nicht erkannte Eigenschaften von Objekten vorhanden sind. Das bedeutet, dass Sie wiederum eine Möglichkeit brauchen, um alle Backend-Service-Aufrufe in den Versionen des JSON, die sie erwarten und verarbeiten können, kohärent zu halten. Am besten simulieren Sie das Live-Upgrade auch vorher.

Kurz gesagt: möglich, aber warum? Brauchen Sie wirklich OSGi, um Module im laufenden Betrieb bereitzustellen? weil Sie eine geschäftskritische Anwendung mit 1000% Betriebszeit betreiben? Oder weigert sich Ihr Chef/Architekt einfach zu akzeptieren, dass 99,999 % gut genug sind? Wahrscheinlich brauchen Sie diese Betriebszeit nicht und können mit einem guten Proxy, der es Ihnen ermöglicht, Instanzen in den Balancer-Pool aufzunehmen oder aus ihm herauszunehmen, eine Betriebszeit von nahezu 100 % erreichen. Vergessen Sie auch nicht, dass Sie, selbst wenn Sie Ihre Projekte im laufenden Betrieb aktualisieren können, hoffentlich eine Möglichkeit haben, Ihre Datenbank im laufenden Betrieb zu aktualisieren, ohne dass eine einzige Transaktion unterbrochen wird.

1voto

Romain Hippeau Punkte 23654

Ich glaube, Sie bereiten sich mehr Kopfschmerzen, als es wert ist.
Ich würde das Ganze auf einen Schlag einsetzen. Wenn nicht, werden Sie am Ende mit unpassenden Teile der Anwendung, die nicht miteinander synchronisiert sind. GWT hat sowohl Client- als auch Server-Komponenten, und sie müssen zusammen eingesetzt werden. Wenn Sie eine Null-Ausfallzeit-Richtlinie haben, dann haben Sie wahrscheinlich einen Lastausgleich eingerichtet.
Ich würde die Lastausgleichssoftware verwenden, um die neue Version der Anwendung bereitzustellen. Schalten Sie eine Seite aus (indem Sie den gesamten Datenverkehr auf die andere Seite umleiten), stellen Sie sie bereit, machen Sie einen kurzen Rauchtest, schalten Sie den gesamten Datenverkehr auf die neue Seite um und wiederholen Sie den Vorgang mit der alten Seite.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X