SOAP服務(wù)的支持者認(rèn)為: ·企業(yè)級應(yīng)用服務(wù)器是服務(wù)(或事務(wù))的集合。 ·可以使用的服務(wù)應(yīng)當(dāng)很方便地列出來供用戶瀏覽、搜索和訪問。 ·象現(xiàn)在的基于組件的開發(fā)模式那樣,將應(yīng)用服務(wù)器設(shè)計為服務(wù)的集合將鼓勵開發(fā)人員采用更好的設(shè)計模式。 ·這些事務(wù)能夠被重新定位、負(fù)載平衡、替代等。 而對SOAP持懷疑態(tài)度的人認(rèn)為,SOAP是推廣CORBA和COM的又一次嘗試。他們指出,要簡單地訪問一個對象,需要完成太多的準(zhǔn)備性工作,而且,UDDI帶來的好處也被夸大了。 那么,到底哪一種觀點更合理呢?對于一些思想開放的人士而言,在決定是否采用SOAP服務(wù)前,他們一定希望了解其中的一些核心技術(shù)。 解密UDDI 我們首先來看看UDDI代表什么?UDDI是Universal 除了黃頁外,UDDI還使用了白頁和綠頁。白頁是企業(yè)實體列表,綠頁是調(diào)用一項服務(wù)所必需的文檔。 UDDI的定義非常全面,足以適應(yīng)不同種類的服務(wù)。一個UDDI服務(wù)定義可能代表一個傳真服務(wù)或電話服務(wù)。作為一種注冊簿,UDDI一般使用數(shù)據(jù)庫一類的軟件來實現(xiàn),在該數(shù)據(jù)庫中,存在一個允許發(fā)布或查詢服務(wù)的有關(guān)信息。 UDDI數(shù)據(jù)模型 UDDI數(shù)據(jù)模型包括下面的主要元素: ·businessEntity:表示一個實際的企業(yè)。 ·businessService:表示一個企業(yè)提供的服務(wù)。 ·bindingTemplate:如何調(diào)用服務(wù)的說明。 ·tModel>: 為了加深對UDDI數(shù)據(jù)模型的理解,我們來看看這些數(shù)據(jù)元素的UML表示法。圖1是這四種主要元素之間的關(guān)系圖: 從上面的圖中我們可以知道,一個businessEntity(一家公司)有一個能夠告訴我們更多有關(guān)公司信息的描述性URL和聯(lián)系人清單,此 外,businessEntity還有一個商業(yè)服務(wù)清單。每種服務(wù)可能有多種調(diào)用方法,每種調(diào)用都由一個綁定模板描述。綁定模板詳細(xì)地描述了如何訪問一個 服務(wù),它受益于一系列描述用戶如何訪問這一服務(wù)的文檔。綁定模板和其必要的文檔之間的聯(lián)系是通過所謂的tModel完成的。在上面的圖中,這種聯(lián)系被簡單 地描述為一個綁定模板有許多tModels。在進一步地解釋tModels與綁定模板的關(guān)系前,我們必須先弄清楚tModels是什么。 TModel是什么? 我們可以把tModel想象成數(shù)據(jù)庫庫中的一個獨立的表,其中包含下面的字段:名字、描述、URL、唯一的關(guān)健字。實際上,tModel就是包括有名字和描述,那么使用數(shù)據(jù)庫表表示它是否是一種浪費呢?我們下面就會討論這一問題: 下面是一個假想的tModel數(shù)據(jù)庫表中的二個實體: 鍵 1 2 在將tModel比作數(shù)據(jù)庫表方面,有幾點值得注意。首先,tModel是一個獨立的表,意味著它可以不依賴其他軟件而存在;其次,tModel是查 找表,提供了鍵與鍵的表示之間的轉(zhuǎn)換關(guān)系。從這一點來看,tModel象詞典那樣,是一個引用表。在一些數(shù)據(jù)庫中,這樣的表也被稱作是碼集。 因此,如果在上面的tModel中存在下面的記錄: com.mycompany.HelloWorld, com.mycompany.HelloWorldHome, 就意味著字符串com.mycompany.HelloWorld是一個有完整資格的Java類;而字符串com.mycompany.HelloWorldHome是一個JNDI名。 因此在一定程度上,tModels中唯一的鍵與“名字空間”這個概念差不多。為了進一步地說明這個問題,我們來看一下下面的數(shù)字: 904-555-1212 904-555-1213 1-56592-391-x 你能夠分清這些數(shù)字的意義嗎?我們需要在一個環(huán)境或名字空間中來確認(rèn),904-555-1212是電話號碼,904-555-1213是傳真號,1-56592-391-x是一個ISBN號。 因此在tModel數(shù)據(jù)庫表中,我們將需要定義三個實體:一個是電話號碼;一個是傳真號碼,一個是ISBN號碼。 下面我們以mycompany公司公布了一條號碼為1-800-my-helpline的電話支持熱線,并在UDDI中注冊。那么,我們的數(shù)據(jù)模型為: company Service tModel: description=telephone some binding: accesspoint: tModelInstanceInfo: 有了對tModel的基本理解后,我們就可以利用UML圖表來研究綁定模板與tModels之間的關(guān)系了。我在上面曾經(jīng)說過,這將使我們對綁定模板如何完成UDDI的“如何調(diào)用一項服務(wù)”的要求有一個直觀的理解。 在圖2中,我們討論了一個綁定模板與tModels之間的關(guān)系。從圖表中我們可以看出,一個綁定模板可以指向一個由一個tModel確定的技術(shù)規(guī)格,技術(shù)規(guī)格有二部分組成: ·規(guī)格的類型。(例如電子郵件、傳真、WSDL、SOAP等。) ·確定輸入和輸出的文檔(在SOAP服務(wù)中,這些文檔可以是XML輸入/輸出消息格式。) 既然我們已經(jīng)對tModels有了一定程度的詳細(xì)了解,就該再討論UDDI中更復(fù)雜的東西了,也就是身份包和類別包。 理解標(biāo)識符包和類別包 如果說從概念上理解tModels是理解UDDI需要跨越的第一道障礙,那么理解標(biāo)識符包和類別包則是需要跨越的第二道障礙。下面的例子可以幫助我們理解這二個概念。 例如,您的公司在美國開展業(yè)務(wù)需要有一個稅號,如果還在另外的國家(例如墨西哥)開展業(yè)務(wù),就需要有一個墨西哥的稅號。為了能夠在UDDI注冊簿中獲取您的公司的這些信息,在UDDI中應(yīng)當(dāng)包括下面的內(nèi)容: 公司名字:mycompany 標(biāo)識符: 美國稅號:111111 墨西哥稅號:2223344 其他國家稅號: ...其他的xml內(nèi)容 keyName="taxnumber" keyName="taxnumber" keyName="taxnumber" ... 現(xiàn)在明白tModels如何被用作名字空間了吧。為了進一步地深化對標(biāo)識符包的理解,我們在下面的圖中再次解釋了標(biāo)識符和類別包的概念: 從上面的圖中我們能夠看出,標(biāo)識符包是一個在特定環(huán)境中的鍵/值對集合,這個環(huán)境從本質(zhì)上說就是能夠唯一地解析名字/值對兒的名字空間,它是由 tModel確定的。類別包也是如此,二者之間唯一的區(qū)別就是類別包中由tModel確定的名字空間是一個預(yù)先確定好的類別。 類別包 我想將公司歸類于飯店,其地理位置位于杰克遜維爾。 公司名字:mycompany 適用類: 企業(yè)類型:飯店 所在城市:杰克遜維爾 keyName="restaurant" keyName="JAX" 現(xiàn)在,我們已經(jīng)搞清楚了tModels是如何用在標(biāo)識符和類別包中的。從本質(zhì)上說,tModels就是名字空間。 tModels也能被分類嗎? 我們已經(jīng)明白了企業(yè)實體是如何利用使用了類別包的。另外,UDDI也允許tModels本身被分類。 我們用分層次的文件系統(tǒng)進行說明。目錄是用來對文件進行分類的,但目錄還可以在父目錄下再被分類。象硬盤上的目錄那樣,tModels也可以被分層次地進行組織。 下面我們來討論名字為getUniversalTime()的服務(wù),該服務(wù)將返回當(dāng)前全球任一地方的時間。二家存在競爭關(guān)系的公司可能會提供這一服務(wù)的不同實現(xiàn)。商業(yè)服務(wù)只限于在公司內(nèi)部使用,公司之外的用戶是不可使用的: company1:getTime() company1:getCurrentTime() 這二者的作用相同,為了表明它們實現(xiàn)的是同一個被稱作getUniversalTime()的服務(wù),我們可以定義如下所示的tModel: tModel name:: category: [意味著這是一個由WSDL文檔定義的服務(wù)] 上面的定義表明getUniversalTime()是一個WSDL服務(wù),可以由任何公司實現(xiàn)。 既然已經(jīng)闡明了tModels和包之間的關(guān)系,我們下面可以看看一個tModel的UML表示: 從上面的圖表中,我們可以看出tModel基本上就是一個名字和描述,另外,它也可以包含一個URL,以提供更進一步的詳細(xì)資料。它可以由一個標(biāo)識符包確定和由一個類別包進行分類。 我們已經(jīng)知道,一個tModel所屬于的類別是由UDDI━━WSDL、SOAP等預(yù)先定義好的,下面是一個uddi-org:types名字空間中預(yù)先定義類別的清單: tModel identifier namespace categorization specification xmlSpec soapSpec wsdlSpec protocol transport signatureComponent 如何開始在UDDI中創(chuàng)建一個服務(wù)? 在開始定義服務(wù)的tModel時,要求我們?yōu)榉?wù)指定一個名字和上面所列出的服務(wù)類型中的一個。當(dāng)然了,如果不喜歡上面的分類可以自己創(chuàng)建類別。 我們可以針對上面定義的tModel開發(fā)一個商業(yè)服務(wù)。在商業(yè)服務(wù)定義中,我們需要指定一個指向定義了服務(wù)的輸入/輸出的WSDL文檔的URL。 在UDDI中為什么需要tModels? 在UDDI中使用tModels的目的如下: ·對商業(yè)實體進行標(biāo)識和分類 ·對商業(yè)服務(wù)進行標(biāo)識和分類 ·對tModels進行標(biāo)識和分類 ·將商業(yè)服務(wù)綁定到它們抽象的tModel定義上 UDDI名詞的快速參考 在看有關(guān)UDDI的資料時,如果看到很深奧的術(shù)語是一件很煩人的事兒,下面我們就把一些經(jīng)常用到的與UDDI有關(guān)的概念搜集起來,通過比較幫助我們對UDDI概念的理解: 接口和實現(xiàn) 服務(wù)綁定是一個容器,接口依賴于其實現(xiàn);綁定元素詳細(xì)說明了tModelInstaceInfo和instanceDetail, ·為一種服務(wù)定義的tModel是允許多家公司提供該服務(wù)的多個實現(xiàn)的界面。 ·服務(wù)綁定是具體的實現(xiàn)。 名字空間 Java、C++和XML中都有名字空間的概念,盡管其叫法可能不同,但它們都提供了使名字有意義的環(huán)境。在UDDI中,tModel象征著“名字”。當(dāng)把這個名字作為目錄使用時,你的本意是,“我屬于這個名字”。從這個意義上說,tModel表示的是名字空間。 技術(shù)指紋 當(dāng)一種服務(wù)被注冊為tModel時,我們可以注冊用來與該服務(wù)通訊的協(xié)議(例如WSDL、SOAP等)。因此根據(jù)所使用的協(xié)議不同,tModel有 WSDL指紋或SOAP指紋。因此tModel被認(rèn)為是技術(shù)性指紋,每種指紋與一種特定的協(xié)議有關(guān)。如果說一種tModel可以代表一個“技術(shù)性指紋”, 我們也可以說tModel能夠表示一種“協(xié)議”。 分類 分類與類別、名字空間類似,它提供了一種環(huán)境,只有在這種環(huán)境下,一些數(shù)字和名字才有意義。例如, 白頁 UDDI注冊簿中的企業(yè)實體列表和根據(jù)名字搜索企業(yè)的能力。 黃頁 黃頁將企業(yè)實體按企業(yè)類別或其他適用的類別分類。 綠頁(技術(shù)規(guī)格) 綠頁有助于我們理解服務(wù)的定義和訪問服務(wù)的要求,serviceBindings和tModels也有助于這一目標(biāo)的實現(xiàn)。 JAXR JAXR是在服務(wù)注冊中使用的一種Java 下面我們討論在沒有工具的情況下如何完成這一任務(wù): 1、編寫必要的服務(wù)描述XML文檔。 2、理解SOAP頭部,以便能夠?qū)ML文件作為一個SOAP附件發(fā)送給UDDI注冊簿。 3、使用SOAP客戶端Java 4、通過編程的方式處理SOAP消息。 5、根據(jù)UDDI服務(wù)的描述,構(gòu)造消息完成該UDDI服務(wù)的任務(wù)。 6、對每個消息,完成第2、3步中的操作。 如果使用JAXR,我們可以更好地完成這一任務(wù)。因為JAXR允許我們在發(fā)送XML消息時無需考慮SOAP頭部,而且是一種嚴(yán)格的面向消息的協(xié)議。使用JAXR,上面的任務(wù)將簡化為: 1、編寫必要的服務(wù)描述XML文檔。 2、使用JAXM 3、根據(jù)UDDI服務(wù)構(gòu)建消息完成該UDDI服務(wù)。(例如,向UDDI注冊簿注冊UDDI服務(wù)包含有4次信息交換過程。)這意味著我們?nèi)匀恍枰cXML內(nèi)容打交道。 使用這種方式,我們只需處理高層次的Java 下面列出了JAXR的一些目標(biāo): ·支持業(yè)界標(biāo)準(zhǔn)的XML注冊功能 ·支持成員機構(gòu)和企業(yè)的注冊 ·支持任意注冊內(nèi)容的存儲和提交 ·支持XML、非XML注冊內(nèi)容的管理 ·支持注冊內(nèi)容間用戶定義的結(jié)合 ·支持用戶定義的注冊內(nèi)容的多級分類 ·支持基于定義的分類計劃的注冊內(nèi)容查詢 ·支持基于復(fù)雜查詢的注冊內(nèi)容查詢 ·支持基于關(guān)健詞的注冊內(nèi)容查詢 ·支持Web服務(wù)的共享 ·支持合作伙伴間商業(yè)過程的共享 ·支持合作伙伴間計劃的共享 ·支持合作伙伴間商業(yè)文檔的共享 ·支持合作伙伴間貿(mào)易伙伴協(xié)議的談判 ·支持計劃匯編 ·支持異類分布注冊 ·支持參與各方發(fā)布/訂閱XML消息 JAXR將不僅僅支持UDDI,還會支持其他的類似注冊服務(wù)標(biāo)準(zhǔn)(例如ebXML)。 |
|