| 在本文中,作者闡述了如何設計和實(shí)現基于 Web 的接口(稱(chēng)為 portlet),以提供使用網(wǎng)格服務(wù)的終端用戶(hù)接口。他解釋了開(kāi)放源代碼門(mén)戶(hù)框架 GridSphere,并提供了 GridSphere 模型中的 portlet 代碼示例。本文還介紹了基于 OGSA 的網(wǎng)格服務(wù)和 GridSphere 的集成,其中包含一個(gè)網(wǎng)格 portlet 示例,展示如何編寫(xiě)一個(gè) portlet 來(lái)訪(fǎng)問(wèn)示例 OGSA 計數器服務(wù)。 簡(jiǎn)介:GridSphere 門(mén)戶(hù)框架 在上一年,基于 Portlet 的門(mén)戶(hù)已成為門(mén)戶(hù)服務(wù)器平臺的最令人興奮的領(lǐng)域之一。Java Specification Request (JSR)168(即 portlet API)的出現將允許門(mén)戶(hù)供應商提供公共編程模型,該模型允許開(kāi)發(fā)人員更快地將新功能插入到門(mén)戶(hù)服務(wù)器中,消費者可以輕松地使用這些功能?,F在,許多門(mén)戶(hù)供應商支持 portlet,包括 IBM WebSphere、Sun One Portal Server、Oracle 9iAS 和 Jakarta Jetspeed 項目。 GridSphere 門(mén)戶(hù) 提供一個(gè)基于 portlet 的高級開(kāi)放源代碼門(mén)戶(hù)。GridSphere 是在歐盟提供基金的 GridLab 項目 下開(kāi)發(fā)的,提供了一個(gè)非常復雜的門(mén)戶(hù),該門(mén)戶(hù)為各種終端用戶(hù)提供高度定制的環(huán)境。portlet 模型向用戶(hù)提供了一個(gè)靈活易用的接口,并向門(mén)戶(hù)開(kāi)發(fā)人員提供了一個(gè)模型,用于創(chuàng )建可插入的和動(dòng)態(tài)的應用程序支持。下面簡(jiǎn)要列出核心的 GridSphere 特性: - Portlet API 的實(shí)現與 IBM WebSphere Portal Server 4.2 或更高版本緊密兼容。
- 易于開(kāi)發(fā)并易于與插入到 GridSphere portlet 容器中的“第三方 portlet”集成。
- 級別更高的模型,用于使用可視的 bean 和 GridSphere User Interface (UI) 標簽庫構建復雜的 portlet。
- 靈活的基于 XML 的門(mén)戶(hù)表示描述,可以輕松對其進(jìn)行修改來(lái)創(chuàng )建自定義的門(mén)戶(hù)布局。
- 對基于角色的訪(fǎng)問(wèn)控制(Role Based Access Control,RBAC)提供內置的支持,RBAC 將用戶(hù)分為 guest、user、admin 和 super user。
- 復雜的服務(wù)模型,允許創(chuàng )建“用戶(hù)服務(wù)”,可以按照用戶(hù)權限限制服務(wù)方法。
- 通過(guò) Hibernate for RDBMS 數據庫支持提供數據的持久性。
- 為 portlet 服務(wù)的服務(wù)端測試集成了 Junit/Cactus 單位測試,包括生成測試報告。
- GridSphere 核心 portlet 提供基本功能,包括登錄、注銷(xiāo)、用戶(hù)和訪(fǎng)問(wèn)控制管理。
由于 GridSphere portlet API 幾乎與 WebSphere portlet API 完全相同,所以您應該多看看 developerWorks 文章,這些文章在 參考資料 和 IBM WebSphere Portal Zone 中列出。在理論上,使用 IBM WebSphere Portal Server 開(kāi)發(fā)本文中的示例 portlet 應該不難。GridSphere API 與 JSR Portlet API 1.0 最后的規范非常類(lèi)似,gridSphere 的將來(lái)版本是符合 JSR 168 的。 當前的 GridSphere 版本提供了一個(gè)門(mén)戶(hù)、一個(gè) portlet 容器和一組有用的核心 portlet,包括用戶(hù)和組管理以及布局定制和 portlet 訂閱。 安裝 GridSphere 從 http://www.gridsphere.org/ 下載最新的 GridSphere 版本并按照指示安裝該門(mén)戶(hù)。前提條件是您必須在系統中安裝了 Java 技術(shù) Ant 和 Tomcat 4.1.X servlet 容器。安裝了 GridSphere 后,可以只啟動(dòng) Tomcat,然后在 Web 瀏覽器中,單擊 http://127.0.0.1:8080/gridsphere/gridsphere 查看該門(mén)戶(hù)。初始配置允許您以“root”身份登錄,而且不用輸入口令。登錄后,轉至 Administration->Users 選項卡,單擊 root 用戶(hù)來(lái)編輯配置文件。更改口令和其他設置,包括您的登錄名和電子郵件地址。登錄后,您就成為 GridSphere 門(mén)戶(hù)管理員。 圖 1. GridSphere 用戶(hù)管理器 portlet
網(wǎng)格服務(wù)簡(jiǎn)介 在提供對用戶(hù)的虛擬組織(Virtual Organization,VO)內的計算資源和數據資源的安全統一訪(fǎng)問(wèn)方面,門(mén)戶(hù)正變得越來(lái)越復雜,所以網(wǎng)格 portlet 必須依靠某種類(lèi)型的中間件來(lái)執行這些操作。開(kāi)放網(wǎng)格服務(wù)基礎設施(Open Grid Services Infrastructure,OGSI)規定如何創(chuàng )建網(wǎng)格服務(wù),而 OGSI 是整體開(kāi)放網(wǎng)格服務(wù)體系結構(Open Grid Services Architecture,OGSA)的一部分。Globus Toolkit 3.0 (GT3) 提供了 OGSI 的 Java 參考實(shí)現。GT3 提供了強制性網(wǎng)格服務(wù)特性,如服務(wù)調用、生存期管理、服務(wù)數據接口、依賴(lài)底層公鑰基礎設施(Public Key Infrastructure,PKI)的安全接口。網(wǎng)格服務(wù)擴展了 Web 服務(wù),因此在實(shí)際中,編程模型很相似。 簡(jiǎn)而言之,使用 GT3 創(chuàng )建網(wǎng)格服務(wù)的步驟如下所示: - 創(chuàng )建定義服務(wù)接口的 WSDL 接口??梢圆捎霉ぞ咿D換采用 Java 或 C 語(yǔ)言編寫(xiě)現有接口以生成 WSDL。
- 使用 GT3 工具從 WSDL 服務(wù)器接口生成客戶(hù)機和服務(wù)器存根(stub)。
- 填寫(xiě)服務(wù)器骨架(skeleton)實(shí)現代碼。
- 配置服務(wù)部署描述符并部署服務(wù)到宿主容器。
幸運的是,GT3 與一組供我們使用的示例服務(wù)綁定在一起。因此,我們將集中討論使用現有服務(wù)和現有的客戶(hù)機存根代碼來(lái)訪(fǎng)問(wèn)服務(wù)。 幸運的是,您下載的 Tomcat 服務(wù)器還可以充當 OGSI 網(wǎng)格服務(wù)宿主環(huán)境,允許 GridSphere 門(mén)戶(hù)框架和 OGSA GT3 示例服務(wù)一起運行。 下一節準備開(kāi)發(fā)示例 portlet,您應從 Globus Web site 下載最新的 GT3 版本。要構建示例并部署到 Tomcat 容器中,請發(fā)出下列命令,其中 $CATALINA_HOME 設置為下載 Tomcat 的位置。 %> ant %> ant samples %> ant -Dtomcat.dir=$CATALINA_HOME deployTomcat | 現在,由于示例 portlet 需要一些 GT3 類(lèi),所以需要將 OGSA Web 應用程序的庫復制到 portlet 可以找到的 Tomcat 共享庫目錄。 %> cp $CATALINA_HOME/webapps/ogsa/WEB-INF/lib/*.jar $CATALINA_HOME/shared/lib/ | 根據 GT3 User‘s Guide(請參閱“參考資料”),最后一步是將下列條目添加到 $CATALINA_HOME/conf/web.xml 中,配置 Tomcat 以接受 WSDL、GWSDL 和 XSD 文件擴展名: <mime-mapping> <extension>gwsdl</extension> <mime-type>text/xml</mime-type> </mime-mapping> <mime-mapping> <extension>wsdl</extension> <mime-type>text/xml</mime-type> </mime-mapping> <mime-mapping> <extension>xsd</extension> <mime-type>text/xml</mime-type> </mime-mapping> | 編寫(xiě)網(wǎng)格計數器服務(wù) portlet 在網(wǎng)格 portlet 示例中,我們使用 Globus Toolkit 提供的示例 OGSI 計數器服務(wù)編寫(xiě)一個(gè)簡(jiǎn)單的加減數字的 portlet。計數器服務(wù)表示為 CounterPortType,它是基 GridService 接口的子類(lèi),有三個(gè)方法,如下面的圖 2 所示: 圖 2. 計數器服務(wù)的 UML 圖
add(int a) 和 subtract(int b) 方法添加或減去提供的值并返回新值。getValue() 方法只返回靜態(tài)計數器值的當前結果。 1. 編寫(xiě) portlet 在計數器 portlet 示例中,用戶(hù)可以輸入整數值,然后單擊 "Add" 或 "Subtract" 按鈕加上或減去計數器服務(wù)的值,并顯示已更新的計數器值。 當第一次實(shí)例化 portlet 時(shí),init() 方法被調用,向該 portlet 提供由任何后續 portlet 請求使用的所有必需的初始信息或配置信息。portlet 編程模型將表示(portlet 的呈現)和邏輯(當某個(gè)動(dòng)作發(fā)生時(shí)必須執行的操作)分為不同的 portlet 方法。portlet 容器負責調用 doView() 呈現方法來(lái)顯示 portlet,并在 portlet 收到事件(如按鈕單擊或表單提交)時(shí),負責調用 actionPerformed() 方法。Portlet 可以向用戶(hù)提供幾種模式,包括 Edit、Configure 或 Help,從而向用戶(hù)提供特定模式的接口。portlet 必須提供適當的呈現方法,如 doEdit 用于支持編輯模式。對于熟悉 servlet 的人員而言,portlet 開(kāi)發(fā)非常相似,只是 servlet 的 doGet 或 doPost() 方法由 actionPerformed() 和 doXXX() portlet 方法取代。portlet 編程和 servlet 編程的另一個(gè)顯著(zhù)差別在于 PortletResponse、PortletConfig 和 PortletContext 類(lèi)的使用,這些類(lèi)在現有的由 Java Servlet API 提供的 HttpServletRequest、HttpServletResponse、ServletConfig 和 ServletContext 類(lèi)的基礎上裝飾(也就是提供)了附加的功能。 最終的 portlet 如下所示: 清單 1. 計數器服務(wù) portlet public class GridCounterPortlet extends AbstractPortlet { public static final String VIEW_JSP = "/jsp/ogsa/counter/view_counter.jsp"; // Create a URL for the counter service private static final String counterUrl = "http://127.0.0.1:8080/ogsa/services/samples/counter/basic/CounterFactoryService"; private LocatorType locator = null; private CounterPortType counter = null; public void init(PortletConfig config) throws UnavailableException { super.init(config); try { // Create a grid service handle from the service URL URL GSH = new URL(counterUrl); // Get a reference to the CounterService Factory OGSIServiceGridLocator gridLocator = new OGSIServiceGridLocator(); Factory factory = gridLocator.getFactoryPort(GSH); GridServiceFactory counterFactory = new GridServiceFactory(factory); // Create a new CounterService instance and get a reference to its Counter PortType. locator = counterFactory.createService(); CounterServiceGridLocator counterLocator = new CounterServiceGridLocator(); counter = counterLocator.getCounterPort(locator); } catch (Exception e) { getPortletLog().error("Unable to create OGSA counter service instance", e); } } public void actionPerformed(ActionEvent evt) throws PortletException { PortletRequest req = evt.getPortletRequest(); int count = 0; String countStr = req.getParameter("count"); try { count = Integer.parseInt(countStr); } catch (IllegalArgumentException e) { // do nothing } // get the operation to perform from the request String operation = req.getParameter("operation"); if (operation != null) { if (operation.equals("Add")) { try { System.err.println("adding " + count + " to counter"); counter.add(count); } catch (RemoteException e) { getPortletLog().error("Failed invoking add on counter", e); } } if (operation.equals("Subtract")) { try { counter.subtract(count); } catch (RemoteException e) { getPortletLog().error("Failed invoking subtract on counter", e); } } } } public void doView(PortletRequest req, PortletResponse res) throws IOException, PortletException { // a portlet uri creates a link for this form to refer back to the calling portlet PortletURI uri = res.createURI(); uri.addAction("submit"); req.setAttribute("uri", uri.toString()); String counterVal = "0"; try { // obtain the current counter value from the grid service counterVal = String.valueOf(counter.getValue()); } catch (RemoteException e) { getPortletLog().error("Unable to get counter value", e); } // put the counter value in the request to display in the JSP req.setAttribute("counterVal", counterVal); getConfig().getContext().include(VIEW_JSP, req, res); } public void doHelp(PortletRequest req, PortletResponse res) throws IOException, PortletException { PrintWriter out = res.getWriter(); out.println("This portlet demonstrates the GT3 counter service."); } } | 如清單中所示,init() 方法負責通過(guò)代表服務(wù)端點(diǎn)的硬編碼 counterUrl 獲得計數器服務(wù)(一種 portType)的實(shí)例。在此情況下,portlet 使用同一個(gè)容器中部署的計數器服務(wù),但也可以容易地修改它,以便使用其他一些已部署的服務(wù)。portlet 容器只調用 init() 方法一次,產(chǎn)生由所有傳入客戶(hù)機共享的單個(gè)計數器服務(wù)實(shí)例。actionPerformed() 方法使用通過(guò)表單提交的請求參數,調用具有提供值的計數器服務(wù)的加減方法。doView() 方法查詢(xún)計數器服務(wù)獲得該值,并通過(guò)包含如下所示的 JSP 頁(yè)面來(lái)顯示表單: 清單 2. 計數器服務(wù) JSP 表單 <jsp:useBean id="counterVal" class="java.lang.String" scope="request"/> <jsp:useBean id="uri" class="java.lang.String" scope="request"/> <form action="<%= uri %>" method="POST"> <table cellspacing="1" cellpadding="1" border="1"> <tr> <td>Enter Number: </td> <td><input type="text" name="count"/></td> </tr> <tr> <td>Counter Value: </td> <td align="center"><b><%= counterVal %></b></td> </tr> <tr> <td align="center"><input type="submit" name="operation" value="Add"/></td> <td align="center"><input type="submit" name="operation" value="Subtract"/></td> </tr> </table> </form> | 以下 portlet 中給出的表示 JSP 提供了一個(gè)簡(jiǎn)單的表單,該表單使用一個(gè)文本域和兩個(gè)提交按鈕來(lái)從計數器中加或減一個(gè)新值。JSP bean counterval 和 uri 用于動(dòng)態(tài)顯示計數器值,創(chuàng )建一個(gè)表單動(dòng)作,以便向后引用正在調用的 portlet。盡管該頁(yè)面展示的是最簡(jiǎn)單的 HTML 表單,但 GridSphere 提供了非常有用的標簽庫,用于構造用戶(hù)界面并減少公共例程(如 PortletURI 的創(chuàng )建和存儲),將其放入特殊的 <ui:actionlink> 或 <ui:form> 標簽來(lái)創(chuàng )建超鏈接和表單,以便向后引用正在調用的 portlet。JSR 168 Portlet 1.0 規范還支持額外的標簽,而且該規范將在 GridSphere 中得到支持。將來(lái)還要撰寫(xiě)文章詳細討論 GridSphere 標簽庫的用法和優(yōu)勢。 2. 創(chuàng )建門(mén)戶(hù)部署描述符 將新 portlet 部署到 GridSphere 的最后一步是創(chuàng )建 GridSphere 使用的部署描述符。portlet 部署描述符 portlet.xml 如下所示 : 清單 3. portlet 部署描述符 <?xml version="1.0" encoding="UTF-8"?> <portlet-app-collection> <portlet-app-def> <portlet-app id="org.gridlab.gridsphere.portlets.GridCounterPortlet"> <portlet-name>Grid Counter Portlet</portlet-name> <servlet-name>GridCounter</servlet-name> <allows> <maximized/> <minimized/> <resizing/> </allows> <supports> <view/> <help/> </supports> </portlet-app> <concrete-portlet-app id="org.gridlab.gridsphere.portlets.GridCounterPortlet.1"> <concrete-portlet> <portlet-name>Grid Counter Portlet</portlet-name> <default-locale>en</default-locale> <language locale="en"> <title>Grid Counter Portlet</title> <title-short>Grid Counter Portlet</title-short> <description>Demonstration of OGSI counter service</description> <keywords>ogsa ogsi counter grid</keywords> </language> </concrete-portlet> </concrete-portlet-app> </portlet-app-def> </portlet-app-collection> | portlet 描述符提供 GridSphere 容器使用的 portlet 屬性的定義。portlet 必須定義一個(gè)應用程序 portlet 定義和一個(gè)或多個(gè) concrete portlet 定義,后者代表由門(mén)戶(hù)使用的實(shí)際 portlet 實(shí)例。在該定義中,我們規定 portlet 支持 VIEW 和 HELP 模式。它還支持所有的窗口狀態(tài),因此用戶(hù)可以最小化、最大化或調整 portlet 的大小,就像它是用戶(hù)桌面上的一個(gè)正常的應用程序窗口。concrete portlet 定義提供了一個(gè)由該 portlet 顯示的標題,以及可能由容器使用的描述和關(guān)鍵字。 在 GridSphere 中,portlet 與 servlet 類(lèi)似,還必須在 web.xml web 應用程序部署描述符中注冊,該部署描述符由 Servlet API 定義,通過(guò) servlet 容器進(jìn)行注冊。該 web.xml 如下所示: 清單 4. Web 應用程序部署描述符 <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/j2ee/dtds/web-app_2.3.dtd"> <web-app> <display-name>GridSphere Grid Portlets</display-name> <description> Provides an OGSA counter service portlet </description> <servlet> <servlet-name>GridCounter</servlet-name> <servlet-class>org.gridlab.gridsphere.portlets.GridCounterPortlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>GridCounter</servlet-name> <url-pattern>/gridcounter</url-pattern> </servlet-mapping> </web-app> | 在 web.xml 中指定的 servlet 類(lèi)必須與實(shí)際的 portlet 類(lèi)名稱(chēng)相匹配,而 servlet-name 必須與 portlet.xml 描述符文件中應用程序 portlet 定義值中指定的名稱(chēng)相匹配。這樣就允許 GridSphere 容器訪(fǎng)問(wèn) portlet 來(lái)轉發(fā)請求。 最后,門(mén)戶(hù)需要一個(gè)布局描述符,它提供默認布局,指出 portlet 在門(mén)戶(hù)中的布局。GridSphere 門(mén)戶(hù)依靠選項卡式窗格方法組織 portlet,以便顯示給用戶(hù)。portlet web 應用程序包含布局描述符 layout.xml,它根據 GridSphere 布局引擎使用的可視化組件來(lái)描述其布局。我們的 layout.xml 示例如下所示: 清單 5. 門(mén)戶(hù)布局描述符 <?xml version="1.0" encoding="UTF-8"?> <portlet-tabbed-pane> <portlet-tab title="Grid samples"> <portlet-tabbed-pane style="sub-menu"> <portlet-tab> <title lang="en">OGSI examples</title> <table-layout> <row-layout> <column-layout width="50%"> <portlet-frame label="counter"> <portlet-class>org.gridlab.gridsphere.portlets.GridCounterPortlet.1</portlet-class> </portlet-frame> </column-layout> </row-layout> </table-layout> </portlet-tab> </portlet-tabbed-pane> </portlet-tab> </portlet-tabbed-pane> | 在 GridSphere 布局中,雙選項卡式窗格提供了一種嵌套的組織結構,用于顯示在布局描述符中指定的 portlet(和其他組件)。由于我們只有一個(gè) portlet,所以,我們選擇將其放置在它自己的選項卡中,默認寬度占到屏幕的一半。<portlet-frame> 表示 portlet 的可視化顯示,包括受支持的模式和窗口狀態(tài)的標題欄。必須由 <portlet-frame> 包含的 <portlet-class> 元素指定了concrete portlet 標識符,該標識符在 portlet 部署描述符中指定。 4. 試一試! 您現在準備在 GridSphere 門(mén)戶(hù)中嘗試執行計數器 portlet 示例。請在“參考資料”部分下載 counterportlet.war 文件,該文件包含了以前的文件和兩個(gè)附加庫,用于存放 JSP 中使用的標簽庫。只需將該文件放在 Tomcat 的 webapps 目錄(如 $CATALINA_HOME/webapps)中,然后編輯類(lèi)似于以下的 $CATALINA_HOME/webapps/gridsphere/WEB-INF/PortletMaster.xml 文件: 清單 6. GridSphere portlet 主配置 <portlet-services> <service> <name>Portlet Manager Service</name> <user-required>true</user-required> <description>Provides Administration Capabilities for Portlet Web Applications</description> <interface>org.gridlab.gridsphere.services.core.registry.PortletManagerService</interface> <implementation>org.gridlab.gridsphere.services.core.registry.impl.PortletManagerServiceImpl</implementation> <service-config> <param-name>startup-portlet-webapps</param-name> <param-value>gridsphere, counterportlet</param-value> </service-config> </service> </portlet-services> | 需要編輯的唯一一行是 param-value 元素,它指定哪個(gè) portlet web 應用程序應被 GridSphere 容器所知曉。通過(guò)將 counterportlet 添加到逗號分隔的列表,GridSphere 將在它啟動(dòng)時(shí)加載和初始化網(wǎng)格計數器 portlet。 現在,在您重新啟動(dòng) Tomcat servlet 容器時(shí),登錄并導航到 Welcome->Settings,在此,您可以從 "Profile Manager" portlet 的編輯模式選擇要加入的新 "counterportlet" 組。 圖 3. 計數器服務(wù) portlet
結束語(yǔ) 本文簡(jiǎn)要介紹了實(shí)現網(wǎng)格 portlet 所用的技術(shù),并演示了一個(gè)網(wǎng)格計數器服務(wù) portlet 的示例,該示例使用 Globus toolkit 和 GridSphere 門(mén)戶(hù)框架一起來(lái)展示示例計數器服務(wù)。GridSphere 門(mén)戶(hù)和 GT3 OGSI 服務(wù)形成自然的共存關(guān)系,您可以容易地開(kāi)發(fā) portlet 并利用 OGSI 服務(wù)的優(yōu)點(diǎn)。該計數器服務(wù) portlet 可能是最容易的并且能夠工作的 portlet 示例,展示了使用 GT3 的網(wǎng)格服務(wù)。在將來(lái)的文章中,我們將討論: - 如何封裝多個(gè) portlet 使用的公共邏輯。
- 如何創(chuàng )建包括更復雜操作和用戶(hù)界面的 portlet。
- 如何開(kāi)發(fā)管理 portlet 來(lái)配置 OGSI 網(wǎng)格服務(wù)。
- 如何使用網(wǎng)格安全機制支持安全網(wǎng)格服務(wù)。
- 如何提供內容的本地化。
致謝 我要感謝所有那些使用和促進(jìn) GridSphere 的人,感謝他們的幫助和討論,這有助于使 GridSphere 框架更具可用性,包括我的同事 Michael Russell 和 Oliver Wehrens 以及 GridLab 項目中的其他人員。還要感謝 Globus 項目的 Sam Meder,他提供了集成 GT3 和 GridSphere 方面的建議和忠告。本工作得到了 European Commission 5th Framework 計劃 (grant IST-2001-32133) 的幫助和支持,該計劃是 GridLab 項目的主要資金來(lái)源。 參考資料 - 了解有關(guān) GridSphere 門(mén)戶(hù)框架的更多信息。
- 下載本文中使用的計數器 portlet Web 應用程序(包括源代碼)。
- 閱讀 Globus Toolkit 3 User‘s Guide。
- 另外,請參閱 Globus Toolkit 3 Programmer‘s Tutorial。
- 請參閱文章 The case for portlets,本文介紹了如何決定 portlet 是您的最佳選擇(developerWorks,2003 年 2 月)。
- 文章 Create your own portlet and Web service 介紹了 portlet 和 Web Services 編程(developerWorks,2002 年 1 月)。
- 請參閱文章 Developing Grid Computing Applications,本文向開(kāi)發(fā)人員介紹網(wǎng)格計算的基本概念和開(kāi)放網(wǎng)格服務(wù)體系結構 (OGSA) (developerWorks,2002 年 10 月)。
- 開(kāi)發(fā)人員對于 OGSI 和基于 OGSI 的網(wǎng)格計算的概述 介紹了開(kāi)放網(wǎng)格服務(wù)體系結構 (OGSI) 規范,包括命名和引用網(wǎng)格服務(wù),使用所有網(wǎng)格服務(wù)公共的接口和行為(developerWorks,2003 年 4 月)。
- 請參閱文章 Globus Toolkit 3.0 和 OGSI 體系結構 — 概述 ,本文介紹了 Globus GT3 軟件體系結構、編程模型和 GT3 引入的工具、Web 服務(wù)和網(wǎng)格服務(wù)軟件模型之間的關(guān)系,以及處理引入到 Web 服務(wù)領(lǐng)域的新網(wǎng)格服務(wù)行為(developerWorks,2003 年 5 月)。
- 請參閱文章 用 Globus Toolkit 3.0 編寫(xiě)安全的網(wǎng)格服務(wù),本文介紹 Globus Toolkit 3.0 的安全技術(shù)和機制(developerWorks,2003 年 10 月)。
|