Προγραμματισμός

Επισκόπηση JNDI, Μέρος 1: Εισαγωγή στις υπηρεσίες ονομασίας

Όσοι από εσάς έχετε πάει σε μια βιβλιοθήκη και εξακολουθείτε να θυμάστε την εμπειρία μπορεί να θυμάστε τη διαδικασία εντοπισμού ενός βιβλίου βιβλιοθήκης. Εάν δεν είστε σε επαφή με την αρχαία πλευρά σας, αυτή η κατάσταση θα φαίνεται άγνωστη. αλλά περιστασιακά πηγαίνω σε μια τοπική βιβλιοθήκη για να αναζητήσω ένα γνήσιο βιβλίο χωρίς σύνδεση. Οι βιβλιοθήκες είναι γεμάτες με χιλιάδες πράγματα - είναι σκονισμένα και κατασκευασμένα από ξυλοπολτό και αγελάδα, αλλά είναι συναρπαστικά με τον δικό τους τρόπο. Σε κάθε περίπτωση, όταν χτυπήσει ο εξαναγκασμός να βρω ένα συγκεκριμένο, αποφεύγω την αφελής πορεία να περπατάω πάνω και κάτω στους διαδρόμους της βιβλιοθήκης και να στραφώ στον κατάλογο καρτών.

TEXTBOX: TEXTBOX_HEAD: Επισκόπηση JNDI: Διαβάστε ολόκληρη τη σειρά!

  • Μέρος 1. Εισαγωγή στις υπηρεσίες ονομασίας
  • Μέρος 2. Χρησιμοποιήστε τις υπηρεσίες καταλόγου JNDI για να διαχειριστείτε καλύτερα τις κατανεμημένες εφαρμογές σας

  • Μέρος 3. Χρησιμοποιήστε το JNDI για να αποθηκεύσετε τα αντικείμενα της κατανεμημένης εφαρμογής σας

  • Μέρος 4. Συγκεντρώστε ό, τι έχετε μάθει με μια εφαρμογή με δυνατότητα JNDI: END_TEXTBOX

Ένας κατάλογος καρτών, για τους άγνωστους, χαρτογραφεί τα ονόματα των βιβλίων στη θέση τους στη βιβλιοθήκη. Πηγαίνοντας πρώτα στον κατάλογο καρτών και αναζητώντας την τοποθεσία του βιβλίου, σώζω μια σημαντική βόλτα. (Παρεμπιπτόντως, έχω ακούσει ότι ορισμένες βιβλιοθήκες επιτρέπουν πραγματικά στους χρήστες να χρησιμοποιούν υπολογιστές αντί για τον κατάλογο καρτών. Τους έχουν το μισό - τώρα αν θα βάλουν τις πληροφορίες στα βιβλία στον υπολογιστή όπου ανήκει. ..)

Όσο περίεργο και αν φαίνεται, η έννοια ενός καταλόγου καρτών είναι αρκετά βολική και στον κόσμο των υπολογιστών. Στην πληροφορική, το αποκαλούμε α υπηρεσία ονομάτων, που συσχετίζει ονόματα με τις τοποθεσίες των υπηρεσιών και με πληροφορίες. Παρέχει προγράμματα υπολογιστών με μία μόνο τοποθεσία όπου μπορούν να βρουν τους πόρους που χρειάζονται. Παρεμπιπτόντως, τα προγράμματα δεν χάνουν χρόνο εκτελώντας το ηλεκτρονικό ισοδύναμο του περπατήματος πάνω και κάτω από τους διαδρόμους και δεν απαιτούν ούτε οι τοποθεσίες να είναι κωδικοποιημένες στη λογική τους.

