22. Juni 2016

synTechTalk: OSGI – eine Einführung

synTechTalk: OSGI - eine Einführung - Bild: Lily http://www.freevector.com/jigsaw-puzzle (CC BY 4.0)

Heute im synTechTalk: Eine Einführung in OSGI.

Weg von monolithischen Anwendungen, hin zu unabhängigen Services. Diesen Slogan hat sich die OSGI-Alliance (Open Services Gateway initiative) auf die Flagge geschrieben und viele Entwickler springen auf diesen Zug auf.

Der OSGI Standard

Die OSGI-Alliance hat einen Standard entwickelt, der es erlaubt, viele einzelne Java-Services zu verwalten. Das hat den Vorteil, dass diese Services unabhängig voneinander ausgetauscht werden können und laufen können. Es ist ebenfalls möglich, Services auf mehrere Systeme zu verteilen um eine Micro Service Architektur aufzubauen.

Die OSGI stellt dafür, wie bereits erwähnt, nur den Standard zur Verfügung. Daher gibt es mehrere unterschiedliche Implementierungen. Das Gute an dem Standard ist jedoch, dass entwickelte Inhalte auf jeder OSGI-Umgebung laufen können.

Mit dem Standard arbeiten: von Bundles und Services

Im Kontext von OSGI gibt es zwei wesentliche Begriffe: Bundles und Services.

Bundles sind abgeschlossene Softwareeinheiten, die für eine bestimmte Aufgabe implementiert werden. Bundles sind Java-Programme ohne Main-Methode. Stattdessen haben sie eine Activator-Klasse, die für das Starten eines Bundles zuständig ist.

import org.osgi.framework.BundleActivator;

import org.osgi.framework.BundleContext;

package de.synaix.sample.hallowelt;

public class Activator implements BundleActivator{

    public void start(BundleContext context) throws Exception {
        System.out.println("Hallo Welt");
    }

    public void stop(BundleContext context) throws Exception { 
        System.out.println("Auf wiedersehen Welt");
    }

}

Alle Activator-Klassen leiten von der Klasse BundleActivator ab und implementieren daher die zwei Methoden start und stop.

Der Übergabeparameter context wird hierbei von der Umgebung übergeben. Der context wird benötigt, um mit der Umgebung zu interagieren. So können mit dem context zum Beispiel neue Services registriert werden.

Zusätzlich zum Activator wird eine Manifest-Datei benötigt. Die Manifest-Datei enthält alle nötigen Kenndaten zu einem Bundle.

Manifest-Version: 1.0
Bundle-ManifestVersion: 1
Bundle-Name: HalloWelt
Bundle-SymbolicName: de.synaix.sample.HalloWelt
Bundle-Version: 1.0.0
Bundle-Activator: de.synaix.sample.hallowelt.Activator
Export-Package: de.synaix.sample.share.*
Import-Package: org.osgi.framework;version="1.3.0"

Besonders wichtig ist dabei, dass der korrekte Pfad zum Activator des Bundles angegeben wird, da das Bundle ansonsten nicht gestartet werden kann.

Des Weiteren kann über die Manifest-Datei Code exportiert und importiert werden. Dies ermöglicht, dass Bundles auf Klassen und Pakete von anderen Bundles zugreifen können.

Die Serviceschicht

Kommen wir nun zum zweiten Herzstück der OSGI-Umgebung: Der Serviceschicht. An der Serviceschicht können Bundles Services registrieren und auf registrierte Services zugreifen. Dies ist die einzige Möglichkeit, wie Bundles direkt miteinander kommunizieren können.

Um einen Service zu registrieren, benötigt man ein Interface und dessen Implementierung.

public class Activator implements BundleActivator {
    public void start(BundleContext context) throws Exception {
        context.registerService(ServiceInterface.class.getName(), new ServiceImpl(),null);
    }
}
public interface ServiceInterface {
    public void machSachen();
}
public class ServiceImpl implements ServiceInterface{
    public void machSachen(){
        System.out.println(„Sachen gemacht“);
    }
}

Um einen Service abzufragen, benötigt man den Kontext und das Interface.

public class AnotherActivator implements BundleActivator{
    public void start(BundleContext context) {
        ServiceReference reference = context.getServiceReference(ServiceInterface.class.getName());
        ServiceInterface service = (ServiceInterface)context.getService(reference);
        service.machSachen();
    }
}

Und wie geht’s weiter?

Dies waren einmal die absoluten Basics. Natürlich hat OSGI wesentlich mehr zu bieten. Es gibt Frameworks, die das Arbeiten in der Umgebung erleichtern, sowie viele OpenSource-Bundles, die für eigene Umgebungen zur Verfügung gestellt werden.

Wenn Dir der Beitrag gefallen hat, freue ich mich über einen Kommentar ;-). Bei weiterem Interesse können wir gerne tiefer in die Materie einsteigen und erläutern, wie man sich die Arbeit mit OSGI noch einfacher gestalten kann.

Weiterführende Links

Neugierig geworden? Hier sind schon ´mal ein paar Links für die weitere Recherche:

(Olaf Mattizck)


In unserer Reihe synTechTalk geben unsere DEV und OPS Teams Einblicke in ihr Technologie- und Architektur- KnowHow zur Umsetzung erfolgreicher digitaler Geschäftsmodelle.

Keine Kommentare