級(jí)別: 中級(jí)
Nicholas Chase
(ibmquestions@nicholaschase.com), 顧問(wèn), Backstop Media
2006 年 11 月 05 日
面向服務(wù)的體系結(jié)構(gòu)(Service-Oriented Architectures,SOA)當(dāng)前強(qiáng)調(diào)的重點(diǎn)在 Web 服務(wù)上,但很容易被所傳播的各種信息搞得昏頭轉(zhuǎn)向。本系列教程將對(duì)主要 Web 服務(wù)規(guī)范進(jìn)行全面說(shuō)明,從簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議(Simple Object Access Protocol,SOAP)一直介紹到 WS Business Process Execution Language (WS-BPEL)。本教程是系列教程的第 3 部分,將說(shuō)明統(tǒng)一描述、發(fā)現(xiàn)和集成 (UDDI) 的基本概念,并介紹如何使用 Java 應(yīng)用程序訪問(wèn)它。
開(kāi)始之前
本教程介紹統(tǒng)一描述、發(fā)現(xiàn)和集成 (UDDI)。UDDI 指定 Web 服務(wù)和其他公司信息的注冊(cè)中心,旨在提供一種發(fā)現(xiàn)可使用的新 Web 服務(wù)并在理想的情況下實(shí)現(xiàn)操作自動(dòng)化的方法。
本教程假定您熟悉 Web 服務(wù)和 SOAP 的一般概念。熟悉 WSDL 的相關(guān)知識(shí)也將有所幫助,但本教程中會(huì)對(duì)一般概念進(jìn)行回顧。
為了理解本教程最后一部分給出的代碼,您需要熟悉 Java,不過(guò)其中的概念與本教程的其他內(nèi)容一樣,適用于任何編程語(yǔ)言。
本系列教程以假想的報(bào)社 Daily Moon 為例,為了提高在競(jìng)爭(zhēng)激烈的環(huán)境中的工作效率,其員工將使用各種 Web 服務(wù)來(lái)創(chuàng)建工作流系統(tǒng),我們將在此過(guò)程中講解各個(gè) Web 服務(wù)基本概念。
第 1 部分說(shuō)明了 Web 服務(wù)背后的基本概念,并演示了如何使用 SOAP(后續(xù)教程討論的大部分內(nèi)容的基礎(chǔ)規(guī)范)來(lái)將 Classifieds Department 連接到內(nèi)容管理系統(tǒng)。
第 2 部分進(jìn)一步深入說(shuō)明如何使用 Web 服務(wù)描述語(yǔ)言 (WSDL) 定義 Web 服務(wù)預(yù)期產(chǎn)生的消息,從而使團(tuán)隊(duì)更方便地創(chuàng)建服務(wù)以及連接到服務(wù)的客戶機(jī)。
在第 3 部分中,團(tuán)隊(duì)希望準(zhǔn)備一系列服務(wù),并希望能方便地查找這些服務(wù)。與此對(duì)應(yīng),統(tǒng)一描述、發(fā)現(xiàn)和集成(Universal Description, Discovery and Integration,UDDI)提供了可用服務(wù)的可搜索注冊(cè)中心,以便使自己的服務(wù)為其他人所注意。
第 4 部分和第 5 部分討論 WS-Security 和 WS-Policy,將詳細(xì)說(shuō)明如何保證該報(bào)社的服務(wù)的安全,以及團(tuán)隊(duì)為了訪問(wèn)這些剛提供了安全保護(hù)的服務(wù)需要進(jìn)行哪些更改。
第 6 部分重點(diǎn)討論互操作性,因?yàn)楸仨殢膯蝹€(gè)系統(tǒng)訪問(wèn)來(lái)自幾個(gè)不同實(shí)現(xiàn)的服務(wù)。這一部分還將討論 WS-I 證書中涉及的要求和測(cè)試。
最后,第 7 部分演示如何使用業(yè)務(wù)流程執(zhí)行語(yǔ)言(Business Process Execution Language,WS-BPEL)來(lái)從各個(gè)服務(wù)創(chuàng)建復(fù)雜應(yīng)用程序。
接下來(lái)讓我們更為詳細(xì)地了解一下本教程中將討論的內(nèi)容。
![]() ![]() |
![]()
|
本系列的第 1 部分 介紹了 Web 服務(wù),并強(qiáng)調(diào)了 SOAP 的重要性。這些內(nèi)容是通過(guò)虛構(gòu)的 Daily Moon 報(bào)社的 Classifieds Department 進(jìn)行相關(guān)工作的過(guò)程說(shuō)明的。在本系列的第 2 部分中,Classifieds Department 決定創(chuàng)建自己的服務(wù),并使用 Web 服務(wù)描述語(yǔ)言 (WSDL) 記錄其使用方式。在第 3 部分中,報(bào)社的發(fā)行人決定全面推行 Web 服務(wù),并強(qiáng)制要求使用 UDDI 注冊(cè)中心來(lái)記錄所有可用服務(wù)。
在本教程中,您將了解以下內(nèi)容:
- 什么是 UDDI
- UDDI 的用途
- UDDI 數(shù)據(jù)的結(jié)構(gòu)
- 如何有效地使用 UDDI 表示 WSDL
- 可以對(duì) UDDI 數(shù)據(jù)執(zhí)行的操作
- 使用 Java 與 UDDI 注冊(cè)表交互
![]() ![]() |
![]()
|
為了處理本教程中的代碼,您需要有以下軟件:
Apache Geronimo 或其他 UDDI 實(shí)現(xiàn)。為了處理本教程中的代碼,您需要訪問(wèn) UDDI 注冊(cè)中心。為了實(shí)現(xiàn)此目標(biāo),所使用的注冊(cè)中心類型并不重要,因?yàn)?UDDI 根本就是 Web 服務(wù),應(yīng)該可以從任何平臺(tái)或語(yǔ)言進(jìn)行訪問(wèn),并能夠訪問(wèn)任何平臺(tái)或語(yǔ)言。既然這樣,就可以使用我們?cè)诒鞠盗械牡?1 部分和第 2 部分使用的 Apache Geronimo 應(yīng)用服務(wù)器(同時(shí)也是 IBM 的 WebSphere Community Edition 的基礎(chǔ)),其中預(yù)安裝了 Apache 的 UDDI 注冊(cè)中心實(shí)現(xiàn) jUDDI,并將其配置為基本安裝的一部分。您可以從 Apache.org 下載 Apache Geronimo。有關(guān)安裝 Geronimo 的更多信息,請(qǐng)參見(jiàn)本系列的第 1 部分。
UDDI4J——為了訪問(wèn)注冊(cè)中心,本教程說(shuō)明了 UDDI4J 項(xiàng)目的使用方法;此項(xiàng)目提供了 UDDI 概念和 Java 代碼間非常緊密的集成。可以從 Sourceforge.net 下載 UDDI4J。
Apache Axis2 或其他 SOAP 實(shí)現(xiàn)——可以手動(dòng)創(chuàng)建 SOAP 消息,也可以手動(dòng)對(duì)其進(jìn)行解釋,但手邊如果有一個(gè)可用實(shí)現(xiàn)就會(huì)方便得多。您將使用的是 Apache Axis2,其中包含了各種 SOAP 相關(guān)的 API,可極大地簡(jiǎn)化您的工作。可以從 Apache.org 下載 Apache Axis2 。本教程使用的是 0.94 版,但應(yīng)該也能使用更高版本。
Java 2 Standard Edition 的 1.4.x 版——所有這些工具都是基于 Java 的,本教程中將要構(gòu)建的服務(wù)和客戶機(jī)也是如此。可以從 Sun Developer Network 下載 J2SE SDK。Geronimo 將無(wú)法與 Java 1.5 一起正常使用。
另外,還需要 Web 瀏覽器和文本編輯器,但我想您已經(jīng)有了這兩個(gè)工具。如果愿意,還可以使用 Eclipse 之類的 IDE,但由于我們的重點(diǎn)是技術(shù)而不是工具,因此我將使用文本編輯器和命令行來(lái)編輯和編譯文件。
![]() ![]() |
![]()
|
概述
讓我們看一看目前已經(jīng)完成的工作。
本系列教程逐步說(shuō)明了虛構(gòu)的 Daily Moon 報(bào)社的員工將其日常操作更改為基于 Web 服務(wù)的系統(tǒng)的過(guò)程。在第 1 部分中,Classifieds Department 通過(guò)與內(nèi)容管理系統(tǒng)交互了解了 SOAP 的相關(guān)信息,在第 2 部分中,他們創(chuàng)建了自己的服務(wù),并使用 Web 服務(wù)描述語(yǔ)言 (WSDL) 對(duì)其進(jìn)行描述。現(xiàn)在,該報(bào)社的發(fā)行人 Rudy 對(duì) Web 服務(wù)在其組織內(nèi)的工作情況印象非常好,希望能更廣泛地應(yīng)用 Web 服務(wù),甚至希望將其用于與其他組織進(jìn)行交互。
為此,他要求 IT 人員 Gene 和 Francis 創(chuàng)建一個(gè) Web 服務(wù)注冊(cè)中心,以便能讓其他部門更方便地找到為了將自己的操作過(guò)渡到 Web 服務(wù)而需要的構(gòu)件。
Gene 和 Francis 認(rèn)為最好的做法是實(shí)現(xiàn)統(tǒng)一描述、發(fā)現(xiàn)和集成 (UDDI) 注冊(cè)中心,從而不僅能存儲(chǔ)有關(guān)報(bào)社自己服務(wù)的信息,還能夠與其他報(bào)社的注冊(cè)中心進(jìn)行交互。
![]() ![]() |
![]()
|
向 UDDI 注冊(cè)中心注冊(cè)服務(wù)的部分過(guò)程將涉及到對(duì) WSDL 定義進(jìn)行操作,因此在開(kāi)始新項(xiàng)目前,Gene 重新分析了一下上個(gè)項(xiàng)目中的文件,以回顧 WSDL 的基本概念。請(qǐng)參見(jiàn)清單 1。
清單 1. WSDL 文件
<wsdl:definitions xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://www.daily-moon.com/classifieds" xmlns:ns1="http://org.apache.axis2/xsd" targetNamespace="http://www.daily-moon.com/classifieds"> <wsdl:types> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://org.apache.axis2/xsd" elementFormDefault="unqualified" attributeFormDefault="unqualified"> <xs:element name="createNewAdRequest"> <xs:complexType> <xs:sequence> <xs:element type="xs:string" name="content" /> <xs:element type="xs:string" name="endDate" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="createNewAdResponse"> <xs:complexType> <xs:sequence> <xs:element type="xs:int" name="newAdId" /> </xs:sequence> </xs:complexType> </xs:element> ... </xs:schema> </wsdl:types> <wsdl:message name="createNewAdRequestMessage"> <wsdl:part name="part1" element="ns1:createNewAdRequest" /> </wsdl:message> <wsdl:message name="createNewAdResponseMessage"> <wsdl:part name="part1" element="ns1:createNewAdResponse" /> </wsdl:message> <wsdl:message name="getExistingAdsResponseMessage"> ... </wsdl:message> <wsdl:portType name="ClassifiedServicePortType"> <wsdl:operation name="createNewAd"> <wsdl:input message="tns:createNewAdRequestMessage" /> <wsdl:output message="tns:createNewAdResponseMessage" /> </wsdl:operation> <wsdl:operation name="finalizeIssue">...</wsdl:operation> <wsdl:operation name="editExistingAd">...</wsdl:operation> <wsdl:operation name="getExistingAds">...</wsdl:operation> </wsdl:portType> <wsdl:binding name="ClassifiedServiceBinding" type="tns:ClassifiedServicePortType"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> <wsdl:operation name="createNewAd"> <soap:operation soapAction="createNewAd" style="document" /> <wsdl:input> <soap:body use="literal" namespace="http://ws.apache.org/axis2" /> </wsdl:input> <wsdl:output> <soap:body use="literal" namespace="http://ws.apache.org/axis2" /> </wsdl:output> </wsdl:operation> <wsdl:operation name="finalizeIssue">...</wsdl:operation> <wsdl:operation name="editExistingAd">...</wsdl:operation> <wsdl:operation name="getExistingAds">...</wsdl:operation> </wsdl:binding> <wsdl:service name="ClassifiedService"> <wsdl:port name="ClassifiedServicePort" binding="tns:ClassifiedServiceBinding"> <soap:address location= "http://www.daily-moon.com:8080/axis2/services/ClassifiedService" /> </wsdl:port> </wsdl:service> </wsdl:definitions> |
由于篇幅的原因,我們從此文檔中刪除了部分代碼,但我們?nèi)匀荒芡ㄟ^(guò)剩下的部分了解其一般概念。
首先看最下面,我們定義了實(shí)際的服務(wù),可通過(guò)特定的位置對(duì)其進(jìn)行訪問(wèn),且實(shí)現(xiàn)了 ClassifiedServiceBinding
接口。該接口表示為綁定,指定在 ClassifiedServicePortType
portType 中定義的操作。portType
使用在 types 部分中定義的元素定義輸入和輸出消息。
XML 客戶機(jī)可以讀取此信息,并將其用于訪問(wèn) Web 服務(wù)。(或者,更為準(zhǔn)確地說(shuō),Web 服務(wù)客戶機(jī)生成工具可以讀取此信息,然后生成可以訪問(wèn) Web 服務(wù)的客戶機(jī)。)
![]() ![]() |
![]()
|
在本教程中,Gene 和 Francis 將 Daily Moon 的信息拆分為 UDDI 友好的結(jié)構(gòu),包括業(yè)務(wù)信息和服務(wù)信息。他們將使用其通過(guò) UDDI4J 將報(bào)社的信息和服務(wù)輸入 UDDI 注冊(cè)中心。它們還將與另一個(gè)報(bào)社 Daily Star 的私有注冊(cè)中心協(xié)同工作,以查找提供即時(shí)體育賽事比分的服務(wù)。
現(xiàn)在讓我們看一看到底什么是 UDDI。
![]() ![]() |
![]()
|
UDDI 簡(jiǎn)介
UDDI 基本上就是一個(gè) Web 服務(wù),但與 SOAP 和 WSDL 存在很大差異,最好在開(kāi)始之前了解一些背景知識(shí)。
當(dāng)所有應(yīng)用程序都位于本地時(shí),要找到所需的功能會(huì)非常容易。不過(guò),使用 Web 服務(wù)之類的分布式系統(tǒng)時(shí),您不能獲得中央注冊(cè)中心的好處。分布式系統(tǒng)也容易發(fā)生更改。而這正是 UDDI 的用武之地。它旨在用于兩個(gè)目的。最初形成時(shí),它被認(rèn)為是一種“通用業(yè)務(wù)注冊(cè)中心”。其想法是,企業(yè)可以使用以下三種方法之一搜索合作伙伴:
- “白頁(yè)”:白頁(yè)與電話簿中用于查找公司信息的白頁(yè)類似。例如,如果您知道公司的名稱,可以在其中查找公司的地址、如何進(jìn)行聯(lián)系,甚至還能夠確定與組織中的哪個(gè)人聯(lián)系。
- “黃頁(yè)”:同樣,黃頁(yè)與電話簿中的黃頁(yè)一樣,可以在其中根據(jù)分類查找公司。UDDI 指定了各種分類法,以供各個(gè)公司用于對(duì)自己進(jìn)行分類。例如,如果您在查找體育用具,則可以查找其北美工業(yè)分類系統(tǒng)(North American Industry Classification System,NAICS)代碼為 339920 的公司。
- “綠頁(yè)”:電話簿中沒(méi)有綠頁(yè),但這里的想法是,公司可以使用此搜索方法來(lái)查找實(shí)現(xiàn)了特定服務(wù)的貿(mào)易合作伙伴。例如,可以搜索實(shí)現(xiàn)了使用郵政編碼的距離計(jì)算功能的公司。
UDDI 同時(shí)也被認(rèn)為是一種保持分布式應(yīng)用程序長(zhǎng)期運(yùn)行的方法。其想法是這樣的,可以緩存有關(guān)訪問(wèn)特定服務(wù)的信息,如果客戶機(jī)崩潰,應(yīng)用程序?qū)⒆詣?dòng)回到注冊(cè)中心并進(jìn)行檢查,以確定信息是否已更改。如果已更改,則可以直接在應(yīng)用程序內(nèi)進(jìn)行更改(在理想的情況下將自動(dòng)進(jìn)行更改)并重試您的請(qǐng)求。
![]() ![]() |
![]()
|
當(dāng) Francis 想嘗試統(tǒng)一業(yè)務(wù)注冊(cè)中心(Universal Business Registry,UBR)時(shí),發(fā)現(xiàn)它已不復(fù)存在了。事實(shí)上,在推出 UDDI 3.0 版時(shí),UBR 已被其企業(yè)贊助商終止了。為什么呢?無(wú)論 UBR 的想法多么好,但事實(shí)是基本上沒(méi)有人使用它。其原因是雙方面的:首先,在 UBR 中幾乎沒(méi)有任何可用信息——除非希望使用的是實(shí)時(shí)股票行情服務(wù)(在此情況下可找到大量信息)。第二個(gè)原因是,通常公司并不會(huì)與不熟悉的組織開(kāi)展業(yè)務(wù)。很少有組織通過(guò)自動(dòng)搜索尋找貿(mào)易伙伴,然后在不進(jìn)行大量前期工作的情況下直接向其開(kāi)發(fā)系統(tǒng)。自動(dòng)搜索和調(diào)用模型并沒(méi)有實(shí)際的效用。
同時(shí),這也受到 UDDI 在某種意義上有些超前的事實(shí)的阻礙。它設(shè)計(jì)為處理所有類型的服務(wù),而不僅是 SOAP over HTTP,并沒(méi)有提供使用 WSDL 定義的機(jī)制(至少嘗試使用它的人這樣認(rèn)為)。
不過(guò),這并不是說(shuō)根本不會(huì)使用 UDDI。相反,實(shí)際上它更多地用作“私有注冊(cè)中心”。各個(gè)公司創(chuàng)建自己的注冊(cè)中心,并在其中輸入自己的服務(wù)。UDDI 還可以用作內(nèi)部的業(yè)務(wù)注冊(cè)中心,就像 LDAP 的傳統(tǒng)用法一樣。
而且,隨著從“只有 Web 服務(wù)”的思維方式轉(zhuǎn)變?yōu)楦鄰?qiáng)調(diào)面向服務(wù)的體系結(jié)構(gòu)(Service Oriented Architecture,SOA)的思維方式,這種處理 SOAP 之外的內(nèi)容的能力可能具有極高的長(zhǎng)期價(jià)值。
![]() ![]() |
![]()
|
UDDI 注冊(cè)中心中的信息包含五種不同類型:
-
businessEntity
或?qū)嶋H企業(yè)組織。這可以是整個(gè)組織,也可以為隸屬部門或分支機(jī)構(gòu)。 -
publisherAssertion
或各個(gè)businessEntities
間的關(guān)系。publisherAssertions
必須由雙方共同聲明才有效(因此無(wú)法將自己聲明為另一個(gè)公司的分支機(jī)構(gòu)),除非兩個(gè)實(shí)體都對(duì)發(fā)布者負(fù)責(zé),或除非兩個(gè)實(shí)體都由同一個(gè)用戶帳戶輸入注冊(cè)中心。 -
bindingTemplate
,這對(duì)服務(wù)接口的規(guī)范非常重要。它可以由多個(gè)businessServices
進(jìn)行實(shí)現(xiàn)。 -
businessService
或業(yè)務(wù)提供的服務(wù)。雖然現(xiàn)在看起來(lái)有些簡(jiǎn)單,但在 UDDI 的世界中,這并不意味著它是 Web 服務(wù)。例如,可以實(shí)際將您的公司的電話服務(wù)支持(即用戶實(shí)際撥打的電話號(hào)碼以及其他相關(guān)的內(nèi)容)指定為 UDDI 服務(wù)。當(dāng)然,您并不會(huì)提供虛擬 WSDL 文檔,但這將是您的公司提供的一個(gè)服務(wù)。 -
tModels
或元數(shù)據(jù)模型。研究了 UDDI 后,F(xiàn)rancis 得出結(jié)論,tModel 可能是 UDDI 未達(dá)到預(yù)期目標(biāo)的最大原因。作為服務(wù)的注冊(cè)中心,您希望找到像 WSDL 一樣直接為服務(wù)指定接口的方法。但是,正如所指出的,UDDI 并不是僅供用于 Web 服務(wù),而是設(shè)計(jì)時(shí)包含了更大的靈活性。tModels
的確可幫助指向 XML 文檔(我們稍后將證實(shí)這一點(diǎn)),但事實(shí)上旨在提供通過(guò)服務(wù)、業(yè)務(wù)或任何其他對(duì)象指定關(guān)于某個(gè)事項(xiàng)的信息的通用方法。
以上是 UDDI 的基本數(shù)據(jù)結(jié)構(gòu)。現(xiàn)在讓我們了解一下可以用于與 UDDI 交互的方法。
![]() ![]() |
![]()
|
UDDI 被認(rèn)為過(guò)于復(fù)雜,但其核心在于上述五種數(shù)據(jù)類型以及四個(gè)操作:find、get、save 和 delete。也就是說(shuō),UDDI 規(guī)范說(shuō)明了可以對(duì)數(shù)據(jù)進(jìn)行的以下操作:
-
find_xx
:find_businessEntity
、find_businessService
等方法提供了在 UDDI 注冊(cè)中心中搜索記錄的方法。這些方法返回用于標(biāo)識(shí)對(duì)象的鍵。 -
get_xx
:獲得了標(biāo)識(shí)對(duì)象的唯一鍵后,可以使用get_businessService
等get_xx
方法來(lái)檢索實(shí)際的對(duì)象本身。例如,get_businessService
將返回整個(gè)businessService
對(duì)象,可從其中獲得任何所需的信息。 -
save_xx
:您可能已經(jīng)猜到,這些方法會(huì)將信息添加到數(shù)據(jù)庫(kù),或更改數(shù)據(jù)庫(kù)中已經(jīng)存在的信息。 -
delete_xx
:delete_bindingTemplate
、delete_tModel
等方法獲取對(duì)象的唯一鍵作為參數(shù),然后將其從數(shù)據(jù)庫(kù)中刪除。這些方法的實(shí)際行為根據(jù)所刪除的對(duì)象不同而有所變化。例如,由于數(shù)據(jù)庫(kù)中的其他對(duì)象經(jīng)常引用tModels
,因此并不能實(shí)際將其刪除,而會(huì)將其隱藏。
幾乎所有的 UDDI 都依賴于五個(gè)對(duì)象(businessService
、bindingTemplate
、publisherAssertion
、businessEntity
和 tModel
)與四個(gè)操作(find
、get
、save
和 delete
)的這 20 個(gè)交叉方法。
現(xiàn)在讓我們看一看此結(jié)構(gòu)的實(shí)際情況。
![]() ![]() |
![]()
|