JNDI-Übersicht, Teil 1: Eine Einführung in Namensdienste

Diejenigen unter Ihnen, die in einer Bibliothek waren und sich noch an die Erfahrung erinnern können, erinnern sich möglicherweise an den Prozess des Auffindens eines Bibliotheksbuchs. Wenn Sie nicht mit Ihrer antiquarischen Seite in Kontakt sind, wird diese Situation ungewohnt erscheinen; Aber hin und wieder gehe ich in eine lokale Bibliothek, um nach einem echten Offline-Buch zu suchen. Bibliotheken sind mit Tausenden von Dingen gefüllt - sie sind staubig und bestehen aus Zellstoff und Kuhhaut, aber sie sind auf ihre Weise faszinierend. Wenn der Zwang, einen bestimmten zu finden, aufkommt, vermeide ich auf jeden Fall den naiven Kurs, in den Gängen der Bibliothek auf und ab zu gehen und mich stattdessen dem Kartenkatalog zuzuwenden.

TEXTBOX: TEXTBOX_HEAD: JNDI Übersicht: Lesen Sie die ganze Serie!

  • Teil 1. Eine Einführung in die Benennungsdienste
  • Teil 2. Verwenden Sie JNDI-Verzeichnisdienste, um Ihre verteilten Anwendungen besser zu verwalten

  • Teil 3. Verwenden Sie JNDI, um die Objekte Ihrer verteilten Anwendung zu speichern

  • Teil 4. Fassen Sie zusammen, was Sie mit einer JNDI-fähigen Anwendung gelernt haben: END_TEXTBOX

Ein Kartenkatalog für Uneingeweihte ordnet die Namen von Büchern ihrem Speicherort in der Bibliothek zu. Indem ich zuerst zum Kartenkatalog gehe und nach dem Standort des Buches suche, spare ich mir viel Fußweg. (Übrigens habe ich gehört, dass einige Bibliotheken den Benutzern tatsächlich erlauben, Computer anstelle des Kartenkatalogs zu verwenden. Sie haben es zur Hälfte richtig gemacht - jetzt, wenn sie nur die Informationen in den Büchern in den Computer legen, zu dem sie gehören. ..)

So überraschend es auch scheinen mag, der Begriff eines Kartenkatalogs ist auch in der Computerwelt sehr praktisch. Beim Rechnen nennen wir es einen Namensdienst, der Namen mit den Standorten von Diensten und mit Informationen verknüpft. Es bietet Computerprogrammen einen einzigen Ort, an dem sie die benötigten Ressourcen finden können. Auf diese Weise verschwenden Programme keine Zeit, indem sie das elektronische Äquivalent zum Auf- und Abgehen der Gänge ausführen, und erfordern auch nicht, dass die Standorte in ihrer Logik fest codiert sind.

Das Auffinden von Ressourcen ist in großen Unternehmensumgebungen von besonderer Bedeutung, in denen die von Ihnen erstellten Anwendungen möglicherweise von Diensten abhängen, die von Anwendungen bereitgestellt werden, die von anderen Gruppen in anderen Abteilungen geschrieben wurden. Eine gut gestaltete Namensinfrastruktur macht solche Projekte möglich - und das Fehlen einer macht sie unmöglich. Tatsächlich beginnen viele Bemühungen zur Neugestaltung von Geschäftsprozessen mit dem Entwurf und der Implementierung einer robusten, unternehmensweiten Namens- und Verzeichnisinfrastruktur.

Diesen Monat stelle ich die Java Naming and Directory Interface (JNDI) vor. JNDI bietet eine Schnittstelle mit gemeinsamem Nenner für viele vorhandene Namensdienste. Daher wurde JNDI nicht entwickelt, um vorhandene Technologien zu ersetzen. Stattdessen bietet es eine gemeinsame Schnittstelle zu vorhandenen Namensdiensten. Schauen wir uns zunächst einige dieser Dienste an.

Eine Einführung in die Namensdienste

Die folgende Abbildung zeigt die Organisation eines generischen Namensdienstes.

Ein Namensdienst verwaltet eine Reihe von Bindungen. Bindungen beziehen Namen auf Objekte. Alle Objekte in einem Benennungssystem werden auf dieselbe Weise benannt (dh sie abonnieren dieselbe Namenskonvention ). Clients verwenden den Namensdienst, um Objekte nach Namen zu suchen.

