Panoramica JNDI, Parte 1: Introduzione ai servizi di denominazione

Quelli di voi che sono stati in una biblioteca e possono ancora ricordare l'esperienza potrebbero ricordare il processo di individuazione di un libro della biblioteca. Se non sei in contatto con il tuo lato antiquario, questa situazione ti sembrerà poco familiare; ma ogni tanto vado in una biblioteca locale per cercare un libro autentico e offline. Le biblioteche sono piene di migliaia di cose: sono polverose e fatte di pasta di legno e pelle di mucca, ma sono affascinanti a modo loro. In ogni caso, quando mi colpisce la compulsione a trovarne uno, evito il corso ingenuo di camminare su e giù per i corridoi della biblioteca cercandolo e mi rivolgo invece al catalogo delle carte.

TEXTBOX: TEXTBOX_HEAD: Panoramica JNDI: leggi l'intera serie!

  • Parte 1. Introduzione ai servizi di denominazione
  • Parte 2. Utilizzare i servizi di directory JNDI per gestire meglio le applicazioni distribuite

  • Parte 3. Utilizzare JNDI per memorizzare gli oggetti dell'applicazione distribuita

  • Parte 4. Metti insieme ciò che hai imparato con un'applicazione abilitata per JNDI: END_TEXTBOX

Un catalogo a schede, per chi non lo sapesse, mappa i nomi dei libri nella loro posizione nella biblioteca. Andando prima al catalogo delle carte e cercando la posizione del libro, mi risparmio una notevole quantità di cammino. (Per inciso, ho sentito che alcune biblioteche consentono effettivamente agli utenti di utilizzare i computer invece del catalogo a schede. Hanno capito bene a metà - ora se inseriscono le informazioni nei libri nel computer a cui appartengono. ..)

Per quanto sorprendente possa sembrare, la nozione di catalogo di schede è molto utile anche nel mondo dei computer. In informatica, lo chiamiamo un servizio di denominazione, che associa i nomi alle posizioni dei servizi e alle informazioni. Fornisce ai programmi per computer un'unica posizione in cui possono trovare le risorse di cui hanno bisogno. A proposito, i programmi non perdono tempo eseguendo l'equivalente elettronico di camminare su e giù per i corridoi, e non richiedono nemmeno che le posizioni siano codificate nella loro logica.

La ricerca di risorse è di particolare importanza negli ambienti aziendali su larga scala, in cui le applicazioni create possono dipendere dai servizi forniti da applicazioni scritte da altri gruppi in altri reparti. Un'infrastruttura di denominazione ben progettata rende possibili tali progetti e la mancanza di uno li rende impossibili. In effetti, molti sforzi di reingegnerizzazione dei processi aziendali iniziano con la progettazione e l'implementazione di una robusta infrastruttura di denominazione e directory a livello aziendale.

Questo mese, presento Java Naming and Directory Interface (JNDI). JNDI fornisce un'interfaccia comune denominatore a molti servizi di denominazione esistenti. In quanto tale, JNDI non è stato progettato per sostituire la tecnologia esistente; fornisce invece un'interfaccia comune ai servizi di denominazione esistenti. Cominciamo dando uno sguardo ad alcuni di questi servizi.

Un'introduzione ai servizi di denominazione

La figura seguente mostra l'organizzazione di un generico servizio di denominazione.

Un servizio di denominazione mantiene una serie di associazioni. I binding mettono in relazione i nomi con gli oggetti. Tutti gli oggetti in un sistema di denominazione vengono denominati allo stesso modo (ovvero sottoscrivono la stessa convenzione di denominazione ). I client utilizzano il servizio di denominazione per individuare gli oggetti in base al nome.

