Ohjelmointi

JNDI: n yleiskatsaus, osa 1: Johdanto nimipalveluihin

Ne teistä, jotka olette käyneet kirjastossa ja muistatte vielä kokemuksen, saattavat muistuttaa kirjastokirjan löytämisprosessia. Jos et ole yhteydessä antikvaariseen puoleen, tämä tilanne tuntuu tuntemattomalta; mutta silloin tällöin lähden paikallisesta kirjastosta etsimään aitoa, offline-kirjaa. Kirjastot ovat täynnä tuhansia asioita - ne ovat pölyisiä, puumassasta ja lehmännahoista, mutta kiehtovia omalla tavallaan. Joka tapauksessa, kun pakko löytää tietty henkilö iskee, vältän naiivia kulkemista kirjaston käytävillä ylös ja alas etsimällä sitä ja käännyn sen sijaan korttiluetteloon.

TEXTBOX: TEXTBOX_HEAD: JNDI -yleiskatsaus: Lue koko sarja!

  • Osa 1. Johdanto nimipalveluihin
  • Osa 2. Käytä JNDI-hakemistopalveluja hallitaksesi paremmin hajautettuja sovelluksiasi

  • Osa 3. Käytä JNDI: tä tallentaaksesi hajautetun sovelluksesi objektit

  • Osa 4. Yhdistä oppimasi JNDI-yhteensopivalla sovelluksella: END_TEXTBOX

Korttiluettelo aloittelijoille kartoittaa kirjojen nimet niiden sijainnille kirjastossa. Menemällä ensin korttiluetteloon ja etsimällä kirjan sijainnin säästän itselleni huomattavan määrän kävelyä. (Muuten, olen kuullut, että jotkut kirjastot todella antavat suojelijoille mahdollisuuden käyttää tietokoneita korttiluettelon sijaan. Heillä on se puoliksi - nyt, jos he vain asettavat kirjojen tiedot tietokoneeseen, johon se kuuluu. ..)

Niin yllättävältä kuin se saattaakin tuntua, korttiluettelon käsite on melko kätevä myös tietojenkäsittelymaailmassa. Laskennassa kutsumme sitä a nimeämispalvelu joka yhdistää nimet palvelujen sijainteihin ja tietoihin. Se tarjoaa tietokoneohjelmille yhden sijainnin, josta he voivat löytää tarvitsemansa resurssit. Tavallaan ohjelmat eivät tuhlaa aikaa suorittamalla elektronisen vastaavuuden kävelemällä käytävillä ylöspäin ja alaspäin, eivätkä ne myöskään vaadi, että sijainnit koodataan kovasti niiden logiikkaan.

Resurssien löytäminen on erityisen tärkeää suurissa yritysympäristöissä, joissa rakentamasi sovellukset voivat riippua muiden osastojen muiden ryhmien kirjoittamien sovellusten tarjoamista palveluista. Hyvin suunniteltu nimeämisinfrastruktuuri mahdollistaa tällaiset projektit - ja yhden puuttuminen tekee niistä mahdotonta. Itse asiassa monet liiketoimintaprosessien uudelleensuunnittelupyrkimykset alkavat vankan, koko yrityksen kattavan nimeämis- ja hakemistoinfrastruktuurin suunnittelusta ja toteuttamisesta.

Tässä kuussa esitän Java Naming and Directory Interface (JNDI) -palvelun. JNDI tarjoaa yhteisen nimittäjärajapinnan monille olemassa oleville nimeämispalveluille. Sellaisena JNDI: tä ei ole suunniteltu korvaamaan nykyistä tekniikkaa; sen sijaan se tarjoaa yhteisen käyttöliittymän olemassa oleville nimeämispalveluille. Aloitetaan katsomalla joitain näistä palveluista.

Johdanto nimipalveluihin

Alla oleva kuva kuvaa yleisen nimeämispalvelun organisaatiota.

Nimipalvelu ylläpitää joukkoa siteet. Sidokset liittyvät nimiin esineisiin. Kaikki nimijärjestelmän objektit nimetään samalla tavalla (eli ne tilaavat saman nimeämiskäytäntö). Asiakkaat etsivät objekteja nimen perusteella nimipalvelun avulla.