Η εύρεση πόρων έχει ιδιαίτερη σημασία σε εταιρικά περιβάλλοντα μεγάλης κλίμακας, όπου οι εφαρμογές που δημιουργείτε μπορεί να εξαρτώνται από υπηρεσίες που παρέχονται από εφαρμογές που έχουν γραφτεί από άλλες ομάδες σε άλλα τμήματα. Μια καλά σχεδιασμένη υποδομή ονομασίας καθιστά δυνατή την υλοποίηση τέτοιων έργων - και η έλλειψη ενός καθιστά αδύνατη. Στην πραγματικότητα, πολλές προσπάθειες ανασχεδιασμού επιχειρηματικών διαδικασιών ξεκινούν με το σχεδιασμό και την εφαρμογή μιας ισχυρής, εταιρικής υποδομής ονομασίας και καταλόγου.

Αυτό το μήνα, παρουσιάζω το Java Naming and Directory Interface (JNDI). Το JNDI παρέχει μια διεπαφή κοινού παρονομαστή σε πολλές υπάρχουσες υπηρεσίες ονομασίας. Ως εκ τούτου, το JNDI δεν σχεδιάστηκε για να αντικαταστήσει την υπάρχουσα τεχνολογία. Αντ 'αυτού, παρέχει μια κοινή διεπαφή για τις υπάρχουσες υπηρεσίες ονομασίας. Ας ξεκινήσουμε ρίχνοντας μια ματιά σε μερικές από αυτές τις υπηρεσίες.

Εισαγωγή στις υπηρεσίες ονομασίας

Το παρακάτω σχήμα απεικονίζει την οργάνωση μιας υπηρεσίας γενικής ονομασίας.

Μια υπηρεσία ονομασίας διατηρεί ένα σύνολο δεσμεύσεις. Οι δεσμεύσεις συσχετίζουν ονόματα με αντικείμενα. Όλα τα αντικείμενα σε ένα σύστημα ονομάτων ονομάζονται με τον ίδιο τρόπο (δηλαδή, εγγράφονται στο ίδιο σύμβαση ονομασίας). Οι πελάτες χρησιμοποιούν την υπηρεσία ονομασίας για να εντοπίσουν αντικείμενα με το όνομα.

Υπάρχουν αρκετές υπάρχουσες υπηρεσίες ονομασίας, μερικές από τις οποίες θα περιγράψω παρακάτω. Ο καθένας ακολουθεί το παραπάνω μοτίβο, αλλά διαφέρει στις λεπτομέρειες.

  • COS (Κοινές υπηρεσίες αντικειμένων) Ονομασία: Η υπηρεσία ονομάτων για εφαρμογές CORBA. επιτρέπει στις εφαρμογές να αποθηκεύουν και να έχουν πρόσβαση σε αναφορές σε αντικείμενα CORBA.

  • DNS (Σύστημα ονομάτων τομέα): Η υπηρεσία ονομασίας του Διαδικτύου. χαρτογραφεί ονόματα φιλικά προς τον άνθρωπο (όπως το www.etcee.com) σε διευθύνσεις IP φιλικές προς τον υπολογιστή (Internet Protocol) σε σημείωμα με διακεκομμένα τετράγωνα (207.69.175.36). Είναι ενδιαφέρον ότι το DNS είναι ένα διανέμονται υπηρεσία ονομάτων, που σημαίνει ότι η υπηρεσία και η βάση δεδομένων της είναι απλωμένη σε πολλούς κεντρικούς υπολογιστές στο Διαδίκτυο.

  • LDAP (ελαφρύ πρωτόκολλο πρόσβασης καταλόγου): Αναπτύχθηκε από το Πανεπιστήμιο του Μίσιγκαν. Όπως υποδηλώνει το όνομά του, είναι μια ελαφριά έκδοση του DAP (Directory Access Protocol), η οποία με τη σειρά της αποτελεί μέρος του X.500, ένα πρότυπο για υπηρεσίες καταλόγου δικτύου. Επί του παρόντος, περισσότερες από 40 εταιρείες υποστηρίζουν το LDAP.

  • NIS (Σύστημα Πληροφοριών Δικτύου) και NIS +: Υπηρεσίες ονομασίας δικτύου που αναπτύχθηκαν από την Sun Microsystems. Και οι δύο επιτρέπουν στους χρήστες να έχουν πρόσβαση σε αρχεία και εφαρμογές σε οποιονδήποτε κεντρικό υπολογιστή με ένα μόνο αναγνωριστικό και κωδικό πρόσβασης.