Esistono numerosi servizi di denominazione esistenti, alcuni dei quali verranno descritti di seguito. Ciascuno segue lo schema sopra, ma differisce nei dettagli.

  • Denominazione COS (Common Object Services): il servizio di denominazione per le applicazioni CORBA; consente alle applicazioni di memorizzare e accedere ai riferimenti agli oggetti CORBA.

  • DNS (Domain Name System): il servizio di denominazione di Internet; mappa i nomi amichevoli (come www.etcee.com) in indirizzi IP (Internet Protocol) compatibili con i computer in notazione quadrupla punti (207.69.175.36). È interessante notare che DNS è un servizio di denominazione distribuito , il che significa che il servizio e il database sottostante sono distribuiti su molti host su Internet.

  • LDAP (Lightweight Directory Access Protocol): sviluppato dall'Università del Michigan; come suggerisce il nome, è una versione leggera di DAP (Directory Access Protocol), che a sua volta fa parte di X.500, uno standard per i servizi di directory di rete. Attualmente, oltre 40 aziende sostengono LDAP.

  • NIS (Network Information System) e NIS +: servizi di denominazione di rete sviluppati da Sun Microsystems. Entrambi consentono agli utenti di accedere a file e applicazioni su qualsiasi host con un unico ID e password.

Caratteristiche comuni

Come ho accennato in precedenza, la funzione principale di un sistema di denominazione è quella di legare i nomi agli oggetti (o, in alcuni casi, ai riferimenti agli oggetti - più su questo in un momento). Per essere un servizio di denominazione, un servizio deve almeno fornire la capacità di associare nomi a oggetti e di cercare oggetti per nome.

Molti sistemi di denominazione non memorizzano gli oggetti direttamente. Invece, memorizzano i riferimenti agli oggetti. A titolo illustrativo, considera il DNS. L'indirizzo 207.69.175.36 è un riferimento alla posizione di un computer su Internet, non al computer stesso.

JNDI fornisce un'interfaccia che supporta tutte queste funzionalità comuni. Presenterò questa interfaccia più avanti in questo articolo.

Le loro differenze

È anche importante capire come differiscono i servizi di denominazione esistenti, poiché JNDI deve fornire un'astrazione praticabile che aggiri tali differenze.

A parte le differenze funzionali, la differenza più evidente è il modo in cui ogni servizio di denominazione richiede che i nomi siano specificati - la sua convenzione di denominazione. Alcuni esempi dovrebbero illustrare il problema.

In DNS, i nomi vengono creati da componenti separati da punti ("."). Leggono da destra a sinistra. Il nome "www.etcee.com" indica una macchina chiamata "www" nel dominio "etcee.com". Allo stesso modo, il nome "etcee.com" denomina il dominio "etcee" nel dominio di primo livello "com".

In LDAP, la situazione è leggermente più complicata. I nomi vengono creati da componenti separati da virgole (","). Come i nomi DNS, leggono da destra a sinistra. Tuttavia, i componenti in un nome LDAP devono essere specificati come coppie nome / valore. Il nome "cn = Todd Sundsted, o = ComFrame, c = US" indica la persona "cn = Todd Sundsted" nell'organizzazione "o = ComFrame, c = US". Allo stesso modo, il nome "o = ComFrame, c = US" denomina l'organizzazione "o = ComFrame" nel paese "c = US".

Come illustrano gli esempi precedenti, la convenzione di denominazione di un servizio di denominazione da sola ha il potenziale per introdurre una quantità significativa del sapore del servizio di denominazione sottostante in JNDI. Questa non è una funzionalità che dovrebbe avere un'interfaccia indipendente dall'implementazione.

JNDI risolve questo problema con la Nameclasse e le sue sottoclassi e classi helper. La Nameclasse rappresenta un nome composto da sequenze ordinate di sottonomi e fornisce metodi per lavorare con i nomi indipendentemente dal servizio di denominazione sottostante.

Uno sguardo alla denominazione JNDI

Come ho detto sopra, è importante ricordare che JNDI è un'interfaccia piuttosto che un'implementazione. Questo fatto ha alcuni svantaggi: hai bisogno di accedere a un servizio di denominazione esistente (come un servizio LDAP) e devi capire qualcosa su come funziona per giocare con JNDI. D'altra parte, consente a JNDI di integrarsi perfettamente in un ambiente di elaborazione esistente in cui domina un servizio di denominazione consolidato.

La denominazione JNDI ruota attorno a un piccolo insieme di classi e una manciata di operazioni. Diamo un'occhiata a loro.

