版權(quán)聲明:任何獲得Matrix授權(quán)的網(wǎng)站,轉(zhuǎn)載時請務(wù)必以超鏈接形式標明文章原始出處和作者信息及本聲明作者:Birali Hakizumwami;
xzzhouhu原文地址:
http://www.onjava.com/pub/a/onjava/2005/10/19/constructing-web-services-with-globus-toolkit.html中文地址:
http://www.matrix.org.cn/resource/article/44/44032_Globus_Toolkit.html關(guān)鍵詞: Globus Toolkit
摘要:本文主要介紹了通過一種新的方法來構(gòu)建企業(yè)軟件,即通過調(diào)整Globus Toolkit 4實現(xiàn)的網(wǎng)格計算的概念來實現(xiàn)。GT4是一種可以通過開放網(wǎng)格服務(wù)架構(gòu)(OGSI)來實施的開放資源。這種實施主要目的是為網(wǎng)格服務(wù)架構(gòu)提供了依據(jù),同時也可以為別的網(wǎng)格服務(wù)架構(gòu)實施提供參考。本文詳細介紹了GT4中JAVA的核心服務(wù),這些服務(wù)具備提供代管網(wǎng)格服務(wù)實時運行環(huán)境的能力,當然這些網(wǎng)格服務(wù)都是由JAVA寫的。實時運行環(huán)境在網(wǎng)格服務(wù)的應(yīng)用和網(wǎng)絡(luò)承載之間和傳輸協(xié)議引擎之間起到了協(xié)調(diào)的作用。
一.網(wǎng)格的定義網(wǎng)格的定義:
網(wǎng)格就是將收集網(wǎng)絡(luò)上所有可用的分布式計算資源提供給最終用戶或組建成一個巨大的計算系統(tǒng)。網(wǎng)格計算給分布式計算提供了一種全新的方法,不僅在跨地區(qū)而且在跨組織,機器結(jié)構(gòu)和軟件限制,給連接到網(wǎng)格的每個用戶提供更多的資源,計算機之間的協(xié)作和信息訪問。分布式資源,像計算周期,存儲和信息,可以在網(wǎng)格中的任何地區(qū)訪問,同時也可以在網(wǎng)格中提供這些服務(wù)供其他用戶訪問。這就要通過在每個獨立的組織或資源之間進行安全的協(xié)調(diào)資源共享,共同建立一個動態(tài)虛擬組織機構(gòu)。
二.Globus Toolkit Version 4在本文中,我們主要討論GT4中JAVA的核心服務(wù)。(如圖1),這些服裉峁┝舜芡穹袷凳痹誦謝肪車哪芰ΑJ凳痹誦謝肪吃謨沒Фㄒ宓撓τ梅窈虶T4的核心服務(wù)之間,網(wǎng)絡(luò)承載和傳輸協(xié)議引擎之間起到了協(xié)調(diào)的作用。GT4核心服務(wù)還提供了程序開發(fā)支持的功能,包括開放式開發(fā)模式和訪問網(wǎng)格服務(wù)的實現(xiàn),像GRAM(Grid Resource Allocation Management,網(wǎng)格資源管理)。應(yīng)用GT4強有力的理由就是因為它是建立在現(xiàn)有的WEB服務(wù)標準和技術(shù)的基礎(chǔ)上,像SOAP和WSDL。網(wǎng)格服務(wù)提供的接口都是通過WSDL來描述的。GT4提供了一個軟件倉庫,像安全支持,軟件的探索,軟件的資源管理,軟件的調(diào)用,軟件之間的通信,異常處理和數(shù)據(jù)管理等。