Κοινά χαρακτηριστικά

Όπως ανέφερα νωρίτερα, η κύρια λειτουργία ενός συστήματος ονοματοδοσίας είναι να συνδέει τα ονόματα σε αντικείμενα (ή, σε ορισμένες περιπτώσεις, σε αναφορές σε αντικείμενα - περισσότερα για τα οποία σε μια στιγμή). Προκειμένου να είναι μια υπηρεσία ονομασίας, μια υπηρεσία πρέπει τουλάχιστον να παρέχει τη δυνατότητα σύνδεσης των ονομάτων σε αντικείμενα και την αναζήτηση αντικειμένων με το όνομα.

Πολλά συστήματα ονομασίας δεν αποθηκεύουν αντικείμενα απευθείας. Αντ 'αυτού, αποθηκεύουν αναφορές σε αντικείμενα. Ως παράδειγμα, σκεφτείτε το DNS. Η διεύθυνση 207.69.175.36 είναι μια αναφορά στην τοποθεσία ενός υπολογιστή στο Διαδίκτυο και όχι στον ίδιο τον υπολογιστή.

Το JNDI παρέχει μια διεπαφή που υποστηρίζει όλες αυτές τις κοινές λειτουργίες. Θα παρουσιάσω αυτήν τη διεπαφή αργότερα σε αυτό το άρθρο.

Οι διαφορές τους

Είναι επίσης σημαντικό να κατανοήσουμε πώς διαφέρουν οι υπάρχουσες υπηρεσίες ονομασίας, δεδομένου ότι το JNDI πρέπει να παρέχει μια λειτουργική αφαίρεση που ξεπερνά αυτές τις διαφορές.

Εκτός από τις λειτουργικές διαφορές, η πιο αξιοσημείωτη διαφορά είναι ο τρόπος με τον οποίο κάθε υπηρεσία ονοματοδοσίας απαιτεί να προσδιορίζονται ονόματα - η σύμβαση ονομασίας της. Μερικά παραδείγματα πρέπει να δείχνουν το πρόβλημα.

Στο DNS, τα ονόματα δημιουργούνται από στοιχεία που διαχωρίζονται με τελείες ("."). Διαβάζουν από δεξιά προς τα αριστερά. Το όνομα "www.etcee.com" ονομάζει ένα μηχάνημα που ονομάζεται "www" στον τομέα "etcee.com". Ομοίως, το όνομα "etcee.com" ονομάζει τον τομέα "etcee" στον τομέα ανώτατου επιπέδου "com".

Στο LDAP, η κατάσταση είναι ελαφρώς πιο περίπλοκη. Τα ονόματα δημιουργούνται από στοιχεία που διαχωρίζονται με κόμματα (","). Όπως τα ονόματα DNS, διαβάζουν από δεξιά προς τα αριστερά. Ωστόσο, τα στοιχεία σε ένα όνομα LDAP πρέπει να καθοριστούν ως ζεύγη ονόματος / τιμής. Το όνομα "cn = Todd Sundsted, o = ComFrame, c = US" ονομάζει το άτομο "cn = Todd Sundsted" στον οργανισμό "o = ComFrame, c = US." Ομοίως, το όνομα "o = ComFrame, c = US" ονομάζει τον οργανισμό "o = ComFrame" στη χώρα "c = US."

Όπως δείχνουν τα παραπάνω παραδείγματα, η σύμβαση ονοματοδοσίας μιας υπηρεσίας ονοματοδοσίας έχει μόνο τη δυνατότητα να εισαγάγει ένα σημαντικό ποσό της γεύσης της υποκείμενης υπηρεσίας ονομάτων στο JNDI. Αυτό δεν είναι ένα χαρακτηριστικό που πρέπει να έχει μια διεπαφή ανεξάρτητη από την εφαρμογή.

