2003 年 4 月 01 日 本文描述了 UDDI 中的分類法在根據(jù)標(biāo)準分類法對數(shù)據(jù)進行區(qū)分方面的強大功能,并描述了如何使用分類法來創(chuàng)建注冊中心(已經(jīng)向外部用戶屏蔽)的子集。本文還描述了在 IBM UDDI 測試注冊中心使用 UDDI 驗證服務(wù)創(chuàng)建 Speed-start Web 服務(wù)社區(qū)。這個 Speed-start 社區(qū)是一組公共數(shù)據(jù)的示例,這些數(shù)據(jù)可以使用簡單的基于種類的查詢與同一 UDDI 注冊中心中的所有其他公共數(shù)據(jù)區(qū)分開來。作為對那個查詢的響應(yīng)的一部分返回的 UDDI 條目在發(fā)布的時候已被 Speed-start 驗證服務(wù)評估,以確保這些條目是在因特網(wǎng)上可以訪問到的 Web 服務(wù)。 分類法簡介 注冊到統(tǒng)一描述、發(fā)現(xiàn)和集成(Universal Description, Discovery and Integration,UDDI)商業(yè)注冊中心的 IBM 版本的企業(yè)常常包含大量的可讀信息:如企業(yè)名稱(這些名稱會用每種可以想像得到的語言書寫)、地址、聯(lián)系人,包括所有他們的電子郵件地址、電話、手機和傳真號碼。描述了自己的企業(yè)后,這些服務(wù)提供者接著添加它們提供的每項服務(wù)。注冊了所有的這些信息,公司員工便可以閑坐在公司中,等待顧客找上門來,并大量發(fā)送電子郵件,然后等待大量的在線訂單,是不是這樣呢? 不完全對,這些公司還需要利用 UDDI 提供的最重要的功能之一:分類法! 依靠各家公司通常輸入的所有這些信息,顧客只有根據(jù)早已知道的企業(yè)或服務(wù)名稱使用“按名稱查找(Find by name)”搜索才能找到這些公司。因此,那些可能找到這些企業(yè)的人們僅僅是那些仍然使用電話薄中的書面的白頁和黃頁來進行查找的人。應(yīng)當(dāng)清楚的一點是,在全球企業(yè)目錄中,擁有一個以“AAA”開頭的企業(yè)名稱并不足以讓一家企業(yè)被列于首位或被查找到的次數(shù)最多。 UDDI 提供了一種機制,這種機制包括一些標(biāo)準的分類法,它們可用于使用所需的盡可能多的行業(yè)標(biāo)準搜索術(shù)語描述每一個條目。每個企業(yè)、服務(wù)或技術(shù)模型都可能包含一個“種類包(Category Bag)”,這個“種類包”保存有通過鍵值標(biāo)識的引用(即分類法代碼、定位器或關(guān)鍵字),這些引用可以具體描述其企業(yè)的類型、物理位置,甚至還可以描述該企業(yè)提供的確切的產(chǎn)品。這些通過鍵值標(biāo)識的引用包含一個對分類系統(tǒng)或分類法的引用、一個包含那個分類法中的值的文本域和一個針對人類可讀的描述內(nèi)容的文本域。通過使用分類法方法,UDDI 查詢 API(UDDI Inquiry API)可以迅速而有效地將企業(yè)和服務(wù)與需要它們的客戶準確地連接起來。
有效使用分類法 UDDI 現(xiàn)在支持幾個“內(nèi)置的”分類法系統(tǒng)(請參閱 參考資料以獲取鏈接),它們可以用于發(fā)布或查詢: - 北美行業(yè)分類系統(tǒng)(North American Industrial Classification System,NAICS)
- 企業(yè)分類代碼,例如制藥(3254)、光學(xué)用品商店(44613)
- 通用標(biāo)準產(chǎn)品和服務(wù)分類法(Universal Standard Products and Services Classification,UNSPSC)
- 產(chǎn)品和服務(wù)代碼,例如,超輕飛機(25.13.20.05.00)、土壤污染咨詢服務(wù)(77.12.16.04.00)
- 地理分類系統(tǒng)(Geographic Classification System,GCS)(根據(jù) ISO 3166-1999 制定)
- 國家或地區(qū)、州、省和地區(qū)的代碼,例如,美國得克薩斯州(US-TX)、丹麥(DK)。
- UDDI 分類
- UDDI 標(biāo)準和 UDDI 使用/認可的標(biāo)準的一個分類,例如,有線/傳輸協(xié)議(transport),用 WSDL 描述的 Web 服務(wù)(wsdlSpec)
- 通用關(guān)鍵字
- 任一個值與一個關(guān)鍵字的自由關(guān)聯(lián),例如“商店位置”(#102)、“汽車”(Toyota)
這些分類法的前三個是針對分類條目的標(biāo)準。第四個分類法(即 UDDI 分類法)是作為 UDDI 規(guī)范的一部分開發(fā)的,用來為對 Web 服務(wù)的技術(shù)信息進行分類提供有用的值。最后一個分類法對于用條目關(guān)聯(lián)關(guān)鍵字(尤其是那些不是條目名稱一部分的關(guān)鍵字)來說很有用。這些分類系統(tǒng)的每一個都由一個 UDDI 條目(稱為 tModel(技術(shù)模型,Technical Model))進行唯一標(biāo)識,并且能夠通過其 tModelKey 引用。XML 格式的在 UDDI 數(shù)據(jù)結(jié)構(gòu)中對以上種類信息進行引用的情況如 清單 1所示。 清單 1. XML 格式的 UDDI 數(shù)據(jù)結(jié)構(gòu) <categoryBag> <keyedReference tModelKey="UUID:C0B9FE13-179F-413D-8A5B-5004DB8E5BB2" keyValue="3254" keyName=" Pharmaceutical Manufacturing " /> <keyedReference tModelKey="UUID:CD153257-086A-4237-B336-6BDCBDCC6634" keyValue="25.13.20.05.00" keyName="Ultra Light Aircraft" /> <keyedReference tModelKey="UUID:4E49A8D6-D5A2-4FC2-93A0-0411D8D19E88" keyValue="US-TX" keyName="Texas" /> <keyedReference tModelKey="UUID:C1ACF26D-9672-4404-9D70-39B756E62AB4" keyValue="wsdlSpec" keyName="Specification for a Web Service described in WSDL" /> <keyedReference tModelKey="aaa" keyValue="102" keyName="Store Location" /> </categoryBag> | 除了這些“內(nèi)置的”值集以外,政府和企業(yè)的多數(shù)領(lǐng)域(例如,農(nóng)業(yè)、汽車業(yè)、計算機業(yè))開發(fā)了它們自己的標(biāo)準和分類系統(tǒng),這些標(biāo)準和分類系統(tǒng)可以很容易地在 UDDI 中發(fā)布、描述和引用。欲了解更多關(guān)于發(fā)布一個新值集的信息和代碼樣本,請參閱 Web 服務(wù)發(fā)布與發(fā)現(xiàn)的 UDDI4J 一節(jié)(請參閱 參考資料以獲得鏈接)。 為了適應(yīng)其他的值集,UDDI 還提供了用于分類系統(tǒng)的外部提供者的方法,以將它們的值集注冊到 UDDI 本身,因此使得任何企業(yè)、服務(wù)或技術(shù)模型能夠開始將它們的值與它們的種類包關(guān)聯(lián)起來。 UDDI 還另外提供了一個機制,供值集用來與 UDDI 注冊中心進行集成,以驗證企業(yè)或服務(wù)正在正確關(guān)聯(lián)和注冊它們的值。提供者可以部署一個驗證服務(wù)供 UDDI 在值集代碼被發(fā)布之前使用。
針對外部檢查的分類系統(tǒng)的規(guī)范 當(dāng) UDDI 注冊中心接收到一個對已選擇的、帶有外部驗證服務(wù)的分類法的引用時,這個引用將向適當(dāng)?shù)耐獠糠?wù)發(fā)布一條 validate_values 消息。這使得外部用戶能夠?qū)o定的種類系統(tǒng)的使用進行調(diào)整。通常的用法是驗證那個特定的類別值在給定的分類法中存在(檢查所提供的 keyValue 屬性值)。對于某些分類法和標(biāo)識符來說,提供驗證服務(wù)的一方可能根據(jù)在消息中傳送的標(biāo)識符或任何可能使用被傳送的數(shù)據(jù)的其他種類的上下文檢查對某些方的值的使用進行進一步的約束(請參閱 參考資料中的程序員的 API 的鏈接)。 調(diào)用 validate_values 的 UDDI 注冊中心的實現(xiàn)將傳送 businessEntity、businessService 或 tModel 元素作為這個調(diào)用的唯一自變量。這與正在 save_business 、 save_service 或 save_tModel API 調(diào)用中被傳送的數(shù)據(jù)相同。同一類型的多個元素會被一起傳送。 (請參閱 參考資料以獲得鏈接),以 UDDI V2 模式編寫的 SOAP:Body 中的 validate_values API 語法如 清單 2所示。 清單 2. SOAP:Body 中的 validate_values API 語法 <complexType name="validate_values"> <choice> <element ref="uddi:businessEntity" minOccurs="0" maxOccurs="unbounded" /> <element ref="uddi:businessService" minOccurs="0" maxOccurs="unbounded" /> <element ref="uddi:tModel" minOccurs="0" maxOccurs="unbounded" /> </choice> <attribute name="generic" type="string" use="required" /> </complexType> |
Speed-start 驗證服務(wù) Speed-start 驗證服務(wù)有助于確保發(fā)布到 IBM UDDI 測試注冊中心的實體包含可以訪問的 Web 服務(wù)。每當(dāng)接收到要發(fā)布這樣一個實體(該實體包含一個對 developerWorks 分類法 tModel 進行引用的種類包)的請求時,IBM UDDI 測試注冊中心就會對 Speed-start 驗證服務(wù)進行調(diào)用。驗證服務(wù)然后會對在實體中提供的所有 SOAP 端點和 WSDL 文檔進行檢查,檢查它們在萬維網(wǎng)(World Wide Web)上能被訪問。 Speed-start 驗證服務(wù)是 UDDI V2 規(guī)范中描述的 UDDI V2 validate_values API 的實現(xiàn)。 請求中的實體必須首先將驗證傳送到 Speed-start 驗證服務(wù),包含對 developerWorks 種類系統(tǒng)進行引用的發(fā)布請求才會成功。developerWorks 種類系統(tǒng)的關(guān)鍵字在 IBM Web 服務(wù)工具中構(gòu)建,或者也可以通過發(fā)出一個需要 IBM UDDI 測試注冊中心上的種類系統(tǒng)的 find_tModel 請求找到。對 developerWorks 種類系統(tǒng)的引用在實體中的出現(xiàn)形式如下面的 XML 片段(請參閱 清單 3)所示: 清單 3. 對 developerWorks 種類系統(tǒng)的引用 <categoryBag> ... <keyedReference tModelKey="UUID:8F497C50-EB05-11D6-B618-000629DC0A53" keyValue="Speed Start" keyName="Web service information for the developerWorks Speed Start community" /> ... /categoryBag> | 測試注冊中心通過遞交一條包含 validate_values 請求的 SOAP 消息來調(diào)用 Speed-start 驗證服務(wù)。那些請求包含一個關(guān)于 businessEntity 實體、businessService 實體或 tModel 實體的列表。驗證服務(wù)將會對所有包含 Speed-start tModel 分類類別的實體進行驗證。 如果實體中包含的所有 URL 在萬維網(wǎng)上都可以訪問的話,那么就可以認為這個實體是有效的。如果某個 URL 被確定為無效,那么驗證服務(wù)將會把一個包含錯誤代碼和消息的響應(yīng)發(fā)送回測試注冊中心。這樣,UDDI 發(fā)布請求便沒能成功,并將來自驗證的錯誤代碼和消息返回給發(fā)布者。否則,如果驗證成功,那么將會有一個成功響應(yīng)被發(fā)送到測試注冊中心,UDDI 發(fā)布請求便成功了。
驗證服務(wù)的實現(xiàn) Speed-start 驗證服務(wù)是作為一個 Web 服務(wù)來實現(xiàn)的。Web 服務(wù)是一個自我描述的、獨立的、模塊化的應(yīng)用程序邏輯單元,它能夠通過因特網(wǎng)連接為其他應(yīng)用程序提供一些功能。應(yīng)用程序會通過 Web 協(xié)議和數(shù)據(jù)格式(如 HTTP 和 XML)訪問 Web 服務(wù),而無需擔(dān)心每個 Web 服務(wù)是如何實現(xiàn)的。 驗證服務(wù)會對 UDDI V2 validate_values API 進行實現(xiàn)。這個實現(xiàn)使用 Java servlet 來處理 validate_values 請求。servlet 是在 Web 服務(wù)器(如 WebSphere Application Server)中運行的 Java 程序。servlet 對來自 Web 客戶機的請求進行接收和響應(yīng),這通常通過 HTTP 進行。 實現(xiàn)提供 validate_values API 的服務(wù)有幾種方法。通過使用從 AXIS 生成的 WSDL2Java 代碼,會生成 UDDI 模式的數(shù)據(jù)類型和一個接口,它們是實現(xiàn)具體的 validate_values API 的基礎(chǔ)(請參閱 參考資料以獲得鏈接,了解有關(guān) WSDL2Java 的信息)。根據(jù)傳送到代碼生成器的命名參數(shù),所生成的驗證值代碼會與下面的 清單 4中的代碼相似。 清單 4. 生成的驗證值代碼 // An interface will be created, for which a concrete implementation can be written: public interface UDDI_ValueSetValidation_PortType extends java.rmi.Remote { public uddi.DispositionReport validate_Values(uddi.Validate_Values body); } | 使用這個工具的好處是接口引用的數(shù)據(jù)類型都被創(chuàng)建為 Java 類,作為代碼生成的一部分。在運行時,每當(dāng) validate_values API 被調(diào)用時,這些數(shù)據(jù)類便被 AXIS 實例化和填充。作為 Java 數(shù)據(jù)結(jié)構(gòu)的一個示例,這里是一個 uddi.vs. Validate_Values 對象,它不帶有所有的 get/set 方法,如 清單 5所示。 清單 5. uddi.vs. Validate_Values 對象局部 public class Validate_Values implements java.io.Serializable { private uddi.AuthInfo authInfo; private uddi.BusinessEntity[] businessEntity; private uddi.BusinessService[] businessService; private uddi.BindingTemplate[] bindingTemplate; private uddi.TModel[] tModel; private uddi.PublisherAssertion[] publisherAssertion; ... | 使用 WSDL2Java 工具使得無需顯式地處理 SOAP、HTTP 或數(shù)據(jù)類型映射便可以對服務(wù)進行快速開發(fā)。 validate_values 服務(wù)的具體實現(xiàn)將遍歷每個數(shù)據(jù)類型數(shù)組并對一些數(shù)據(jù)進行搜索,這些數(shù)據(jù)將在最高級別實體(即 businessEntity、businessService、bindingTemplate、tModel 或 publisherAssertion)的上下文中進行驗證。 另外一個不使用完整的 SOAP 引擎便可實現(xiàn)驗證服務(wù)的方法是創(chuàng)建一個 Java 類,這個 Java 類繼承由 J2EE 提供的抽象類 HttpServlet。由于 UDDI API 只需要對 HTTP Post 請求作出響應(yīng),所以 Validation 服務(wù)只實現(xiàn) doPost 方法。 清單 6顯示了對此進行演示的某個樣本代碼。 清單 6. 替代方法的樣本代碼 public class ValidatorService extends HttpServlet implements DefaultHandler { protected boolean insideOverviewURL; protected StringBuffer overviewURL; protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException { // Get the input stream InputStream input = req.getInputStream(); // Read the XML request from the input stream // Parse the XML request using SAX and a registered listener // to examine specific elements, or use a DOM parser // to create a full document boolean validURLs = true; try { SAXParser parser = new SAXParser(); parser.setContentHandler(this); InputSource is = new InputSource( input ); parser.parse( is ); // Perform some contextual validation // Get the output stream } catch (SAXException e) { validURLs = false; } OutputStream output = resp.getOutputStream(); output.setContentType("text/xml;charset=UTF-8"); // Print the response to the output stream if (validURLs) // Print the SOAP message with E_success report output.write(UTF8_SUCCESS_RESPONSE_BYTES); else // Write the SOAP message with E_invalid value output.write(UTF8_INVALID_RESPONSE_BYTES); } ... // DefaultHandler methods for SAX parsing public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (localName.equals("overviewURL")) { insideOverviewURL = true; overviewURL = new StringBuffer(); } } public void characters(char[] ch, int start, int length) throws SAXException { if (insideOverviewURL) { overviewURL.append(ch, start, length); } } public void endElement(String uri, String localName, String qName) throws SAXException { if (insideOverviewURL { insideOverviewURL = false; // Throw an exception that will cause parsing to stop // on any inaccessible overviewURL if (!validateURL(overviewURL.toString())) throw new SAXException("Invalid overviewURL"); } } } | 這個服務(wù)使用 Xerces 對 XML 請求進行解析,并對請求中與 Java 對象表示相關(guān)的部分實例化,以進行驗證。在以上實例中,只檢查了那些帶有 XML 元素本地名稱“overviewURL”的實體。在完整的驗證服務(wù)中,檢索整個消息,以查找包含 Speed-start tModel 分類類別的 UDDI 實體,并且所有的 URL 都會得到驗證。以下 清單 7中的代碼片段演示了如何驗證 URL 在因特網(wǎng)上是可訪問的。 清單 7. 如何驗證 URL private boolean validateURL( String urlString ) { boolean valid = true; try { URL url = new URL( urlString ); URLConnection connection = url.openConnection(); connection.connect(); } catch ( MalformedURLException exception ) { valid=false; } catch ( IOException exception ) { valid=false; } return valid; } | 由于這個實現(xiàn)在每次實體包含一個對 developerWorks 分類法進行引用時被調(diào)用,因此,對包含引用那個分類法的服務(wù)的查詢應(yīng)得到注冊中心數(shù)據(jù)的一個子集,它是因特網(wǎng)可訪問的 Speed-start 社區(qū)的一部分。
使用 WebSphere Studio Web 服務(wù)瀏覽器發(fā)布到 Speed-start 社區(qū)并從中進行查詢 通過使用任何感知 UDDI 的工具(這些工具需允許將 developerWorks 種類系統(tǒng)添加為服務(wù)的一種屬性)都可以將 Web 服務(wù)發(fā)布到 Speed-start 社區(qū)。WebSphere Studio 中的 Web 服務(wù)瀏覽器被預(yù)先配置為包含了 developerWorks 種類系統(tǒng)。從發(fā)布者和查詢者的角度來看,使用外部檢查或驗證的種類系統(tǒng)與使用 UDDI 中的任何其他種類系統(tǒng)來區(qū)分數(shù)據(jù)沒有什么不同。 通過示例,請考慮一下 developerWorks 上的文章“Ask the magic eight ball”中強調(diào)的 Magic 8 ball Web 服務(wù)(請參閱 參考資料)。這個 Web 服務(wù)在因特網(wǎng)上作為一個演示被托管,并且使用 WSDL 在以下 URL 中得到描述:http://dwdemos.alphaworks.ibm.com/axis/services/urn:EightBall?wsdl。 要將這個 Web 服務(wù)注冊為 Speed-start 社區(qū)的一部分,只需要知道這個 WSDL 文件的 URL 以及這個 WSDL 文件和服務(wù)端點都已在因特網(wǎng)上被托管。 使用 Web 服務(wù)瀏覽器進行發(fā)布可以從 WebSphere Studio 中的 File => Export... 菜單訪問。在出現(xiàn)的對話框的第一個頁面中選擇 Web Service 作為導(dǎo)出目的地。在第二個頁面中選擇 IBM 測試注冊中心,如 圖 1所示。 下一步是要創(chuàng)建有關(guān)提供該服務(wù)的企業(yè)(即提供者)的信息,請選擇抓屏中 Actions 部分的 publish 按鈕,如 圖 2所示。 在出現(xiàn)的頁面上,填入用戶帳戶信息(帳戶可以在 https://uddi.ibm.com/testregistry/registry.html 獲得)以及企業(yè)(即服務(wù)提供者)的名稱和描述。 下一步(也就是最后一步)是提供服務(wù)信息并添加種類條目,表明應(yīng)該將它們作為 Speed-start 社區(qū)的一部分進行驗證。這一步通過在 Actions 部分選擇 publish service 按鈕來完成,如 圖 3所示。 當(dāng)表單出現(xiàn)時,請選擇 Advanced 選項,輸入一個名稱以及 WSDL 文件的 URL,如 圖 4所示。 要指明這個服務(wù)將成為 Speed-start 社區(qū)的一部分,您可以添加恰當(dāng)?shù)姆诸惙?,這需要先添加一個種類,然后從 type 下拉框選擇 dwCommunity 并單擊 Browse...(請參閱 圖 5),然后從分類法瀏覽窗口選擇 Speed-start。在輸入這個信息之后,請單擊 Go,在經(jīng) Speed-start 驗證服務(wù)驗證為因特網(wǎng)可訪問的之后,這個服務(wù)將會被發(fā)布。 若要使用瀏覽器查找所有已被 Speed-start 驗證服務(wù)驗證的服務(wù),請選擇 find 操作,如 圖 6所示。 當(dāng)查找頁面出現(xiàn)時,請從 Search for 框選擇 Services,再選擇 Advanced 作為搜索類型,然后添加 Speed-start 的種類值(如發(fā)布步驟所示)并單擊 Go... 左手邊的結(jié)果將是一個作為 Speed-start 社區(qū)的一部分提交的 Web 服務(wù)的列表,如 圖 7所示。
結(jié)束語 本文對分類法進行了概述,并概述了如何將分類法和由 UDDI 注冊中心調(diào)用的驗證服務(wù)一起使用以提供一個社區(qū)或按照特定于種類系統(tǒng)的標(biāo)準被屏蔽的結(jié)果集。Speed-start 社區(qū)是一個關(guān)于上下文的驗證服務(wù)的強大功能的簡單示例,這種功能大大增強了查詢(針對引用特別種類或標(biāo)識符系統(tǒng)的數(shù)據(jù))的數(shù)據(jù)結(jié)果的質(zhì)量。使用本文提供的信息可以開發(fā)能大大增強 UDDI 注冊中心的結(jié)果(如服務(wù)質(zhì)量或引用服務(wù))的服務(wù)。
參考資料
作者簡介 | | | Matt Rutkowski 在 IBM 的 Emerging Technologies Group 工作,他現(xiàn)在致力于 IBM 的統(tǒng)一描述、發(fā)現(xiàn)和集成(UDDI)版本 3 的實現(xiàn)。他是計算機圖形和著色方面的狂熱愛好者,也是俄亥俄州引以為榮的前成員(即 2002 年國家大學(xué)橄欖球錦標(biāo)賽主辦方的七葉樹州人)(注:七葉樹州人是美國俄亥俄州人的別稱)。您可以通過 mrutkows@us.ibm.com隨時給 Matt 發(fā)送電子郵件。 | | | | Andrew Hately 在 IBM 的 Emerging Technologies Group 工作,現(xiàn)在他致力于 UDDI 版本 3 的實現(xiàn)和 IBM UDDI 商業(yè)注冊中心( http://uddi.ibm.com/)的工作。他還在 OASIS UDDI 規(guī)范技術(shù)委員會(OASIS UDDI Specification Technical Committee)中代表 IBM。您可以通過 hately@us.ibm.com與 Andrew 聯(lián)系。 | | | | Robert Chumbley 在 IBM 的 Emerging Technologies Group 工作,現(xiàn)在他致力于自動發(fā)音開發(fā)工具(Self-Voicing Development Kit,SVDK)的工作。他過去兩三年中致力于 IBM UDDI 商業(yè)注冊中心的開發(fā)工作。在此之前,他畢業(yè)于 THE university in Texas,該校也稱為 Texas A&M。您可以通過 chumbley@us.ibm.com與 Robert 聯(lián)系。 | |