(圖1)
圖1主要描述了在服務(wù)器端的GT4中的主要組件結(jié)構(gòu)。這只是GT4所提供功能的一部分,我們只是認為它很適合本文。GT4結(jié)構(gòu)由一個網(wǎng)格容器組成,網(wǎng)格容器主要用來管理所有部署的WEB服務(wù),貫穿于每個WEB服務(wù)的運行周期。GT4使用apache的axis作為它的WEB服務(wù)的引擎來處理所有的SOAP消息,JAX-RPC (Java API for XML-Based RPC)處理和WEB服務(wù)的配置。
三.貸款償還例子:我們列舉這樣一個例子,主要想向大家展示在企業(yè)內(nèi)部如何通過Globus Toolkit 來解決不同類操作系統(tǒng)之間進行融合。在企業(yè)內(nèi)部,有些應(yīng)用可能是原來主機遺留下來的,技術(shù)比較落后,有些應(yīng)用已經(jīng)采用了現(xiàn)代技術(shù),像J2EE。甚至我們采用最先進的技術(shù)在一個企業(yè)內(nèi)部的應(yīng)用之間進行信息共享也要面臨巨大的挑戰(zhàn)。圖2給出了這樣一個例子,在一個抵押機構(gòu)內(nèi),在貸款償還信息處理和會計部門信息處理之間的交互,

(圖2)
會計部門使用申請貸款處理服務(wù)來申請貸款。
為了創(chuàng)建和部署網(wǎng)格服務(wù),我們需要:
*通過創(chuàng)建WSDL文件來定義服務(wù)的接口
*用JAVA來實現(xiàn)
*通過創(chuàng)建WSDD文件來定義服務(wù)的部署參數(shù)
*使用ANT編譯源代碼并生成GAR文件
*用GT4分發(fā)工具部署GAR文件
我們必須使用從上往下的方法來創(chuàng)建網(wǎng)格服務(wù),(圖3)
這種方法首先從提供WSDL文件開始,在WSDL文件中包括對WEB服務(wù)的抽象定義,包括服務(wù)類型,消息類型和端口類型。從WSDL文檔開始并根據(jù)WSDL文檔創(chuàng)建了JAVA模型,從而導致與其他系統(tǒng)更好交互。