Το JNDI λύνει αυτό το πρόβλημα με το Ονομα τάξη και τις υποκατηγορίες και τάξεις βοηθού. ο Ονομα Το class αντιπροσωπεύει ένα όνομα που αποτελείται από μια σειρά από δευτερεύοντα ονόματα και παρέχει μεθόδους εργασίας με ονόματα ανεξάρτητα από την υποκείμενη υπηρεσία ονομάτων.

Μια ματιά στην ονομασία JNDI

Όπως ανέφερα παραπάνω, είναι σημαντικό να θυμόμαστε ότι το JNDI είναι διεπαφή παρά ένα εκτέλεση. Αυτό το γεγονός έχει μερικά μειονεκτήματα - χρειάζεστε πρόσβαση σε μια υπάρχουσα υπηρεσία ονομάτων (όπως μια υπηρεσία LDAP) και πρέπει να καταλάβετε κάτι για το πώς λειτουργεί για να παίξετε με το JNDI. Από την άλλη πλευρά, επιτρέπει στο JNDI να ενσωματώνεται απρόσκοπτα σε ένα υπάρχον υπολογιστικό περιβάλλον, όπου μια καθιερωμένη υπηρεσία ονομασίας επηρεάζει.

Η ονομασία JNDI περιστρέφεται γύρω από ένα μικρό σύνολο τάξεων και μια χούφτα λειτουργιών. Ας ρίξουμε μια ματιά σε αυτά.

Περιεχόμενο και InitialContext

ο Συμφραζόμενα διεπαφή παίζει κεντρικό ρόλο στο JNDI. Ένα πλαίσιο αντιπροσωπεύει ένα σύνολο δεσμών σε μια υπηρεσία ονομασίας που όλοι μοιράζονται την ίδια σύμβαση ονομασίας. ΕΝΑ Συμφραζόμενα Το αντικείμενο παρέχει τις μεθόδους για τη σύνδεση ονομάτων σε αντικείμενα και την αποσύνδεση ονομάτων από αντικείμενα, για τη μετονομασία αντικειμένων και για την καταχώριση των συνδέσεων.

Ορισμένες υπηρεσίες ονομασίας παρέχουν επίσης λειτουργικότητα υποκειμένου. Μοιάζει πολύ με έναν κατάλογο σε ένα σύστημα αρχείων, ένα δευτερεύον πλαίσιο είναι ένα πλαίσιο μέσα σε ένα περιβάλλον. Αυτή η ιεραρχική δομή επιτρέπει την καλύτερη οργάνωση των πληροφοριών. Για υπηρεσίες ονομασίας που υποστηρίζουν υπο-περιεχόμενα, το Συμφραζόμενα Η κλάση παρέχει επίσης μεθόδους για τη δημιουργία και την καταστροφή υπο-κειμένων.

Το JNDI εκτελεί όλες τις λειτουργίες ονομασίας σε σχέση με ένα περιβάλλον. Για να βοηθήσετε στην εύρεση ενός μέρους για να ξεκινήσετε, η προδιαγραφή JNDI ορίζει ένα InitialContext τάξη. Αυτή η τάξη δημιουργείται με ιδιότητες που καθορίζουν τον τύπο της υπηρεσίας ονομασίας που χρησιμοποιείται και, για την ονομασία υπηρεσιών που παρέχουν ασφάλεια, το αναγνωριστικό και τον κωδικό πρόσβασης για χρήση κατά τη σύνδεση.