Es gibt eine Reihe vorhandener Namensdienste, von denen einige im Folgenden beschrieben werden. Sie folgen jeweils dem obigen Muster, unterscheiden sich jedoch in den Details.

  • COS-Benennung (Common Object Services): Der Benennungsdienst für CORBA-Anwendungen. Ermöglicht Anwendungen das Speichern und Zugreifen auf Verweise auf CORBA-Objekte.

  • DNS (Domain Name System): Der Namensdienst des Internets; Ordnet personenfreundliche Namen (wie z. B. www.etcee.com) computerfreundlichen IP-Adressen (Internet Protocol) in Punkt-Vier-Schreibweise (207.69.175.36) zu. Interessanterweise ist DNS ein verteilter Namensdienst, was bedeutet, dass der Dienst und die zugrunde liegende Datenbank auf viele Hosts im Internet verteilt sind.

  • LDAP (Lightweight Directory Access Protocol): Entwickelt von der University of Michigan; Wie der Name schon sagt, handelt es sich um eine leichtgewichtige Version von DAP (Directory Access Protocol), das wiederum Teil von X.500 ist, einem Standard für Netzwerkverzeichnisdienste. Derzeit unterstützen über 40 Unternehmen LDAP.

  • NIS (Network Information System) und NIS +: Von Sun Microsystems entwickelte Netzwerkbenennungsdienste. Beide ermöglichen Benutzern den Zugriff auf Dateien und Anwendungen auf jedem Host mit einer einzigen ID und einem einzigen Kennwort.

Gemeinsamkeiten

Wie bereits erwähnt, besteht die Hauptfunktion eines Benennungssystems darin, Namen an Objekte zu binden (oder in einigen Fällen an Verweise auf Objekte - mehr dazu gleich). Um ein Namensdienst zu sein, muss ein Dienst zumindest die Möglichkeit bieten, Namen an Objekte zu binden und Objekte nach Namen zu suchen.

Viele Benennungssysteme speichern Objekte nicht direkt. Stattdessen speichern sie Verweise auf Objekte. Betrachten Sie zur Veranschaulichung DNS. Die Adresse 207.69.175.36 bezieht sich auf den Standort eines Computers im Internet, nicht auf den Computer selbst.

JNDI bietet eine Schnittstelle, die all diese allgemeinen Funktionen unterstützt. Ich werde diese Schnittstelle später in diesem Artikel vorstellen.

Ihre Unterschiede

Es ist auch wichtig zu verstehen, wie sich vorhandene Namensdienste unterscheiden, da JNDI eine funktionsfähige Abstraktion bereitstellen muss, die diese Unterschiede umgeht.

Abgesehen von funktionalen Unterschieden ist der auffälligste Unterschied die Art und Weise, in der für jeden Namensdienst die Angabe von Namen erforderlich ist - seine Namenskonvention. Einige Beispiele sollen das Problem veranschaulichen.

In DNS werden Namen aus Komponenten erstellt, die durch Punkte (".") Getrennt sind. Sie lesen von rechts nach links. Der Name "www.etcee.com" bezeichnet eine Maschine mit dem Namen "www" in der Domäne "etcee.com". Ebenso benennt der Name "etcee.com" die Domain "etcee" in der Top-Level-Domain "com".

In LDAP ist die Situation etwas komplizierter. Namen werden aus Komponenten erstellt, die durch Kommas (",") getrennt sind. Wie DNS-Namen lesen sie von rechts nach links. Komponenten in einem LDAP-Namen müssen jedoch als Name / Wert-Paare angegeben werden. Der Name "cn = Todd Sundsted, o = ComFrame, c = US" bezeichnet die Person "cn = Todd Sundsted" in der Organisation "o = ComFrame, c = US". Ebenso bezeichnet der Name "o = ComFrame, c = US" die Organisation "o = ComFrame" im Land "c = US".

Wie die obigen Beispiele zeigen, kann allein die Namenskonvention eines Namensdienstes einen erheblichen Teil des Geschmacks des zugrunde liegenden Namensdienstes in JNDI einbringen. Dies ist keine Funktion, die eine implementierungsunabhängige Schnittstelle haben sollte.

JNDI löst dieses Problem mit der NameKlasse und ihren Unterklassen und Hilfsklassen. Die NameKlasse stellt einen Namen dar, der aus einer geordneten Folge von Unternamen besteht, und bietet Methoden zum Arbeiten mit Namen, die vom zugrunde liegenden Namensdienst unabhängig sind.

Ein Blick auf die JNDI-Benennung

Wie oben erwähnt, ist es wichtig, sich daran zu erinnern, dass JNDI eher eine Schnittstelle als eine Implementierung ist. Diese Tatsache hat einige Nachteile: Sie benötigen Zugriff auf einen vorhandenen Namensdienst (z. B. einen LDAP-Dienst) und müssen etwas über die Funktionsweise verstehen, um mit JNDI spielen zu können. Auf der anderen Seite kann JNDI nahtlos in eine vorhandene Computerumgebung integriert werden, in der ein etablierter Namensdienst maßgeblich ist.

JNDI naming revolves around a small set of classes and a handful of operations. Let's take a look at them.

Context and InitialContext

The Context interface plays a central role in JNDI. A context represents a set of bindings within a naming service that all share the same naming convention. A Context object provides the methods for binding names to objects and unbinding names from objects, for renaming objects, and for listing the bindings.

