SCA 組合應用程序中的組件可以在網絡中的不同節點上運行。在 Apache Tuscany 中,可以使用 SCA 域管理一組節點。在 SCA 中,組合、組件、其實現和運行它們的節點屬於一個所謂的 SCA 域。諸如 Tuscany 等 SCA 實現提供了管理工具,允許系統管理員管理域中的 SCA 構件。使用域可爲您提供在將節點添加到域時指定節點安裝特徵(例如主機和端口)的靈活性,而不是在組合文件中指定這些特徵。本文演示如何通過 SCA 域管理由許多 SCA 組件組成的應用程序。瞭解將 SCA 應用程序添加到域所涉及到的每個步驟。
本文中使用的示例是“Getting started with Tuscany”指南(請參見參考資料部分提供的相關鏈接)中的商店應用程序。雖然“Getting started with Tuscany”指南使用了 Eclipse 來部署應用程序,但是本文將向您介紹如何在實際生產環境中運行同一個應用程序。本文使用一個無需附加的中間件要求即可在獨立 Tuscany 運行時中運行的應用程序來演示所需的步驟。
確保您已經:
- 下載並在某個目錄中本地安裝了 Tuscany 分發包,例如 /tuscany-sca-1.3.1。
- 安裝了 Java Platform 2, Standard Edition (J2SE) 1.5。
|
在開始部署解決方案之前,您需要獲得解決方案的安裝存檔。這些存檔包含 SCA 貢獻包 (contribution)、組合應用和 SCA 組件,下面的部分將簡要描述這些概念。該商店解決方案包含三個 Eclipse 項目:
- assets 包含所有的服務和
store
UI 的必需 Java™ 實現(請參見圖 1)。
圖 1. assets 項目 - web-services 包含了描述 Web 服務目錄和流通性的組合應用(請參見圖 2)。
圖 2. web-services 項目 - store 包含商店組合應用,如圖 3 所示。
圖 3. store 項目
將這些項目作爲 JAR 文件導出到 c:/repository 目錄中。如果下載完整的 Tuscany 1.3.1 分發包,您將在 Tuscany 分發包目錄的 tutorial 子目錄中發現已經導出的該商店示例的 JAR 文件。這些文件包括:
- /tuscany-sca-1.3.1/tutorial/assets/target/tutorial-assets.jar
- /tuscany-sca-1.3.1/tutorial/store/target/tutorial-store.jar
- /tuscany-sca-1.3.1/tutorial/web-services/target/tutorial-web-services.jar
|
在繼續之前,讓我們簡要描述一下以下 SCA 和 Tuscany 概念:
- 貢獻包 (Contribution):描述組合服務應用程序的組合文件和項目構件的集合。典型的貢獻包包括 SCA 構件:一個或多個組合文件、Java 類和接口文件、HTML 文件等等。貢獻包可以是某個單獨的組合、目錄,或者是某個 JAR、WAR 或 EAR 存檔。在此例中,您有三個貢獻包:
- tutorial-assets.jar 包含其他組件使用的類。
- tutorial-web-services.jar 包含描述 Web 服務目錄和流通性的組合。
- tutorial-store.jar 包含描述該商店解決方案的組合。
圖 4. 商店應用程序的總體組合
圖 5. 商店應用程序的貢獻包
在圖 4 中,商店組合包含在 tutorial-store.jar 貢獻包中,目錄和流通性組合包含在 tutorial-web-services.jar 貢獻包中,導入實現包含在 tutorial-assets.jar 貢獻包中。store.composite 引用包含在 tutorial-web-services.jar 貢獻包中的組合所描述的組件。 - 組合應用:描述構成應用程序的組件、每個組件提供的服務、組件對其他組件提供的服務的引用,以及聯繫它們的連接。有些組合包括在其他組合中。
- 可部署的組合應用:爲進行部署而打包在一起的頂級組合。本文示例中的 store.composite、catalog.composite 和 currency.composite 全都是可部署的組合。
- 節點:包裝 Tuscany 運行時,該運行時由 Tuscany 分發包庫組成。在 Tuscany 中,每個 SCA 可部署組合在一個節點中運行。每個節點使用某個貢獻包、某個組合和運行節點的環境的屬性(例如主機和端口)進行配置。
- 域:在其中配置貢獻包、組合和節點的範圍。
域中的所有 SCA 資源——貢獻包、組合和節點——全都是可通過 HTTP 進行訪問的 Web 資源。這些資源的集合可通過 Atom 進行訪問,並且可以使用 Atompub 進行管理。這是 SCA 和 Tuscany 標準。(有關 Atom 發佈協議的描述,請參閱參考資料。)
|
將 SCA 組件安裝到 Tuscany 域涉及到以下步驟:
- 啓動域管理器應用程序。
- 向我們的域添加貢獻包。
- 添加組合。
- 爲組合添加節點。
- 啓動節點。
讓我們在下面幾個部分中分別介紹這些步驟。
- 選擇您希望用作域管理器應用程序工作目錄的目錄。對於此示例,讓我們將其命名爲 /tuscany/admin。
- 切換到該目錄並執行以下命令:
java -jar /tuscany-sca-1.3.1/modules/tuscany-node2-launcher-1.3.1.jar domain
- 打開瀏覽器窗口並轉到域管理器主頁。如果是在本地主機上啓動域管理器,則域管理器的主頁地址爲 http://localhost:9990/ui/home。
- 在主頁中,從頂部的菜單中單擊 Contributions。如果域管理器正確地啓動,您應該看到如圖 6 所示的頁面。
圖 6. 空域
現在您需要添加包含應用程序構件的貢獻包。要成功添加和使用某個貢獻包,域管理器和運行應用程序的節點都必須能夠訪問該貢獻包,因爲它們需要在運行時加載這些構件。如果所有組件都位於相同主機上,則可以指定文件路徑。在分佈式部署中,您可以使用以下配置之一:
- 使貢獻包在存儲庫中可用,可從所有節點和域管理器應用程序對其進行訪問。該存儲庫可以是簡單的 HTTP 服務器、Apache Maven 存儲庫或 Subversion 存儲庫,並通過 URL 進行引用。
- 使共享包在運行域和節點的計算機上通過 FTP、網絡文件系統 (NFS) Samba 或任何其他文件共享機制本地可用。
第一個選項是首選選項,因爲它允許多人蔘與分佈式 SCA 域。
爲簡單起見,在此示例中,讓我們假設所有節點在同一主機上運行。在適當的時候,我們將指出本地和分佈式部署之間的差異。
- 在添加貢獻包之前,請選擇每個貢獻包的貢獻包 URI。例如,對於 tutorial-assets.jar,可以使用貢獻包 URI
http://myassets
(請參見圖 7)。
圖 7. 添加貢獻包 - 單擊 Add。該貢獻包現在應該已經添加到域,並出現在貢獻包列表中。
- 使用各自的 URI(例如
http://myws
和http://mystore
)分別對 tutorial-web-services.jar 和 tutorial-store.jar 重複上述步驟。如果正確添加了貢獻包,您現在應該看到如圖 8 所示的列表。
圖 8. 帶有所有已添加的貢獻包的 Contributions 頁面
在此示例中,您使用 GUI 將貢獻包添加到了 SCA 域。還可以使用程序添加貢獻包。在 Tuscany 1.3.1 中,這可以通過將包含貢獻包的貢獻包名稱和 URI 的表單發送到域管理器 URL(<domainURL>/workspace)來完成。例如,要爲 tutorial-web-services.jar 貢獻包發送的條目類似於清單 1。
清單 1. 用於添加貢獻包的示例條目
<?xml version='1.0' encoding='UTF-8'?> <entry xmlns='http://www.w3.org/2005/Atom'> <title>Contribution - http://myws</title> <id>http://myws</id> <link href="file:/c:/repository/tutorial-web-services.jar"/> </entry> |
可以使用清單 2 中的代碼將貢獻包添加到 SCA 域。
清單 2. 用於添加貢獻包的示例代碼
String contributionURI = "http://myws"; String contributionLocation = "file:/c:/repository/tutorial-web-services.jar"; String domainURL = "http://localhost:9990"; try { String entry = "<?xml version=/'1.0/' encoding=/'UTF-8/'?>"+ "<entry xmlns=/'http://www.w3.org/2005/Atom/'>" + "<title>Contribution - " + contributionURI +"</title>" + "<id>" + contributionURI+ "</id>" + "<link href=/"" + contributionLocation + "/" />" + "</entry>"; post(domainURL+"/workspace", entry); } catch (MalformedURLException e1) { // from post() method e1.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } |
在清單 2 中,contributionLocation
是貢獻包存儲庫中或磁盤上的貢獻包存檔的 URL。在本文使用的示例中,tutorial-web-services.jar 的貢獻包位置將是 file:/c:/repository/tutorial-web-services.jar。
清單 2 使用了 post()
方法。這個本地方法使用 Java java.net.URLConnection
類將字符串發送到某個 URL。(有關用於將字符串發送到 URL 的代碼,請參閱參考資料。)將此表單發送到 URL 時,將 URLConnection
對象的 Content-Type 請求屬性設置爲 "application/atom+xml"
,如清單 3 所示。
清單 3. 設置 URLConnection 對象的 Content-Type 請求屬性
URL url = new URL (targetURL); URLConnection conn = url.openConnection(); conn.setDoInput (true); conn.setDoOutput (true); // Disable use of caches. conn.setUseCaches (false); conn.setRequestProperty("Content-Type","application/atom+xml"); [...] |
下一步是將組合添加到域。此示例中共有三個組合:
- catalogs
- currency
- store
首先添加 catalogs.composite
。觀察該組合的內部可以看到,其目標命名空間爲 http://services。它位於您剛纔使用命名空間 http://myws 添加的 tutorial-web-services.jar 貢獻包中。
- 在域管理器網頁上的菜單中,單擊 Composites。
- 輸入如圖 9 所示的 catalogs.composite 信息:
圖 9. 添加組合
這裏的命名空間和名稱標識貢獻包中的該組合,而貢獻包 URI 則是您在前一步中爲貢獻包提供的 URI。 - 單擊 Add。該組合將出現在頁面頂部的列表中。
- 重複上述步驟添加 currency.composite 和 store.composite。如果正確完成所有操作,您將看到如圖 10 所示的內容。
圖 10. 帶有已添加的組合的 Composites 頁面部分
還可以通過腳本或程序添加組合。在此示例中,您可以通過將清單 4 中的 XML 發送到 URL http://localhost:9990/composite,從而將 catalogs.composite 添加到域。
清單 4. 用於添加組合的示例條目
<?xml version='1.0' encoding='UTF-8'?> <entry xmlns="http://www.w3.org/2005/Atom"> <title>composite:http://myws;http://services;catalogs</title> <id>composite:http://myws;http://services;catalogs</id> </entry> |
標題和 ID 需要包含如下語法的字符串: composite:contribution-namespace;composite-namespace;composite-name
.
清單 5 顯示了從 Java 程序中完成此任務所需要的代碼。
清單 5. 用於添加組合的示例代碼
String compositeName = "catalogs"; String compositeNamespace = "http://services"; String contributionURI = "http://myws"; String domainURL="http://localhost:9990"; String id = "composite:"+contributionURI+";"+compositeNamespace+";"+compositeName; String entry= "<?xml version=/'1.0/' encoding=/'UTF-8/'?>" + "<entry xmlns=/"http://www.w3.org/2005/Atom/">" + "<title>" + id +"</title>" + "<id>" + id + "</id>" + "</entry>"; try { post(domainURL+"/composite", entry); } catch (Exception e) { e.printStackTrace(); } |
最後一個步驟是爲每個組合創建節點。請記住,節點提供在其中運行組合的 Tuscany 運行時環境。在此步驟中,您需要爲節點指定主機和端口。也可以在組合本身中指定此信息。但是,務必要注意的是,在分佈式環境中,在組合中省略此信息並在節點創建過程中指定此信息,可以實現更高的應用程序組件部署靈活性。這樣做意味着,您不會將組合與其部署位置綁定,並且在某個時候需要將組合移動到不同的主機或端口時,您將不需要更改此信息。通常,應用程序開發人員不知道將在其中安裝應用程序的環境中有哪些端口可用。然而在此步驟中,需要提供可用的端口。
- 單擊頁面頂部的 Cloud 鏈接。
- 爲 catalogs.composite 創建節點。
如果打算在本地主機上運行節點,請在 URL 中指定
localhost
並選擇可用的端口。由於您的目錄節點在獨立 Tuscany 環境中運行,您可以指定任何可用的 TCP/IP 端口。如果將 catalogs 組合中的組件實現爲 Web 應用程序,則節點將在 Web 容器中運行,並且您必須指定 Web 容器中配置的相應 URL。如果打算在遠程主機上運行節點,您需要確保遠程主機已安裝了 Tuscany 運行時,並且用於運行節點所必需的貢獻包可通過您在添加貢獻包時指定的 URL 進行訪問。
在此例中,讓我們使用本地主機(請參見圖 11)。
圖 11. 添加節點- Node name:您可以使用任何名稱。
- Node URI:此選項指定您希望用於運行節點的主機和端口。
- Composite namespace 和 Composite name:這兩個選項標識您在爲其創建節點的組合。這是您在添加組合時輸入的相同命名空間和名稱。
- Contribution URI:這是您在第一步中添加的對應貢獻包的 URI。
- 單擊 Add。該節點將出現在節點列表中。
- 類似地,爲 currency 和 store 組合添加節點。如果正確地添加了節點,您將看到如圖 12 所示的頁面。
圖 12. 帶有已添加的節點的 Cloud 頁面部分
您還可以通過將清單 6 中的條目發送到位於 cloud 上下文根的域,從而在 Java 程序中將節點添加到域。在此示例中,您可以通過將清單 6 所示的條目發送到 http://localhost:9990/cloud,從而添加 catalogs.composite 的節點。
如果在上面的步驟中手動添加節點,您可以單擊節點的名稱。您將看到清單 6 所示的條目的內容確切對應於您單擊該節點時所看到的內容。這是描述該節點的組合文件。其中包括節點名稱(在此例中爲 MyCatalogsNode
)、您在爲其創建節點的組合(在此例中爲 catalogs
)、爲其創建節點的組合的命名空間(這裏爲 http://services
),以及在支持該節點與其他節點之間通信的綁定中指定的節點的主機和端口信息。
清單 6. 用於添加節點的示例條目
<?xml version='1.0' encoding='UTF-8'?> <entry xmlns="http://www.w3.org/2005/Atom"> <id> composite:http://tuscany.apache.org/cloud;http://tuscany.apache.org/cloud;MyCatalogsNode </id> <content type="text/xml"> <composite xmlns="http://www.osoa.org/xmlns/sca/1.0" xmlns:t="http://tuscany.apache.org/xmlns/sca/1.0" targetNamespace="http://tuscany.apache.org/cloud" xmlns:c="http://services" name="MyCatalogsNode"> <component name="MyCatalogsNode""> <t:implementation.node uri="http://myws" composite="c:catalogs"/> <service name="Node"> <binding.ws uri="http://localhost:8081"> <t:binding.http uri="http://localhost:8081"/> <t:binding.jsonrpc uri="http://localhost:8081"/> <t:binding.atom uri="http://localhost:8081"/> </service> </component> </composite> </content> </entry> |
請注意,此示例將 http://localhost
用於節點的 URI。如果將在與域管理器的主機不同的計算機上啓動節點,則需要指定將運行節點的計算機的名稱,而不是指定 localhost
。
清單 7 中的示例 Java 代碼將清單 6 中的條目發送到域。
清單 7. 用於將節點添加到域的示例代碼
String compositeName = "catalogs"; String contributionURI = "http://myws"; String compositeNamespace = "http://services"; String nodeName = "MyCatalogsNode"; String domainURL="http://localhost:9990"; String host = "localhost"; String port = "8081"; String nodeIdEntry = "composite:" + "http://tuscany.apache.org/cloud" + ";" + "http://tuscany.apache.org/cloud" + ';' + nodeName; String addNodeEntry = "<?xml version=/'1.0/' encoding=/'UTF-8/'?>" + "<entry xmlns=/"http://www.w3.org/2005/Atom/">" + "<id>" + nodeIdEntry + "</id>" + "<content type=/"text/xml/">" + "<composite xmlns=/"http://www.osoa.org/xmlns/sca/1.0/"/n" + "xmlns:t=/"http://tuscany.apache.org/xmlns/sca/1.0/"/n" + "targetNamespace=/"http://tuscany.apache.org/cloud/"/n" + "xmlns:c=/""+ compositeNamespace + "/"/n" + "name=/""+nodeName + "/">/n/n" + "<component name=/"" +nodeName +"/">/n" + "<t:implementation.node uri=/""+contributionURI + "/" composite=/"c:" + compositeName +"/"/>/n" + "<service name=/"Node/">" + "<binding.ws uri=/"http://"+host+":"+port+"/"/>/n" + "<t:binding.http uri=/"http://"+host+":"+port+ "/"/>/n" + "<t:binding.jsonrpc uri=/"http://"+host+":"+port+"/"/>/n" + "<t:binding.atom uri=/"http://"+host+":" + port +"/"/>/n </service>/n" + "</component>/n</composite>/n</content>/n</entry>"; try { post(domainURL+"/cloud", addNodeEntry); } catch (Exception e) { e.printStackTrace(); } |
現在可以啓動節點了。可以採用多種方法啓動 Tuscany 中的 SCA 運行時節點:
- 選擇某個節點並從上面所示的 UI 中單擊 Start。但是,除非遠程主機正在運行 Tuscany 運行時,否則此方法不適用於遠程節點。
- 在節點主機的命令行輸入以下命令:
java -jar <tuscany-install>/modules/tuscany-node2-launcher-1.3.1.jar <domainURL>/node-config/<nodeName>
其中<tuscany-install>
是您安裝 Tuscany 分發包的目錄。例如,c:/tuscany-sca-1.3.1
;<domainURL>
是域管理器的 URL,例如http://localhost:9990
;<nodeName>
是您在創建節點時輸入的節點名稱,例如 MyCatalogsNode。由於您是在運行節點的主機上發出命令,您可以在這裏使用localhost
,如清單 8 所示。 - 在 Java 程序中,使用清單 8 中的代碼。
清單 8. 用於啓動節點的示例代碼
import org.apache.tuscany.sca.node.launcher.LauncherException; import org.apache.tuscany.sca.node.launcher.NodeLauncher; import org.apache.tuscany.sca.node.SCANode2; ... NodeLauncher nodeLauncher = NodeLauncher.newInstance(); String domainURL = "http://localhost:9990"; // could be read from input argument String nodeName = "MyCatalogsNode"; SCANode2 node; try { node = nodeLauncher.createNode(domainURL+"/node-config/"+nodeName); node.start(); } catch (LauncherException e) { System.out.println("Exception starting node"); e.printStackTrace(); } ... |
請注意,清單 8 中的代碼要求將 <tuscany-install>/lib 目錄中的 Tuscany 庫添加到項目的類路徑。
圖 13 顯示了啓動節點的命令的示例輸出。在此輸出中,所顯示的節點 URL 表明了運行節點的實際主機名稱,而 Tuscany 運行時則安裝在 c:/tuscany/tuscany-sca-1.3.1 目錄中。
圖 13. 啓動節點
現在可以在 Web 瀏覽器中測試應用程序了。該應用程序在您爲 store.composite 添加節點時所選擇的端口上運行。您將其命名爲 MyStoreNode。例如,如果是在本地主機上運行應用程序,您可以將瀏覽器指向位於 http://localhost:8083/ui/store.html 的應用程序(請參見圖 14)。
圖 14. 商店應用程序
您現在可以使用該應用程序從目錄中選擇商品,將商品添加到購物車,清空購物車,以及付款後離開。
|
您瞭解瞭如何使用 Tuscany 域管理器應用程序在 SCA 域中部署 SCA 應用程序。在此示例中,您在沒有 Web 容器或應用程序服務器的 J2SE 中運行 Tuscany 運行時。對於更復雜的配置,SCA 域還可以包括運行 IBM WebSphere Application Server、IBM WebSphere Process Server、Apache Geronimo、Apache Tomcat 或其他應用程序服務器的節點。後續的相關文章將進一步深入介紹有關如何將組合應用程序部署到這些不同環境的細節。
學習
- 您可以參閱本文在 developerWorks 全球站點上的 英文原文 。
- 閱讀 Getting Started with Tuscany 指南,瞭解在 Eclipse 中安裝 Tuscany、爲 Tuscany 設置 Eclipse、創建商店應用程序以及在 Eclipse 中測試該應用程序的步驟。
- 查看 Apache Tuscany SCA Java Architecture 指南,瞭解 Tuscany 體系架構的高級視圖,包括諸如貢獻包、組合和節點等基本概念的相關詳細信息。
- 閱讀 Apache Tuscany SCA User 指南,獲得關於 SCA 和 Tuscany 概念的詳細說明。
- 查看 Open SOA SCA 參考資料,獲得許多描述 SCA 規範的各個方面的紅皮書。
- 閱讀文章“Getting to know the Atom Publishing Protocol, Part 1:Create and edit Web resources with the Atom Publishing Protocol”(developerWorks,2006 年 10 月),其中提供了對 Atom 發佈協議的介紹。
- 獲取 The Java Developers Almanac 1.4 中用於將字符串發送到 URL 的示例代碼。
- IBM developerWorks SOA and Web services 專區提供了大量的文章,以及關於如何開發 Web 服務應用程序的初級、中級和高級教程。
- 使用 IBM SOA 沙箱進行試驗!通過 IBM SOA 進行實際的親手實踐來提高您的 SOA 技能。
- IBM SOA 網站提供 SOA 的概述,並介紹 IBM 是如何幫助您實現 SOA 的。
- 瞭解關於 developerWorks 技術事件和網絡廣播的最新信息。
- 訪問 Safari 書店,瀏覽有關這些技術主題以及其他方面的書籍。
- 查看快速的 Web 服務按需演示。