我們使用GT4 toolkit自帶的工具來進行服務(wù)的綁定和產(chǎn)生客戶段需要的根類。這種方法的下一步就是提供接口的實現(xiàn)。
貸款償還服務(wù)處理定義:對于貸款償還服務(wù)處理的例子的接口類型我們定義為loan.wsdl,它描述了貸款償還服務(wù)所提供的三個部分的操作(申請貸款,貸款處理和獲得貸款)。首先我們描述貸款償還服務(wù)的請求和響應(yīng):
<types>
<xsd:element name="createLoan">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="loanNumber" type="xsd:int"/>
<xsd:element name="amountUPB" type="xsd:double"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="createLoanResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="returnValue" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="processLoanPayment">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="loanNumber" type="xsd:int"/>
<xsd:element name="amount" type="xsd:double"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="processLoanPaymentResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="returnValue" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="getLoan">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="loanNumber" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="getLoanResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="returnValue" type="tns:LoanType"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</types>
我們在文件 loan.xsd.中定義了貸款的數(shù)據(jù)類型,我們通過使用“ import <xsd:import schemaLocation="loan.xsd"/> ”可以直接將loan.xsd.文件導入到文件loan.wsdl 中,并且用它作為獲得貸款操作返回的類型
<complexType name="LoanType">
<sequence>
<element name="loanNumber" type="int"/>
<element name="UPB" type="double"/>
<element name="status" type="string"/>
<element name="createDate" type="string"/>
</sequence>
</complexType>
下一步,我們要定義所有的消息服務(wù)。一條消息元素可能由一個或多個部分組成,消息元素的每個部分對應(yīng)一個參數(shù),并且還有一個類型屬性。消息既可以是一個請求消息(輸入消息),也可以是一個響應(yīng)消息(輸出消息)。
<message name="CreateLoanInputMessage">
<part name="parameters" element="tns:createLoan"/>
</message>
<message name="CreateLoanOutputMessage">
<part name="parameters" element="tns:createLoanResponse"/>
</message>
<message name="ProcessLoanPaymentInputMessage">
<part name="parameters" element="tns:processLoanPayment"/>
</message>
<message name="ProcessLoanPaymentOutputMessage">
<part name="parameters"
element="tns:processLoanPaymentResponse"/>
</message>
<message name="GetLoanInputMessage">
<part name="parameters" element="tns:getLoan"/>
</message>
<message name="GetLoanOutputMessage">
<part name="parameters" element="tns:getLoanResponse"/>
</message>
最后我們定義所有的端口類型,每個接口類型定義了一個或多個操作來使用當前的操作元素,每個獨立的操作元素又定義了一個操作和與操作有聯(lián)系的消息的輸入輸出。在一個端口類型內(nèi)操作元素定義了端口類型內(nèi)所有調(diào)用方法的語法。
<portType name="LoanPortType">
<operation name="createLoan">
<input message="tns:CreateLoanInputMessage"/>
<output message="tns:CreateLoanOutputMessage"/>
<fault name="Fault" message="ogsi:FaultMessage"/>
</operation>
<operation name="processLoanPayment">
<input message="tns:ProcessLoanPaymentInputMessage"/>
<output message="tns:ProcessLoanPaymentOutputMessage"/>
<fault name="Fault" message="ogsi:FaultMessage"/>
</operation>
<operation name="getLoan">
<input message="tns:GetLoanInputMessage"/>
<output message="tns:GetLoanOutputMessage"/>
<fault name="Fault" message="ogsi:FaultMessage"/>
</operation>
</portType>
服務(wù)的實現(xiàn): 在前面的步驟中,終端貸款端口類型的接口已經(jīng)產(chǎn)生,在定義這些端口類型的接口時,所有的遠程操作都要設(shè)為public,并且拋出java.rmi.RemoteException。在本文中給出了LoanServiceImpl類,主要實現(xiàn)貸款端口類型的接口,這些實現(xiàn)要用到前面所講到的用loan.wsdl文件所生成的根類。
public class LoanServiceImpl implements LoanPortType
其中LoanServiceImpl 所實現(xiàn)的方法定義在LoanPortType接口中,createLoan方法在產(chǎn)生一個createLoan對象的構(gòu)造器中要獲取一個貸款數(shù)字作為它的參數(shù)。
public CreateLoanResponse createLoan(CreateLoan cl)
throws java.rmi.RemoteException
public ProcessLoanPaymentResponse processLoanPayment(ProcessLoanPayment plp)
throws java.rmi.RemoteException
public GetLoanResponse getLoan(GetLoan gl) throws java.rmi.RemoteException
請參考完整代碼詳細描述方法的實現(xiàn)。
編譯并創(chuàng)建貸款/償還處理的WEB服務(wù):
下面我們介紹通過以下步驟來創(chuàng)建易部署的GT4打包文檔。Ant在編譯本文所提供文件時所產(chǎn)生的build.xml中包含了ant的執(zhí)行任務(wù)的步驟。在build.xml中ant的執(zhí)行任務(wù)調(diào)用GT4中的ant任務(wù),這些任務(wù)伴隨著GT4的發(fā)布可以在編譯文件中找到。
%GLOBUS_LOCATION%/share/globus_wsrf_common/build-packages.xml
%GLOBUS_LOCATION%/share/globus_wsrf_tools/build-stubs.xml
%GLOBUS_LOCATION%/share/schema
編譯GT4中易部署的GAR文件 為了創(chuàng)建易部署的網(wǎng)格打包文件,loan.gar,我們通過以下步驟來實現(xiàn):(這些步驟與builder.xml中的ant任務(wù)是一致的):
· 與WSDL文件綁定
· 通過WSDL 文件生成一個根類,在安裝時,提供一個特殊文件來對不同的命名空間和包之間進行映射,這些包與表格中的目錄結(jié)構(gòu)一致。
· 編譯根類
· 編譯接口類
· 用JAR壓縮接口類,和根類一樣(loan.jar and loan_stubs.jar).
· 通過創(chuàng)建部署描述文件deploy-server.wsdd.來生成易部署的GAR文件,loan.gar
請參考源代碼中完整的build.xml文件,通過以上步驟來實現(xiàn)一系列的ant編譯任務(wù)。GT4描述我們的WEB服務(wù)文件deploy-server.wsdd就想這樣:
<service name="loan/impl/LoanService" provider="Handler"
use="literal" style="document">
<parameter name="className" value="loan.impl.LoanServiceImpl"/>
<wsdlFile>share/schema/loan/Loan_service.wsdl</wsdlFile>
<parameter name="allowedMethods" value="*"/>
<parameter name="handlerClass"
value="org.globus.axis.providers.RPCProvider"/>
<parameter name="scope" value="Application"/>
<parameter name="providers" value="GetRPProvider"/>
<parameter name="loadOnStartup" value="true"/>
</service>
讓我們來介紹一下deploy-server.wsdd中的一些參數(shù):
服務(wù)名稱:指定我們所提供的WEB服務(wù)的路徑,我們將它與WEB服務(wù)容器的地址相結(jié)合起來,我們會得到WEB服務(wù)的完整的URL。為了便于測試,使用獨立的GT4容器,URL就像這樣:
http://localhost:8080/wsrf/services/loan/impl/LoanService類名:指實現(xiàn)服務(wù)接口的類(LoanServiceImpl).
WSDL文件:告訴GT4中的WEB服務(wù)容器對于當前的WEB服務(wù)的WSDL文件在那里可以找到。WSDL文件Loan_service.wsdl是在GT4 從loan.wsdl進行ANT時自動產(chǎn)生的。
啟動時裝載:如果我們需要服務(wù)在WEB服務(wù)容器啟動時就開始裝載,允許我們控制服務(wù)的裝載。
部署GAR文件:GAR文件loan.gar包含了所有的文件和WEB服務(wù)器需要的部署信息,我們使用GT4部署工具:
%GLOBUS_LOCATION%/bin/globus-deploy-gar $PROJECT_HOME/loan.gar 拷貝文檔文件(loan.wsdl,編譯的根類,編譯的接口實現(xiàn),loan.wsdd)到GT4容器的目錄下適當位置。
測試借貸款處理實例在圖1描述了如何將貸款方的子系統(tǒng)和貸款結(jié)算子系統(tǒng)作為借貸款的WEB服務(wù)的客戶端,現(xiàn)在我們就在GT4網(wǎng)格服務(wù)容器中創(chuàng)建和部署WEB服務(wù),我們需要用一個客戶端進行測試,測試用例模擬一個貸款事件,一個貸款月度償還事件和一個貸款還清事件。作為客戶端來說,他們希望WEB服務(wù)的URI(統(tǒng)一資源標識符)能夠作為客戶端訪問WEB服務(wù)的依據(jù)。客戶端的程序要獨立的進行編譯,下面來描述客戶端訪問WEB服務(wù)的主要步驟:
創(chuàng)建一終端引用類型對象,來代表終端引用的貸款服務(wù)。我們的終端引用只需要服務(wù)的URI:
EndpointReferenceType endpoint = new EndpointReferenceType();
endpoint.setAddress(new Address(serviceURI));
下一步,我們要獲得引用服務(wù)的端口類型,這需要一個根類調(diào)用LoanServiceAddressingLocator, LoanServiceAddressingLocator主要是用來維持客戶端與WEB服務(wù)之間的通信和獲得引用貸款端口的類型。
LoanServiceAddressingLocator locator = new LoanServiceAddressingLocator();
LoanPortType loanPT = locator.getLoanPortTypePort(endpoint); 一旦我們獲得這個引用,我們可以作為本地對象來操作WEB服務(wù)。例如,調(diào)用遠程的創(chuàng)建操作,我們僅僅需要在貸款端口類型中使用創(chuàng)建方法。
CreateLoanResponse clr = loanPT.createLoan(new CreateLoan(amount, loanNumber));請參考附件中完整的客戶端代碼。在編譯客戶端之前,請保證運行下面的腳本,以便于GT4的發(fā)布:
%GLOBUS_LOCATION%/etc/globus-devel-env.batglobus-devel-env.bat文件主要是將Globus的類庫注冊到系統(tǒng)的classpath中,因為客戶端是作為獨立的應(yīng)用來編譯的,同樣,要保證在編譯客戶端的目錄中所放置的已編譯的根類時能通過classpath找到,因此我們的客戶端可以訪問服務(wù)器端的根類,像LoanServiceAddressingLocator。
啟動網(wǎng)格容器使用下面的命令來啟動網(wǎng)格容器:
%GLOBUS_LOCATION%/bin/globus-start-container –nosec-nosec參數(shù)主要是為了簡化測試,略去安全設(shè)置。如果網(wǎng)格容器啟動成功,你將會看到已部署的服務(wù)的URI列表,如果LoanService正確的部署,在已部署的服務(wù)的列表中有下面的一行:
[13]: http://localhost:8080/wsrf/services/loan/impl/LoanService測試借貸款處理的WEB服務(wù)通過客戶端進行測試,我們假設(shè)有以下操作:申請貸款,償還貸款,還清貸款。
· 創(chuàng)建一個初始化貸款編號為100并且還有12000未還
java Client http://172.24.15.29:8080/wsrf/services/loan/impl/LoanService createLoan 100 120000
Loan 100 created successfully.· 假定兩個月償還,每個月還$1100(本例不考慮利息的計算)
java Client http://172.24.15.29:8080/wsrf/services/loan/impl/LoanService processLoanPayment 100 1100
Loan 100 processed successfully.
java Client http://172.24.15.29:8080/wsrf/services/loan/impl/LoanService processLoanPayment 100 1100
Loan 100 processed successfully.· 查看貸款的狀態(tài)
java Client http://172.24.15.29:8080/wsrf/services/loan/impl/LoanService getLoanData 100
Loan Data
Create Date Mon Jun 06 16:41:06 EDT 2005
Unpaid Principal Balance 117800.0
Status ACTIVE · 第三個月還清余款($117,800)
java Client http://172.24.15.29:8080/wsrf/services/loan/impl/LoanService processLoanPayment 100 117800
Loan 100 processed successfully· 查看貸款狀態(tài)
java Client http://172.24.15.29:8080/wsrf/services/loan/impl/LoanService getLoanData 100
Loan Data
Create Date Mon Jun 06 16:41:06 EDT 2005
Unpaid Principal Balance 0.0
Status PAIDOFF 結(jié)束語:本文主要描述了在基于現(xiàn)有的WEB服務(wù)標準的基礎(chǔ)上,如何調(diào)整GT4網(wǎng)格結(jié)構(gòu)來創(chuàng)建一個網(wǎng)格服務(wù)應(yīng)用。盡管GT4已經(jīng)主要的應(yīng)用在大型的科學計算問題上,但是在一個企業(yè)內(nèi)部它可以作為實現(xiàn)面向服務(wù)結(jié)構(gòu)(SOA)的一種方法。本文主要是通過一個簡單的實例來描述如何使用GT4中的JAVA核心服務(wù)來創(chuàng)建和部署一個網(wǎng)格服務(wù),但是并沒有覆蓋到更多的其他的更先進的關(guān)于如何使用網(wǎng)格服務(wù)概念,向網(wǎng)格服務(wù)的分配和管理,文件傳輸?shù)目煽啃裕W(wǎng)格異常和安全。
資源 ·
本文的示例代碼·Matrix-Java開發(fā)者社區(qū):
http://www.matrix.org.cn·onjava.com:
onjava.com
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=544636