Gambaran keseluruhan JNDI, Bahagian 1: Pengenalan perkhidmatan penamaan

Anda yang pernah berkunjung ke perpustakaan dan masih dapat mengingat pengalamannya mungkin akan mengingati proses mencari buku perpustakaan. Sekiranya anda tidak berhubung dengan pihak kuno anda, keadaan ini akan kelihatan tidak biasa; tetapi sesekali saya bersiar-siar ke perpustakaan tempatan untuk mencari buku yang asli dan luar talian. Perpustakaan dipenuhi dengan beribu-ribu barang - mereka berdebu dan terbuat dari pulpa kayu dan kulit lembu, tetapi mereka menarik dengan cara mereka sendiri. Bagaimanapun, apabila paksaan untuk mencari yang tertentu menyerang, saya mengelakkan jalan naif berjalan ke atas dan ke bawah lorong perpustakaan mencarinya dan beralih ke katalog kad.

TEXTBOX: TEXTBOX_HEAD: Gambaran keseluruhan JNDI: Baca keseluruhan siri!

  • Bahagian 1. Pengenalan perkhidmatan penamaan
  • Bahagian 2. Gunakan perkhidmatan direktori JNDI untuk menguruskan aplikasi yang diedarkan dengan lebih baik

  • Bahagian 3. Gunakan JNDI untuk menyimpan objek aplikasi anda yang diedarkan

  • Bahagian 4. Gabungkan apa yang telah anda pelajari dengan aplikasi berkemampuan JNDI: END_TEXTBOX

Katalog kad, untuk yang belum tahu, memetakan nama buku ke lokasi mereka di perpustakaan. Dengan pergi ke katalog kad terlebih dahulu dan mencari lokasi buku, saya menjimatkan banyak perjalanan. (Secara kebetulan, saya pernah mendengar bahawa beberapa perpustakaan sebenarnya membenarkan pelanggan menggunakan komputer dan bukannya katalog kad. Mereka mendapatnya separuh sekarang - jika mereka memasukkan maklumat dalam buku ke dalam komputer di mana ia berada. ..)

Seperti yang mengejutkan, konsep katalog kad juga berguna dalam dunia pengkomputeran. Dalam pengkomputeran, kami menyebutnya sebagai perkhidmatan penamaan, yang mengaitkan nama dengan lokasi perkhidmatan dan maklumat. Ia menyediakan program komputer dengan satu lokasi di mana mereka dapat mencari sumber yang mereka perlukan. Omong-omong, program tidak membuang-buang waktu dengan melakukan setara elektronik dengan berjalan-jalan di lorong, dan tidak mengharuskan lokasi-lokasi dimasukkan ke dalam logik mereka.

Mencari sumber sangat penting dalam persekitaran perusahaan berskala besar, di mana aplikasi yang anda bina mungkin bergantung pada perkhidmatan yang disediakan oleh aplikasi yang ditulis oleh kumpulan lain di jabatan lain. Infrastruktur penamaan yang dirancang dengan baik menjadikan projek seperti itu dapat dilakukan - dan kekurangannya menjadikannya mustahil. Sebenarnya, banyak usaha rekayasa ulang proses bisnis dimulai dengan desain dan implementasi infrastruktur penamaan dan direktori yang kuat di seluruh perusahaan.

Bulan ini, saya memperkenalkan Java Naming and Directory Interface (JNDI). JNDI menyediakan antara muka penyebut umum untuk banyak perkhidmatan penamaan yang ada. Oleh itu, JNDI tidak dirancang untuk menggantikan teknologi yang ada; sebaliknya, ia menyediakan antara muka umum untuk perkhidmatan penamaan yang ada. Mari kita mulakan dengan melihat beberapa perkhidmatan ini.

Pengenalan kepada perkhidmatan penamaan

Gambar di bawah menggambarkan organisasi perkhidmatan penamaan generik.

Perkhidmatan penamaan mengekalkan satu set ikatan. Ikatan mengaitkan nama dengan objek. Semua objek dalam sistem penamaan dinamakan dengan cara yang sama (iaitu, mereka mengikuti konvensyen penamaan yang sama ). Pelanggan menggunakan perkhidmatan penamaan untuk mencari objek berdasarkan nama.

Terdapat sebilangan perkhidmatan penamaan yang ada, beberapa di antaranya akan saya jelaskan di bawah. Mereka masing-masing mengikuti corak di atas, tetapi berbeza dalam perinciannya.

  • COS (Common Object Services) Penamaan: Perkhidmatan penamaan untuk aplikasi CORBA; membolehkan aplikasi menyimpan dan mengakses rujukan ke objek CORBA.

  • DNS (Sistem Nama Domain): Perkhidmatan penamaan Internet; memetakan nama yang mesra orang (seperti www.etcee.com) ke alamat IP (Internet Protocol) yang mesra komputer dalam notasi titik-empat (207.69.175.36). Menariknya, DNS adalah perkhidmatan penamaan yang diedarkan , yang bermaksud bahawa perkhidmatan dan pangkalan data asasnya tersebar di banyak hos di Internet.

  • LDAP (Protokol Akses Direktori Ringan): Dibangunkan oleh University of Michigan; seperti namanya, itu adalah versi ringan dari DAP (Direktori Protokol Akses), yang pada gilirannya adalah sebahagian dari X.500, standard untuk perkhidmatan direktori rangkaian. Pada masa ini, lebih daripada 40 syarikat menyokong LDAP.

  • NIS (Sistem Maklumat Rangkaian) dan NIS +: Perkhidmatan penamaan rangkaian yang dikembangkan oleh Sun Microsystems. Kedua-duanya membolehkan pengguna mengakses fail dan aplikasi di mana-mana host dengan satu ID dan kata laluan.

