Architektur, Download und Installation
Die Architektur des JNDI besteht aus drei Schichten (siehe Abbildung 1): dem JNDI API ( application programming interface), dem naming manager und dem JNDI SPI ( service provider interface). Die Anwendungsentwicklerin greift mit dem API auf den Naming Manager zu, dieser wiederum nutzt das SPI um die eigentlichen

|
Abb. 1: Schema der JNDI-Architektur
|
Dienste zu verwenden. Diese Trennung erlaubt die beliebige Erweiterung des Systems und bleibt transparent für die Anwendungsprogramme. Dasselbe Design-Pattern wird auch für die Java-Cryptography-Extensions verwendet.
Service Provider gibt es für eine ganze Reihe von bekannten Namens- und Verzeichnisdiensten (manche erst im Betastatus). Insbesondere Enterprise-JavaBeans-Server stellen auch einen Provider zur Verfügung, damit Anwendungen die Serverobjekte lokalisieren können. Details dazu gibt es in einer späteren Folge der Coffee-Shop-Reihe über Java-Enterprise- Features, die sich spezifischer mit EJBs beschäftigt.
In der Java-Version 1.3 wird das JNDI mit drei Service Providern (LDAP, RMI und CORBA) mitgeliefert. Weitere Service Provider sind von der JNDI-Homepage (siehe [2]) herunterzuladen. Arbeitet man noch mit dem JDK 1.2.x, so ist das JNDI auch getrennt erhältlich. Die Pakete sind relativ klein, die größten Brocken sind die Dokumentation und das Tutorial, die entpackt jeweils etwa 4 MByte belegen. Hat man das JDK 1.3, empfehle ich auch noch den Filesystem-Service-Provider herunterzuladen, da er das Herumspielen mit dem JNDI erlaubt ohne einen LDAP-, RMI- oder CORBA-Dienst zu starten.
|
Verzeichnisse sind Datenspeicher und darin den klassischen (relationalen) Datenbanken verwandt. Oftmals stehen sogar hinter LDAP-Servern ganz normale Datenbanken. Trotzdem gibt es gewichtige Unterschiede zwischen Verzeichnissen und Datenbanken.
Verzeichnisse sind logisch zentralisierte Datenspeicher von physisch verteilten Informationen. Das bedeutet, dass die Daten eventuell partitioniert an verschiedenen Standorten vorliegen oder an mehrere Lokationen repliziert werden, aber jeder Client dieselbe Sicht auf die Daten hat. Die Daten sind meist hierarchisch organisiert und relativ statisch. Ziel ist es, einen einheitlichen Zugriff auf Daten mit anwendungsübergreifendem Charakter (etwa Adressen von Personen oder Ressourcen im Netzwerk) zu ermöglichen und diesen Zugriff anwendungsunabhängig zu steuern.
Bei Verzeichnissen handelt es sich stets um eine spezialisierte Nischenlösung. Daten, die für Verzeichnisse geeignet sind, haben folgende Eigenschaften:
- Die Daten werden von vielen Anwendungen benötigt.
-
Die Clients, die auf die Informationen zugreifen, können
geographisch verteilt sein.
-
Aus Administrationsgründen können/müssen die
Daten von unterschiedlichen Personen (etwa je Standort) gepflegt werden.
- Lesezugriff ist viel häufiger als Schreibzugriff.
-
Für Updates sind keine Transaktionen notwendig. Ebenso ist
ein Locking einzelner Daten nicht erforderlich.
-
Bei (physisch) verteilten Verzeichnissen ist keine strenge
Konsistenz notwendig.
-
Die einzelnen Datenelemente sind nicht zu groß. Damit
sind Replikationen zwischen den einzelnen Standorten effizient implementierbar.
Die besonderen Stärken von Verzeichnissen sind der schnelle Zugriff auf die Daten, die Unterstützung von hierarchisch organisierten Daten, zudem Attribute mit mehreren Werten und Suchergebnisse mit potenziell unterschiedlichen Ergebnistypen sowie die Replikationsmöglichkeit. Außerdem sind Verzeichnisse meist einfacher administrierbar als Datenbanken und erlauben eine sehr feine Granularität der Zugriffskontrolle.
Den Stärken steht allerdings auch eine Reihe von Schwächen gegenüber. Je nach Implementation kann beispielsweise der Schreibzugriff sehr langsam sein (insbesondere die Zeit, bis die Veränderung an alle Repliken weitergereicht wurde, kann lang sein). Wie schon erwähnt gibt es keine Möglichkeit Veränderungen transaktionsorientiert durchzuführen. Auch ein Locking einzelner Datenelemente existiert nicht, ebenso wenig wie Relationen zwischen diesen Elementen. Damit muss also die schreibende Anwendung die Datenintegrität sicherstellen. Auch die Abfragesprache ist nicht so ausgefeilt wie die für relationale Datenbanken.
Vor- und Nachteile von Verzeichnissen müssen also in jedem konkreten Anwendungsfall genau abgewogen werden. Die Entscheidung ist trotzdem meist einfach, da Verzeichnisse eingeführt werden, um existierende Lösungen zu ersetzen oder zu erweitern.
Die historischen Wurzeln kann man grob diesen drei Kategorien zuordnen: einmal der Verwaltung von Netzwerk-Ressourcen (etwa NDS, NIS), dann den Adressbuch-basierten Verzeichnissen (insbesondere von E-Mail-Anwendungen) und als dritter Kategorie dem Versuch, mit dem X.500-Standard ein globales Adressbuch zu definieren.
Beispiele für solche Verzeichnisse sind das Lotus-Domino-Verzeichnis (mit seiner E-Mail-Vergangenheit) und Microsofts Active Directory, dessen Geschichte auf die LAN-Manager-Domains und auf das Adressbuch von Microsoft Exchange zurückgeht.
|
Typischerweise entpackt man alle Pakete unterhalb von /usr/local/jndi und kopiert dann alle JAR-Dateien aus dem lib-Verzeichnis nach /jre/lib/ext oder setzt symbolische Links. Mehr ist nicht zu tun. Wer sich auch das Beispielpaket heruntergeladen hat, kann zur Überprüfung der Konfiguration den JNDI-Browser starten (nach Anpassung der Datei runnit an die eigenen Gegebenheiten).
Ein Blick in das API
Das JNDI-API ist verteilt auf fünf Pakete:
- javax.naming
- javax.naming.directory
- javax.naming.event
- javax.naming.ldap
- javax.naming.spi
Das erste Paket enthält Klassen und Interfaces für den Zugriff auf Namensdienste. Wichtig sind hier die Interfaces Context (insbesondere die Methoden lookup(), listBindings() und list()), das Interface Name mit den Klassen CompoundName und CompositeName sowie die Klasse Reference. Dazu gibt es noch eine ganze Hierarchie von Exceptions, angefangen bei der obersten Klasse NamingException.
Mittels JNDI werden alle Aktionen relativ zu einem Context ausgeführt. Da es hier keinen absoluten Root-Context gibt, muss die Programmiererin am Anfang einen InitialContext erzeugen. Als Argument des Konstruktors dient ein Hashtable, der die dazu notwendigen Konfigurationsparameter enthält. Meist kommt man mit zwei Parametern aus: dem Namen einer Klasse, die das Interface InitialContextFactory implementiert, und einer so genannten Provider-Url.
Ein Beispiel soll das verdeutlichen (siehe Listing 1). Hier wird der File-System-Provider verwendet. In diesem Fall gibt die Provider-Url das Verzeichnis an, relativ zu dem die Aktionen ausgeführt werden. Der File-System-Provider bindet Dateinamen an Objekte vom Typ java.io.File (genau genommen an Referenzen, die über lookup() automatisch aufgelöst werden). Sind eigene Java-Objekte im Dateisystem zu speichern, ist etwas mehr Aufwand nötig, wie weiter unten am Beispiel der Speicherung von Objekten in einem LDAP-Server beschrieben wird.
Das Package javax.naming.directory enthält die notwendigen Erweiterungen des ersten Pakets für Verzeichnisdienste. Analog zum InitialContext gibt es hier einen InitialDirContext. Weitere wichtige Klassen und Interfaces sind BasicAttribute (implementiert Attribute) sowie BasicAttributes (implementiert Attributes). Letzteres ist eine ungeordnete Collection. Änderungen an den Attributes haben keine Auswirkungen auf das Directory, wenn nicht mittels der entsprechenden Methode des DirContext-Objekts ( modifyAttributes()) ein Update durchgeführt wird.
Die letzten drei Packages sollen hier nur kurz erwähnt werden. javax. naming.event erlaubt es, das vom AWT bekannte Event-Listener- Design-Pattern auf Namens- und Verzeichnisdienste anzuwenden. Das javax.naming.ldap-Package enthält die über das directory-Package hinausgehende spezifische LDAP-Funktionalität, das javax.naming.spi-Package die für Service Provider notwendigen Factory-Interfaces sowie die zentrale NamingManager-Klasse.
|
OpenLDAP mit seinem Wappentier, dem OpenLDAP-Wurm (siehe Abbildung 3), basiert auf der Version 3.3 des LDAP-Servers der Universität von Michigan. OpenLDAP ist unter der "OpenLDAP Public License" verfügbar, die von der "Artistic License" (von Perl bekannt) abgeleitet ist. Die Quellen können von [3] heruntergeladen und mittels
> ./configure
> make depend
> make
> su -c "make install"
konfiguriert, kompiliert und installiert werden. Wer die Version 7 der SuSE-Distribution sein Eigen nennt, kann OpenLDAP auch wie gewohnt mit Yast installieren. Ein entsprechendes Start-Stop-Skript wird dann ebenfalls automatisch installiert. Der Start während der Bootphase kann über Einträge in /etc/rc.config gesteuert werden.

