2008-08-19 30 views
40

Was macht eine Modul-/Service-/Bit-Anwendungsfunktionalität besonders gut für ein OSGi-Modul geeignet?Was ist der beste Weg, um mit OSGI zu beginnen?

Ich bin interessiert an OSGi in meinen Anwendungen zu verwenden. Wir sind ein Java-Shop und wir verwenden Spring ziemlich ausgiebig, also lehne ich mich an, Spring Dynamic Modules for OSGi(tm) Service Platforms zu verwenden. Ich bin auf der Suche nach einer guten Möglichkeit, ein wenig OSGi als Test in eine Anwendung zu integrieren. Hat jemand hier diese oder eine ähnliche OSGi-Technologie verwendet? Gibt es irgendwelche Fallstricke?

@Nicolas - Danke, ich habe das gesehen. Es ist ein gutes Tutorial, aber ich suche mehr nach Ideen, wie ich mein erstes "echtes" OSGi-Paket machen kann, im Gegensatz zu einem Hello World-Beispiel.

@david - Danke für den Link! Im Idealfall würde ich das Ganze mit einer Greenfield-App so gestalten, dass es dynamisch ist. Was ich jetzt suche, ist es, es in ein kleines Stück einer bestehenden Anwendung einzuführen. Angenommen, ich kann ein beliebiges Stück der App auswählen, was sind einige Faktoren, die berücksichtigt werden müssen, um das Stück als OSGi-Meerschweinchen besser oder schlechter zu machen?

Antwort

37

Nun, da Sie nicht einen Teil OSGi und einen Teil nicht-OSGi haben können, müssen Sie Ihre gesamte App OSGi machen. In seiner einfachsten Form erstellen Sie ein einzelnes OSGi-Paket aus Ihrer gesamten Anwendung. Natürlich ist dies keine bewährte Methode, aber es kann nützlich sein, ein Gefühl für die Bereitstellung eines Bundles in einem OSGi-Container (Equinox, Felix, Knopherfish usw.) zu bekommen.

Um auf die nächste Ebene zu gelangen, sollten Sie Ihre App in Komponenten aufteilen. Komponenten sollten normalerweise eine Reihe von Verantwortlichkeiten haben, die über eine Reihe von Schnittstellen und Klassenabhängigkeiten vom Rest Ihrer Anwendung isoliert werden können. Diese rein von Hand zu identifizieren, reicht von ziemlich einfach für eine gut konzipierte, stark zusammenhängende, aber lose gekoppelte Anwendung bis hin zu einem Alptraum für verblockten Quellcode, mit dem Sie nicht vertraut sind.

Einige Hilfe kann von Tools wie JDepend kommen, die Ihnen die Kopplung von Java-Paketen mit anderen Paketen/Klassen in Ihrem System zeigen können. Ein Paket mit einer niedrigen efferenten Kopplung sollte leichter in ein OSGi-Bündel extrahierbar sein als eines mit einer hohen efferenten Kopplung. Noch mehr architektonischen Einblick kann mit Pro Tools wie Structure 101 gewonnen werden.

Rein technisch gesehen, arbeite ich täglich mit einer Anwendung, die aus 160 OSGi-Bundles und Spring DM besteht. Ich kann bestätigen, dass der Übergang von "normalem" Spring zu Spring DM weitgehend schmerzfrei ist. Der zusätzliche Namespace und die Tatsache, dass Sie Ihre OSGi-spezifische Spring-Konfiguration in separaten Dateien isolieren können (und sollten), machen es noch einfacher, sowohl mit als auch ohne OSGi-Bereitstellungsszenarien zu arbeiten.

OSGi ein tiefes und breites Komponentenmodell ist, Dokumentation Ich empfehle:

  • OSGi R4 Specification: Holen Sie sich die PDF-Dateien des Kerns und Kompendium Spezifikation, sie sind kanonisch, autoritative und sehr gut lesbar. Halten Sie zu jeder Zeit eine Verknüpfung zu ihnen bereit, Sie werden sie konsultieren.
  • auf OSGi Best Practices Lesen Sie up, gibt es eine große Menge von Dingen, die Sie können tun, aber eine etwas kleinere Menge von Dingen, die Sie tun sollten, und es gibt einige Dinge, die Sie sollten nie (DynamicImport tun: * für Beispiel).

Einige Links:

1

Ich mag die Apache Felix tutorials. Ich denke jedoch, dass die Nutzung von OSGi in Ihrer Anwendung im Allgemeinen nicht einer der "Lasst uns diesen Rahmen nutzen, weil es ein Hype ist" Entscheidung ist. Es ist eher eine Frage des Designs, aber alles, was OSGi Ihnen in Bezug auf Design bietet, können Sie auch mit Java verwenden.