Για όσους από εσάς είστε εξοικειωμένοι με το RMI Ονομασία τάξη, πολλές από τις μεθόδους που παρέχονται από το Συμφραζόμενα διεπαφή που περιγράφεται παρακάτω θα φαίνεται οικεία. Ας ρίξουμε μια ματιά ΣυμφραζόμεναΟι μέθοδοι:

  • void bind (String stringName, αντικείμενο αντικειμένου): Δεσμεύει ένα όνομα σε ένα αντικείμενο. Το όνομα δεν πρέπει να συνδέεται με άλλο αντικείμενο. Όλα τα ενδιάμεσα περιβάλλοντα πρέπει να υπάρχουν ήδη.

  • void rebind (String stringName, αντικείμενο αντικειμένου): Δεσμεύει ένα όνομα σε ένα αντικείμενο. Όλα τα ενδιάμεσα περιβάλλοντα πρέπει να υπάρχουν ήδη.

  • Αναζήτηση αντικειμένων (String stringName): Επιστρέφει το καθορισμένο αντικείμενο.

  • void unbind (συμβολοσειρά string name): Αποσυνδέει το καθορισμένο αντικείμενο.

ο Συμφραζόμενα Η διεπαφή παρέχει επίσης μεθόδους για μετονομασία και καταχώριση συνδέσμων.

  • άκυρη μετονομασία (String stringOldName, String stringNewName): Αλλάζει το όνομα στο οποίο είναι δεσμευμένο ένα αντικείμενο.
  • NamingEnumeration listBindings (String stringName): Επιστρέφει μια απαρίθμηση που περιέχει τα ονόματα που είναι δεσμευμένα στο καθορισμένο περιβάλλον, μαζί με τα αντικείμενα και τα ονόματα κλάσης των αντικειμένων που συνδέονται με αυτά.

  • Λίστα NamingEnumeration (String stringName): Επιστρέφει μια απαρίθμηση που περιέχει τα ονόματα που είναι δεσμευμένα στο καθορισμένο περιβάλλον, μαζί με τα ονόματα κλάσης των αντικειμένων που συνδέονται με αυτά.

Κάθε μία από αυτές τις μεθόδους έχει έναν αδελφό που παίρνει ένα Ονομα αντικείμενο αντί για Σειρά αντικείμενο. ΕΝΑ Ονομα αντικείμενο αντιπροσωπεύει ένα γενικό όνομα. ο Ονομα Το class επιτρέπει σε ένα πρόγραμμα να χειραγωγεί ονόματα χωρίς να χρειάζεται να γνωρίζει πολλά για τη συγκεκριμένη υπηρεσία ονομάτων που χρησιμοποιείται.

Το παράδειγμα

Το παρακάτω παράδειγμα δείχνει πώς μπορείτε να συνδεθείτε σε μια υπηρεσία ονομάτων, να απαριθμήσετε όλες τις συνδέσεις ή να απαριθμήσετε μια συγκεκριμένη δέσμευση. Χρησιμοποιεί τον πάροχο υπηρεσιών συστήματος αρχείων, ο οποίος είναι μία από τις υλοποιήσεις παροχής υπηρεσιών JNDI που παρέχονται από την Sun. Ο πάροχος υπηρεσιών συστήματος αρχείων κάνει το σύστημα αρχείων να μοιάζει με μια υπηρεσία ονομάτων (η οποία είναι, με πολλούς τρόπους - ονόματα αρχείων όπως / foo / bar / baz είναι ονόματα και συνδέονται με αντικείμενα όπως αρχεία και καταλόγους). Το επέλεξα γιατί όλοι έχουν πρόσβαση σε ένα σύστημα αρχείων (σε αντίθεση, ας πούμε, έναν διακομιστή LDAP).