On olemassa useita olemassa olevia nimeämispalveluja, joista muutamia kuvaan alla. Ne seuraavat kukin yllä olevaa mallia, mutta eroavat toisistaan ​​yksityiskohdissa.

  • COS: n (Common Object Services) nimeäminen: CORBA-sovellusten nimipalvelu; sallii sovellusten tallentaa ja käyttää viitteitä CORBA-objekteihin.

  • DNS (verkkotunnusjärjestelmä): Internetin nimipalvelu; kartoittaa ihmisystävälliset nimet (kuten www.etcee.com) tietokoneystävällisiksi IP (Internet Protocol) -osoitteiksi pisteviivalla (207.69.175.36). Mielenkiintoista on, että DNS on hajautettu nimipalvelu, mikä tarkoittaa, että palvelu ja sen taustalla oleva tietokanta ovat levinneet moniin Internet-isäntiin.

  • LDAP (Lightweight Directory Access Protocol): Kehittänyt Michiganin yliopisto; kuten nimestään käy ilmi, se on kevyt versio DAP: stä (Directory Access Protocol), joka puolestaan ​​on osa verkkohakemistopalvelujen standardia X.500. Tällä hetkellä yli 40 yritystä tukee LDAP: tä.

  • NIS (verkkotietojärjestelmä) ja NIS +: Sun Microsystemsin kehittämät verkon nimeämispalvelut. Molemmat sallivat käyttäjien käyttää minkä tahansa isännän tiedostoja ja sovelluksia yhdellä tunnuksella ja salasanalla.

Yleiset piirteet

Kuten aiemmin mainitsin, nimijärjestelmän ensisijainen tehtävä on sitoa nimet esineisiin (tai joissakin tapauksissa viittauksiin esineisiin - enemmänkin hetkessä). Ollakseen nimipalvelu, palvelun on ainakin tarjottava kyky sitoa nimiä esineisiin ja etsiä esineitä nimittäin.

Monet nimeämisjärjestelmät eivät tallenna esineitä suoraan. Sen sijaan ne tallentavat viittauksia esineisiin. Harkitse esimerkkinä DNS. Osoite 207.69.175.36 viittaa tietokoneen sijaintiin Internetissä, ei itse tietokoneeseen.

JNDI tarjoaa käyttöliittymän, joka tukee kaikkia näitä yleisiä toimintoja. Esittelen tämän käyttöliittymän myöhemmin tässä artikkelissa.

Niiden erot

On myös tärkeää ymmärtää, miten nykyiset nimeämispalvelut eroavat toisistaan, koska JNDI: n on tarjottava toimiva abstraktio, joka kiertää nämä erot.

Toiminnallisten erojen lisäksi merkittävin ero on tapa, jolla kukin nimipalvelu vaatii nimien määrittämistä - sen nimeämiskäytäntö. Muutaman esimerkin tulisi havainnollistaa ongelmaa.

DNS: ssä nimet rakennetaan komponenteista, jotka on erotettu pisteillä ("."). He lukevat oikealta vasemmalle. Nimi "www.etcee.com" nimeää koneen nimeltä "www" verkkotunnuksessa "etcee.com". Samoin nimi "etcee.com" nimeää verkkotunnuksen "etcee" ylätason verkkotunnuksessa "com".

LDAP: ssä tilanne on hieman monimutkaisempi. Nimet on rakennettu komponenteista, jotka on erotettu pilkuilla (","). Kuten DNS-nimet, he lukevat oikealta vasemmalle. LDAP-nimen komponentit on kuitenkin määritettävä nimi / arvo-pareiksi. Nimi "cn = Todd Sundsted, o = ComFrame, c = US" nimeää henkilön "cn = Todd Sundsted" organisaatiossa "o = ComFrame, c = US". Samoin nimi "o = ComFrame, c = US" nimeää organisaation "o = ComFrame" maassa "c = US".

Kuten yllä olevat esimerkit havainnollistavat, pelkästään nimipalvelun nimeämiskäytännöllä on mahdollisuus tuoda merkittävä määrä taustalla olevan nimipalvelun makua JNDI: hen. Tämä ei ole ominaisuus, jonka toteutusriippumattoman käyttöliittymän pitäisi olla.

JNDI ratkaisee tämän ongelman Nimi luokka ja sen alaluokat sekä auttajaluokat. Nimi class edustaa nimeä, joka koostuu järjestetyistä alanimijärjestyksistä, ja tarjoaa menetelmiä nimien käsittelyyn riippumatta alla olevasta nimipalvelusta.