Zur Laufzeit können Sie nicht einfach eine vorhandene Anwendung hinzufügen und OSGi aktivieren. Es muss Design sein, um dynamisch zu sein. Spring DM macht es leicht, das vor dir zu verstecken, aber es ist immer noch da und du musst dir dessen bewusst sein.

2

Ist Ihre bestehende Anwendung monolithisch oder abgestuft in separaten Prozessen/Schichten?

Wenn Sie mehrstufig sind, können Sie die mittlere/App-Ebene konvertieren, um sie in einem OSGi-Container auszuführen.

In der Erfahrung meines Teams haben wir festgestellt, dass der Versuch, Web-Sachen in OSGi zu tun, schmerzhaft ist. Andere Schwachpunkte sind Hibernate und Jakarta Commons Logging.

Ich finde die OSGi-Spezifikationen ziemlich gut lesbar und ich empfehle Ihnen, das Ablaufdiagramm auszudrucken, das den Algorithmus zum Laden von Klassen zeigt. Ich werde garantieren, dass Sie Momente haben werden, "warum bekomme ich einen NoClassDefFoundError?": Das Flussdiagramm wird Ihnen sagen, warum.

+1

Wo finde ich dieses Flussdiagramm? – systemoutprintln

+0

@dubdubdubdot: Ich denke, er meint das Flussdiagramm [Bundle Life-Cycle] (http://en.wikipedia.org/wiki/OSGi#Life-cycle). –

2

Wenn Sie mit OSGi beginnen, sollten Sie einige Punkte beachten.

Wie an anderer Stelle in diesem Thread erwähnt, ist das Wissen über das Laden von Klassen sehr wichtig. Meiner Erfahrung nach hat jeder früher oder später Probleme damit.

Eine andere wichtige Sache, die man sich merken sollte ist: halte niemals Referenzen! Sehen Sie sich das Whiteboard-Muster an, auf dem das Service-Konzept von OSGi aufbaut (siehe den Link in einer der anderen Antworten).

Nach meiner Erfahrung sollten Sie nicht versuchen, eine Monolith-Anwendung in eine OSGi-basierte zu konvertieren. Dies führt normalerweise zu einem schlechten und unüberschaubaren Durcheinander. Von neuem beginnen.

Laden Sie eine der frei verfügbaren eigenständigen oSGi-Implementierungen herunter. Ich fand Knopflerfish ziemlich gut und stabil (ich benutze ihn in vielen Projekten). Es kommt auch mit viel Quellcode. Sie können es hier finden: http://www.knopflerfish.org

Ein anderes gutes Tutorial finden Sie hier. https://pro40.abac.com/deanhiller/cgi-bin/moin.cgi/OsgiTutorial

Peter Kriens von der OSGi Alliance gab ein nettes Interview: http://www.infoq.com/interviews/osgi-peter-kriens. Seine Homepage und Blog (die immer eine gute Lektüre finden Sie hier: http://www.aqute.biz

8

Wenn Sie eine neue Technologie erlernen, können Sie ohne große Kopfschmerzen in Dinge eintauchen. An diesem Punkt der Gemeinde bei ops4j.org ein reichhaltiges Toolset bietet "PAX", die beinhaltet:

  • Pax Runner: Führen und wechseln zwischen Felix, Equinox, Knopflerfish und Concierge leicht
  • Pax Construct: konstruieren, Organisieren & Build-OSGi-Projekte mit maven leicht
  • Pax Drone: Testen Sie Ihre OSGi-Bundles mit JUnit, während Rahmen unabhängig ist (verwendet PaxRunner)

Dann gibt es viele Implementierungen von OSGi Kompendium Dienstleistungen:

  • Pax Logging (Logging),
  • Pax Web (http Service),
  • Pax Web Extender (Krieg Unterstützung),
  • Pax Münze (Konfiguration),
  • Pax Shell (Shell-Implementierung, Teil der nächsten osgi-Version)
  • und vieles mehr.

.. und es ist ein hilfreicher, Rahmen independend Gemeinschaft, - aber das ist jetzt Werbung ;-)

4

Diese Antwort kommt fast 3 Jahre nach der die Frage gestellt wurde, aber die link Ich habe gerade ist wirklich gut, vor allem für Anfänger mit Maven. Eine Schritt-für-Schritt-Erklärung.

Verwandte Themen