Ciri-ciri biasa

Seperti yang saya sebutkan sebelumnya, fungsi utama sistem penamaan adalah untuk mengikat nama ke objek (atau, dalam beberapa kes, merujuk kepada objek - lebih banyak lagi dalam sekejap). Untuk menjadi perkhidmatan penamaan, perkhidmatan harus sekurang-kurangnya memberikan kemampuan untuk mengikat nama ke objek dan mencari objek dengan nama.

Banyak sistem penamaan tidak menyimpan objek secara langsung. Sebaliknya, mereka menyimpan rujukan ke objek. Sebagai gambaran, pertimbangkan DNS. Alamat 207.69.175.36 adalah rujukan ke lokasi komputer di Internet, bukan komputer itu sendiri.

JNDI menyediakan antara muka yang menyokong semua fungsi biasa ini. Saya akan membentangkan antara muka ini kemudian dalam artikel ini.

Perbezaan mereka

Penting juga untuk memahami bagaimana perkhidmatan penamaan yang ada berbeza, kerana JNDI mesti memberikan abstraksi yang dapat dilaksanakan yang mengatasi perbezaan tersebut.

Selain perbezaan fungsi, perbezaan yang paling ketara adalah cara setiap perkhidmatan penamaan memerlukan nama ditentukan - konvensyen penamaannya. Beberapa contoh harus menggambarkan masalahnya.

Dalam DNS, nama dibina dari komponen yang dipisahkan dengan titik ("."). Mereka membaca dari kanan ke kiri. Nama "www.etcee.com" menamakan mesin yang disebut "www" dalam domain "etcee.com". Begitu juga, nama "etcee.com" menamakan domain "etcee" di domain tingkat atas "com."

Dalam LDAP, keadaannya sedikit lebih rumit. Nama dibina dari komponen yang dipisahkan dengan koma (","). Seperti nama DNS, mereka membaca dari kanan ke kiri. Walau bagaimanapun, komponen dalam nama LDAP mesti ditentukan sebagai pasangan nama / nilai. Nama "cn = Todd Sundsted, o = ComFrame, c = US" menamakan orang "cn = Todd Sundsted" dalam organisasi "o = ComFrame, c = US." Begitu juga, nama "o = ComFrame, c = US" menamakan organisasi "o = ComFrame" di negara ini "c = US."

Seperti contoh di atas, konvensyen penamaan perkhidmatan penamaan sahaja berpotensi untuk memperkenalkan sejumlah besar rasa perkhidmatan penamaan yang mendasari ke dalam JNDI. Ini bukan ciri yang harus dimiliki oleh antara muka pelaksanaan yang bebas.

JNDI menyelesaikan masalah ini dengan Namekelas dan subkelasnya dan kelas pembantu. The Namekelas mewakili nama terdiri daripada satu urutan mengarahkan subnames, dan menyediakan kaedah untuk bekerja dengan nama-nama bebas daripada perkhidmatan penamaan asas.

Pandangan mengenai penamaan JNDI

Seperti yang saya nyatakan di atas, penting untuk diingat bahawa JNDI adalah antara muka dan bukannya pelaksanaan. Fakta ini mempunyai beberapa kelemahan - anda memerlukan akses ke perkhidmatan penamaan yang ada (seperti perkhidmatan LDAP) dan anda perlu memahami sesuatu tentang bagaimana ia berfungsi untuk bermain dengan JNDI. Di sisi lain, ia membenarkan JNDI untuk menyatu dengan lancar ke persekitaran pengkomputeran yang ada di mana perkhidmatan penamaan yang mapan memegang pengaruh.

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 telah menulis program sejak komputer tersedia dalam model desktop yang mudah digunakan. Walaupun pada awalnya berminat untuk membangun aplikasi yang diedarkan dalam C ++, Todd beralih ke bahasa pengaturcaraan Java ketika menjadi pilihan yang jelas untuk perkara semacam itu. Selain menulis, Todd juga bekerja sebagai arkitek Java dengan ComFrame Software.

Ketahui lebih lanjut mengenai topik ini

  • Muat turun kod sumber lengkap untuk artikel ini, dalam format zip

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

  • Semua perkara JNDI

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

  • Dokumentasi JNDI

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

  • Pembekal perkhidmatan kini tersedia

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

  • Senarai penuh lajur How-To Java sebelumnya

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

Kisah ini, "Gambaran keseluruhan JNDI, Bahagian 1: Pengenalan kepada perkhidmatan penamaan" awalnya diterbitkan oleh JavaWorld.