Katsaus JNDI-nimeämiseen

Kuten edellä mainitsin, on tärkeää muistaa, että JNDI on käyttöliittymä pikemminkin kuin toteutus. Tällä tosiasialla on joitain haittoja - tarvitset pääsyn olemassa olevaan nimeämispalveluun (kuten LDAP-palvelu) ja sinun on ymmärrettävä jotain sen toiminnasta pelataksesi JNDI: n kanssa. Toisaalta se antaa JNDI: lle mahdollisuuden integroitua saumattomasti olemassa olevaan tietojenkäsittelyympäristöön, jossa vakiintunut nimeämispalvelu pysyy vauhdissa.

JNDI-nimeäminen pyörii pienen luokkaryhmän ja kourallisen toimintojen ympärillä. Katsotaanpa heitä.

Konteksti ja InitialContext

Asiayhteys käyttöliittymällä on keskeinen rooli JNDI: ssä. Konteksti edustaa joukkoa sidontoja nimipalvelussa, joilla kaikilla on sama nimeämiskäytäntö. A Asiayhteys object tarjoaa menetelmät nimien sitomiseksi kohteisiin ja nimien irrotuksen objekteista, objektien uudelleennimeämiseksi ja sidosten luetteloimiseksi.

Jotkut nimeämispalvelut tarjoavat myös alikontekstitoimintoja. Aivan kuten tiedostojärjestelmän hakemisto, alikonteksti on konteksti kontekstissa. Tämä hierarkkinen rakenne mahdollistaa tiedon paremman organisoinnin. Jos haluat nimetä palveluita, jotka tukevat alikonteksteja, Asiayhteys luokka tarjoaa myös menetelmiä alakontekstien luomiseen ja tuhoamiseen.

JNDI suorittaa kaikki nimeämistoimet suhteessa kontekstiin. Aloittamispaikan löytämiseksi JNDI-määrittely määrittelee InitialContext luokassa. Tämä luokka muodostetaan ominaisuuksista, jotka määrittelevät käytetyn nimeämispalvelun tyypin ja turvallisuutta tarjoavien nimipalvelujen yhteydessä tunnuksen ja salasanan, joita käytetään muodostettaessa yhteyttä.

Niille teistä, jotka tuntevat RMI: n Nimeäminen luokassa, monet Asiayhteys alla kuvattu käyttöliittymä näyttää tutulta. Katsotaanpa Asiayhteysmenetelmät:

  • void bind (String stringName, Object-objekti): Sitoo objektille nimen. Nimi ei saa olla sidottu toiseen objektiin. Kaikkien välikontekstien on jo oltava olemassa.

  • void rebind (String stringName, Object-objekti): Sitoo objektille nimen. Kaikkien välikontekstien on jo oltava olemassa.

  • Objektihaku (String stringName): Palauttaa määritetyn objektin.

  • void unbind (String stringName): Poistaa määritetyn objektin.

Asiayhteys käyttöliittymä tarjoaa myös menetelmiä sidosten uudelleennimeämiselle ja luetteloimiselle.

  • void rename (String stringOldName, String stringNewName): Muuttaa nimen, johon objekti on sidottu.
  • NamingEnumeration listBindings (String stringName): Palauttaa luettelon, joka sisältää määritettyyn kontekstiin sidotut nimet, objektien ja niihin sidottujen objektien luokkien nimet.

  • NamingEnumeration-luettelo (String stringName): Palauttaa luettelon, joka sisältää määritettyyn kontekstiin sidotut nimet sekä niihin sidottujen objektien luokkien nimet.

Jokaisella näistä menetelmistä on sisar, joka ottaa a Nimi esine a. sijasta Merkkijono esine. A Nimi object edustaa yleistä nimeä. Nimi luokka sallii ohjelman manipuloida nimiä tarvitsematta tietää niin paljon käytössä olevasta nimenomaisesta palvelusta.

Esimerkki