εισαγωγή javax.naming.Context; εισαγωγή javax.naming.InitialContext; εισαγωγή javax.naming.Binding; εισαγωγή javax.naming.NamingEnumeration; εισαγωγή javax.naming.NamingException; εισαγωγή java.util.Hashtable; δημόσια τάξη Main {public static void main (String [] rgstring) {try {// Δημιουργήστε το αρχικό περιβάλλον. Το περιβάλλον // πληροφορίες καθορίζει τον πάροχο JNDI για χρήση // και την αρχική διεύθυνση URL που θα χρησιμοποιηθεί (στην περίπτωσή μας, έναν κατάλογο // σε μορφή URL - αρχείο: /// ...). Hashtable hashtableEnvironment = νέο Hashtable (); hashtableEnvironment.put (Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); hashtableEnvironment.put (Context.PROVIDER_URL, rgstring [0]); Περιεχόμενο περιβάλλοντος = νέο InitialContext (hashtableEnvironment); // Εάν δεν παρέχετε άλλα ορίσματα γραμμής εντολών, // απαριθμήστε όλα τα ονόματα στο καθορισμένο περιβάλλον και // τα αντικείμενα στα οποία δεσμεύονται. if (rgstring.length == 1) {NamingEnumeration namingenumeration = konteks.listBindings (""); while (namingenumeration.hasMore ()) {Binding binding = (Binding) namingenumeration.next (); System.out.println (binding.getName () + "" + binding.getObject ()); }} // Διαφορετικά, παραθέστε τα ονόματα και τις δεσμεύσεις για τα // καθορισμένα ορίσματα. αλλιώς {για (int i = 1; i <rgstring.length; i ++) {Object αντικείμενο = konteks.lookup (rgstring [i]); System.out.println (rgstring [i] + "" + αντικείμενο); }} konteks.close (); } catch (NamingException namingexception) {namingexception.printStackTrace (); }}} 

Το πρόγραμμα στην παραπάνω λίστα δημιουργεί πρώτα ένα αρχικό πλαίσιο από τον καθορισμένο πάροχο JNDI (σε αυτήν την περίπτωση, τον πάροχο συστήματος αρχείων της Sun) και μια διεύθυνση URL που καθορίζει έναν τοπικό κατάλογο. Εάν δεν έχουν καθοριστεί πρόσθετα ορίσματα γραμμής εντολών, το πρόγραμμα παραθέτει τα αντικείμενα και τα ονόματα κάθε οντότητας στον καθορισμένο κατάλογο. Διαφορετικά, παραθέτει τα αντικείμενα και τα ονόματα μόνο εκείνων των στοιχείων που καθορίζονται στη γραμμή εντολών.

συμπέρασμα

Τώρα θα πρέπει να έχετε τόσο κατανόηση όσο και εκτίμηση για την ονομασία υπηρεσιών γενικά και ειδικότερα το JNDI. Σε κατανεμημένα περιβάλλοντα, είναι πολύτιμα εργαλεία για τον εντοπισμό πληροφοριών και πόρων. Το JNDI καθιστά δυνατή τη συνεργασία με μια ποικιλία υπηρεσιών ονομασίας χωρίς να χρειάζεται να αποκτήσετε πολλά API. Τον επόμενο μήνα, θα ρίξουμε μια ματιά στο άλλο μισό του JNDI - τις λειτουργίες του καταλόγου.

Ο Todd Sundsted γράφει προγράμματα από τότε που οι υπολογιστές έγιναν διαθέσιμοι σε βολικά μοντέλα επιτραπέζιων υπολογιστών. Αν και αρχικά ενδιαφερόταν για την κατασκευή κατανεμημένων εφαρμογών στο C ++, ο Todd προχώρησε στη γλώσσα προγραμματισμού Java όταν έγινε η προφανής επιλογή για κάτι τέτοιο. Εκτός από το γράψιμο, ο Todd εργάζεται επίσης ως αρχιτέκτονας Java με το λογισμικό ComFrame.

Μάθετε περισσότερα σχετικά με αυτό το θέμα

  • Κατεβάστε τον πλήρη πηγαίο κώδικα για αυτό το άρθρο, σε μορφή zip

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

  • Όλα τα πράγματα JNDI

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

  • Τεκμηρίωση JNDI

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

  • Οι πάροχοι υπηρεσιών είναι διαθέσιμοι αυτήν τη στιγμή

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

  • Πλήρης λίστα προηγούμενων How-To Java στήλες

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

Αυτή η ιστορία, "Επισκόπηση JNDI, Μέρος 1: Μια εισαγωγή στις υπηρεσίες ονομασίας" δημοσιεύθηκε αρχικά από την JavaWorld.