Some naming services also provide subcontext functionality. Much like a directory in a filesystem, a subcontext is a context within a context. This hierarchical structure permits better organization of information. For naming services that support subcontexts, the Context class also provides methods for creating and destroying subcontexts.

JNDI performs all naming operations relative to a context. To assist in finding a place to start, the JNDI specification defines an InitialContext class. This class is instantiated with properties that define the type of naming service in use and, for naming services that provide security, the ID and password to use when connecting.

For those of you familiar with the RMI Naming class, many of the methods provided by the Context interface outlined below will look familiar. Let's take a look at Context's methods:

  • void bind(String stringName, Object object): Binds a name to an object. The name must not be bound to another object. All intermediate contexts must already exist.

  • void rebind(String stringName, Object object): Binds a name to an object. All intermediate contexts must already exist.

  • Object lookup(String stringName): Returns the specified object.

  • void unbind(String stringName): Unbinds the specified object.

The Context interface also provides methods for renaming and listing bindings.

  • void rename(String stringOldName, String stringNewName): Changes the name to which an object is bound.
  • NamingEnumeration listBindings(String stringName): Returns an enumeration containing the names bound to the specified context, along with the objects and the class names of the objects bound to them.

  • NamingEnumeration list(String stringName): Returns an enumeration containing the names bound to the specified context, along with the class names of the objects bound to them.

Each of these methods has a sibling that takes a Name object instead of a String object. A Name object represents a generic name. The Name class allows a program to manipulate names without having to know as much about the specific naming service in use.

The example

The example below illustrates how to connect to a naming service, list all of the bindings, or list a specific binding. It uses the filesystem service provider, which is one of the reference JNDI service-provider implementations provided by Sun. The filesystem service provider makes the filesystem look like a naming service (which it is, in many ways -- filenames like /foo/bar/baz are names and are bound to objects like files and directories). I selected it because everyone has access to a filesystem (as opposed to, say, an LDAP server).

import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.Binding; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import java.util.Hashtable; public class Main { public static void main(String [] rgstring) { try { // Create the initial context. The environment // information specifies the JNDI provider to use // and the initial URL to use (in our case, a // directory in URL form -- file:///...). Hashtable hashtableEnvironment = new Hashtable(); hashtableEnvironment.put( Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory" ); hashtableEnvironment.put( Context.PROVIDER_URL, rgstring[0] ); Context context = new InitialContext(hashtableEnvironment); // If you provide no other command line arguments, // list all of the names in the specified context and // the objects they are bound to. if (rgstring.length == 1) { NamingEnumeration namingenumeration = context.listBindings(""); while (namingenumeration.hasMore()) { Binding binding = (Binding)namingenumeration.next(); System.out.println( binding.getName() + " " + binding.getObject() ); } } // Otherwise, list the names and bindings for the // specified arguments. else { for (int i = 1; i < rgstring.length; i++) { Object object = context.lookup(rgstring[i]); System.out.println( rgstring[i] + " " + object ); } } context.close(); } catch (NamingException namingexception) { namingexception.printStackTrace(); } } } 

The program in the listing above first creates an initial context from the specified JNDI provider (in this case, Sun's filesystem provider) and a URL specifying a local directory. If no additional command-line arguments are specified, the program lists the objects and names of every entity in the specified directory. Otherwise, it lists the objects and names of only those items specified on the command line.

Conclusion

You should now have both an understanding of and an appreciation for naming services in general and JNDI in particular. In distributed environments, they are valuable tools for locating information and resources. JNDI makes it possible to work with a variety of naming services without having to master a multitude of APIs. Next month, we'll take a look at the other half of JNDI -- its directory functions.

Todd Sundsted schreibt Programme, seit Computer in praktischen Desktop-Modellen verfügbar sind. Obwohl Todd ursprünglich daran interessiert war, verteilte Anwendungen in C ++ zu erstellen, wechselte er zur Java-Programmiersprache, als dies die offensichtliche Wahl für solche Dinge wurde. Todd schreibt nicht nur, sondern arbeitet auch als Java-Architekt bei ComFrame Software.

Erfahren Sie mehr über dieses Thema

  • Laden Sie den vollständigen Quellcode für diesen Artikel im Zip-Format herunter

    //images.techhive.com/downloads/idge/imported/article/jvw/2000/01/jw-01-howto.zip

  • Alles JNDI

    //java.sun.com/products/jndi/

  • JNDI-Dokumentation

    //java.sun.com/products/jndi/docs.html

  • Derzeit verfügbare Dienstanbieter

    //java.sun.com/products/jndi/serviceproviders.html

  • Vollständige Auflistung früherer Java- Spalten

    //www.javaworld.com/javaworld/topicalindex/jw-ti-howto.html

Diese Geschichte, "JNDI-Übersicht, Teil 1: Eine Einführung in Namensdienste", wurde ursprünglich von JavaWorld veröffentlicht.