Context e InitialContext

L' Contextinterfaccia gioca un ruolo centrale in JNDI. Un contesto rappresenta un insieme di associazioni all'interno di un servizio di denominazione che condividono tutte la stessa convenzione di denominazione. Un Contextoggetto fornisce i metodi per associare i nomi agli oggetti e separare i nomi dagli oggetti, per rinominare gli oggetti e per elencare i collegamenti.

Alcuni servizi di denominazione forniscono anche funzionalità di sottocontesto. Proprio come una directory in un filesystem, un sottocontesto è un contesto all'interno di un contesto. Questa struttura gerarchica consente una migliore organizzazione delle informazioni. Per i servizi di denominazione che supportano i sottocontesti, la Contextclasse fornisce anche metodi per creare e distruggere i sottocontesti.

JNDI esegue tutte le operazioni di denominazione relative a un contesto. Per aiutare a trovare un punto di partenza, la specifica JNDI definisce una InitialContextclasse. Questa classe è istanziata con proprietà che definiscono il tipo di servizio di denominazione in uso e, per i servizi di denominazione che forniscono sicurezza, l'ID e la password da utilizzare durante la connessione.

Per quelli di voi che hanno familiarità con la Namingclasse RMI , molti dei metodi forniti Contextdall'interfaccia descritta di seguito risulteranno familiari. Diamo un'occhiata ai Contextmetodi di:

  • void bind(String stringName, Object object): Associa un nome a un oggetto. Il nome non deve essere associato a un altro oggetto. Tutti i contesti intermedi devono già esistere.

  • void rebind(String stringName, Object object): Associa un nome a un oggetto. Tutti i contesti intermedi devono già esistere.

  • Object lookup(String stringName): Restituisce l'oggetto specificato.

  • void unbind(String stringName): Annulla l'associazione dell'oggetto specificato.

L' Contextinterfaccia fornisce anche metodi per rinominare e elencare le associazioni.

  • void rename(String stringOldName, String stringNewName): Modifica il nome a cui è associato un oggetto.
  • NamingEnumeration listBindings(String stringName): Restituisce un'enumerazione contenente i nomi associati al contesto specificato, insieme agli oggetti e ai nomi delle classi degli oggetti associati a essi.

  • NamingEnumeration list(String stringName): Restituisce un'enumerazione contenente i nomi associati al contesto specificato, insieme ai nomi delle classi degli oggetti ad essi associati.

Ciascuno di questi metodi ha un fratello che accetta un Nameoggetto invece di un Stringoggetto. Un Nameoggetto rappresenta un nome generico. La Nameclasse consente a un programma di manipolare i nomi senza dover conoscere il servizio di denominazione specifico in uso.

L'esempio

L'esempio seguente illustra come connettersi a un servizio di denominazione, elencare tutte le associazioni o elencare un'associazione specifica. Utilizza il provider di servizi del file system, che è una delle implementazioni del provider di servizi JNDI di riferimento fornite da Sun. Il fornitore di servizi del filesystem fa sembrare il filesystem un servizio di denominazione (che è, in molti modi - i nomi di file come /foo/bar/bazsono nomi e sono legati a oggetti come file e directory). L'ho selezionato perché tutti hanno accesso a un filesystem (al contrario, diciamo, di un server LDAP).

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 scrive programmi da quando i computer sono diventati disponibili in comodi modelli desktop. Sebbene inizialmente interessato alla creazione di applicazioni distribuite in C ++, Todd è passato al linguaggio di programmazione Java quando è diventato la scelta più ovvia per quel genere di cose. Oltre a scrivere, Todd lavora anche come architetto Java con ComFrame Software.

Ulteriori informazioni su questo argomento

  • Scarica il codice sorgente completo per questo articolo, in formato zip

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

  • Tutte le cose JNDI

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

  • Documentazione JNDI

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

  • Fornitori di servizi attualmente disponibili

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

  • Elenco completo delle precedenti colonne How-To Java

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

Questa storia, "Panoramica JNDI, parte 1: un'introduzione ai servizi di denominazione" è stata originariamente pubblicata da JavaWorld.