|
Abb. 3: Der OpenLDAP-Wurm.
|
Die zentralen Komponenten sind slapd und slurpd. Der slapd ist der eigentliche LDAP-Server während der slurpd für die Replikation der Änderungen an andere slapd-Instanzen zuständig ist. Der Backing-Store des LDAP-Servers ist eine LDBM- kompatible Datenbank (unter Linux typischerweise GDBM). Diese Datenbank ist besonders ausgelegt auf das Speichern von Key-Value-Paaren und bietet somit ein einfaches Interface für das Speichern von LDAP-Einträgen.
Konfiguriert wird der slapd über die Datei slapd.conf (je nach Konfiguration des OpenLDAP-Pakets unter /usr/local/etc/openldap oder /etc/ openldap). Hier werden die Zugriffsrechte, der Ort der LDBM-Datenbank, die Servertopologie usw. definiert. Es bietet sich an, erst mal die LDAP-Howto zu lesen, außerdem existiert ein Guide für die OpenLDAP-Administration, der Antwort auf die meisten Fragen geben sollte.
|
Nach diesem Überblick über die Theorie geht es jetzt an die Praxis. Als Basis dient mir der frei verfügbare LDAP-Server OpenLDAP (Details dazu im Kasten "OpenLDAP"). Wer das Beispiel nachvollziehen möchte, sollte einen entsprechenden Server lokal aufsetzen und mit einigen Daten füllen. Das JNDI-Tutorial liefert auch eine Reihe von Beispielen einschließlich der dazugehörigen Daten mit.
| Whitepaper |
|
Usage Landscape Enterprise Open Source Data Integration
Die Nachfrage nach Datenintegrationslösungen für Unternehmen ist zunehmend gestiegen und vor allem das Interesse an Open Source Technologien wird immer größer. Doch wie und von wem werden Open Source Datenintegrationslösungen genutzt und welches Nutzungsverhalten lässt sich daraus ableiten? Das vorliegende White Paper präsentiert die Erfahrungswerte von über 1000 Open Source Nutzern und liefert fundierte Antworten auf diese Fragen.
Download PDF (Registrierung erforderlich)
|
|
Daten Migration - Eine Publikation von Bloor Research
Datenmigrationsprojekte überschreiten häufig das Budget, neigen zu Verzögerung und werden unter Umständen komplett abgebrochen. Bloor Research ist eines der weltweit führenden IT-Forschungs-, Analyse- und Beratungsunternehmen und wird in dem vorliegenden White Paper die wichtigsten Aspekte dieser Problematik näher beleuchten. Ferner werden praktische Empfehlungen für erfolgreiche Migrationsprojekte gegeben, die Sie auf Ihr nächstes Projekt übertragen können.
Download PDF (Registrierung erforderlich)
|
Dieser Online-Artikel kann Links enthalten, die auf nicht mehr vorhandene Seiten verweisen. Wir ändern solche "broken links"
nur in wenigen Ausnahmefällen. Der Online-Artikel soll möglichst unverändert der gedrucken Fassung entsprechen.
|