Alla oleva esimerkki kuvaa yhteyden muodostamista nimipalveluun, kaikkien sidosten luetteloa tai tietyn sidoksen luetteloa. Se käyttää tiedostojärjestelmän palveluntarjoajaa, joka on yksi Sunin toimittamista JNDI-palveluntarjoajien viitetoteutuksista. Tiedostojärjestelmän palveluntarjoaja tekee tiedostojärjestelmästä näyttävän nimipalvelulta (joka se on monin tavoin - tiedostonimet kuten / foo / bar / baz ovat nimiä ja sidottu esineisiin, kuten tiedostoihin ja hakemistoihin). Valitsin sen, koska kaikilla on pääsy tiedostojärjestelmään (toisin kuin esimerkiksi LDAP-palvelin).

tuo javax.naming.Context; tuo javax.naming.InitialContext; tuo javax.naming.Binding; tuo javax.naming.NamingEnumeration; tuo javax.naming.NamingException; tuo java.util.Hashtable; public class Main {public static void main (String [] rgstring) {yritä {// Luo alkuperäinen konteksti. Ympäristö // tiedot määrittelee käytettävän JNDI-palveluntarjoajan ja käytetyn alkuperäisen URL-osoitteen (tapauksessamme // hakemisto URL-muodossa - tiedosto: /// ...). Hashtable hashtableEnvironment = uusi Hashtable (); hashtableEnvironment.put (Konteksti.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); hashtableEnvironment.put (konteksti.PROVIDER_URL, rgstring [0]); Kontekstikonteksti = new InitialContext (hashtableEnvironment); // Jos et anna muita komentoriviargumentteja, // listaa kaikki nimet määritetyssä kontekstissa ja // objektit, joihin ne on sidottu. if (rgstring.length == 1) {NamingEnumeration namingenumeration = context.listBindings (""); while (namingenumeration.hasMore ()) {Binding binding = (Sitova) namingenumeration.next (); System.out.println (bind.getName () + "" + binding.getObject ()); }} // Muussa tapauksessa luetellaan // määritettyjen argumenttien nimet ja sidokset. else {for (int i = 1; i <rgstring.length; i ++) {Object object = context.lookup (rgstring [i]); System.out.println (rgstring [i] + "" + objekti); }} context.close (); } catch (NamingException namingexception) {namingexception.printStackTrace (); }}} 

Yllä olevassa luettelossa oleva ohjelma luo ensin alkuperäisen kontekstin määritetyltä JNDI-palveluntarjoajalta (tässä tapauksessa Sunin tiedostojärjestelmän tarjoajalta) ja URL-osoitteen, joka määrittää paikallisen hakemiston. Jos ylimääräisiä komentoriviargumentteja ei määritetä, ohjelma luetteloi kaikkien määritetyn hakemiston entiteettien objektit ja nimet. Muussa tapauksessa siinä luetellaan vain komentorivillä määritetyt kohteet ja nimet.

Johtopäätös

Sinulla pitäisi nyt olla sekä ymmärrys että arvostus palveluiden nimeämisestä yleensä ja erityisesti JNDI: n nimeämisestä. Hajautetuissa ympäristöissä ne ovat arvokkaita työkaluja tietojen ja resurssien paikantamiseen. JNDI antaa mahdollisuuden työskennellä erilaisten nimeämispalvelujen kanssa ilman, että tarvitsee hallita useita sovellusliittymiä. Ensi kuussa tarkastelemme JNDI: n toista puolta - sen hakemistotoimintoja.

Todd Sundsted on kirjoittanut ohjelmia siitä lähtien, kun tietokoneita tuli saataville sopivissa työpöytämalleissa. Vaikka Todd oli alun perin kiinnostunut hajautettujen sovellusten rakentamisesta C ++ -sovelluksessa, Todd siirtyi Java-ohjelmointikielelle, kun siitä tuli ilmeinen valinta sellaiselle. Kirjoittamisen lisäksi Todd toimii myös Java-arkkitehtina ComFrame-ohjelmiston kanssa.

Lisätietoja tästä aiheesta

  • Lataa tämän artikkelin täydellinen lähdekoodi zip-muodossa

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

  • Kaikki asiat JNDI

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

  • JNDI-dokumentaatio

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

  • Palveluntarjoajat ovat tällä hetkellä käytettävissä

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

  • Täydellinen luettelo edellisistä How-To Java sarakkeita

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

Tämän tarinan "JNDI-yleiskatsaus, osa 1: Johdanto nimipalveluihin" julkaisi alun perin JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found