简化管理面向服务的应用程序的创建
控件可以讓開發人員專注于編寫應用程序邏輯和委派基礎性架構問題,如異步消息傳送、會話和與遠程資源的連接。但仍有很多復雜問題使這些應用程序難以管理。 在本文中,我們將使用內建的Weblogic Workshop控件開發一個基于Web services的示例應用程序,并用它來說明管理面向服務的應用程序的挑戰。最后,我們將演示Confuluent Software公司如何給開發人員和IT人員提供可能的Web services管理解決方案,該方案與BEA WebLogic 8.1 Platform集成在一起。
為什么要面向服務?
很少有應用程序還在獨自運行。相反,大多數應用程序經常被集成到應用程序到應用程序互連的復雜“網絡”中。這些應用程序網絡通常是完全異構的、鏈接不同公司所開發的應用程序、運行在不同的平臺上、以不同的語言實現,并且安全保護也各異。
更糟糕的是,利用現今緊密耦合的集成方法,每個應用程序都敏銳地知曉其他應用程序的特性。這樣,一個應用程序的任何改變將會在整個網絡中引起一系列的級聯變化。出現天文數字的開發和維護費用也不足為奇。同時,管理層會懷疑IT仍否重要,并逐年削減IT預算——總有一天,這就是緊密耦合的代價。
面向服務的構架(SOA)提供了一個出路。面向服務的應用程序通過利用基于標準的Web services技術來連接異構環境。通過在應用程序間實現松散的耦合,它們消除了變化管理上的惡夢,也就是,改變一個應用程序的實現而不會中斷其他應用程序。
WebLogic Workshop控件
BEA WebLogic Workshop通過為分布式組件的組裝提供易用的工具,使得構建面向服務的應用程序變得很容易,并且方便了在組件間往來的XML消息的長久會話。
在WebLogic Workshop中,任何應用程序的核心構建塊是控件。控件就好像簡單的Java組件(具有方法和事件),通過屬性可自定義該組件的行為。控件隱藏了J2EE底層問題,這些問題包括連接遠程數據庫、Web services、EJB對象和消息隊列。有了控件,通過設置屬性,而不是調用API,就可配置這些外部資源的連接。通過促進輕松組裝松散耦合的應用程序組件,控件也為實現面向服務作出了貢獻。
為了進一步增強松散耦合,WebLogicWorkshop 8.1也提供了可視化的編輯器(和XQuery支持),用來建立XML接口和底層Java對象間的映射。
讓我們剖析一個簡單的Web services應用程序,看一看WebLogic Workshop是如何消除創建類似應用程序的苦惱的。
訂單管理應用程序示例
即使實現一個簡單的業務場景,例如我們訂單管理Web service示例,也會有大量的技術復雜難題:
- Web service必須和給客戶端用戶使用的WSDL定義文件一起部署在服務器上。
- 該服務依賴并使用多種后端組件,包括數據庫、EJB和其他遠程Web services。
- 該服務必須強制按照被調用操作的次序執行。
- 該服務必須允許多個客戶端并發調用。
訂單管理Web服務的示例顯示了如下操作:
- 用戶能夠檢查未決訂單的狀態:
queryOrderStatus(String inAccountNumber, String inOrderNumber) - 用戶可以創建一個新訂單:
createOrder(String inAccountNumber, String inOrderNumber) - 用戶可以提交一個新創建的訂單:
commitOrder(String inAccountNumber, String inOrderNumber)
首先創建訂單,如果創建成功,則提交該訂單。createOrder和commitOrder必須按順序執行。對于每個方法的調用,服務將會從客戶帳戶中扣除一定費用。用戶帳戶作為EJB建模。訂單存儲在JDBC兼容的數據庫中。對于每一個新創建的訂單,commitOrder將通知遠程服務器(通過一個Web service調用)。
通過使用BEA WebLogic Workshop,并利用控件這一強大的概念,解決在創建像此類Web service的固有復雜性問題時是很容易的。圖1顯示了示例服務的設計視圖及其所用控件。
圖1:示例的設計視圖
首先,在WebLogic Workshop中創建、部署和展示Web service的過程是很直接的。簡單地創建一個Web service工程、添加所有的方法、編寫邏輯并放置“Play”按鈕。此外,WebLogic Workshop自動創建一組Web頁面來測試和運行該Web service(參見清單1)。
清單 1
/**
* @common:operation
*/
public String queryOrderStatus(String inAccountNumber, String inOrderNumber)
然后對后端組件的訪問,如EJB、數據庫,或者甚至是遠程Web services,則只是一個拖放動作(參見清單2)。一旦將使用的組件拖到項目中,它將作為一個對象出現在“代碼視圖”窗格中,并且可以很容易地集成到自定義代碼中。
清單 2
/**
* Remote Web services
* @common:control
*/
private service.NotifyOrderServiceControl serviceNotify;
第三,確認在WebLogic Workshop中能夠以給定順序調用各種方法。從Web service所提供的每個操作能被標記為會話的一部分。這個標記也表明了操作涉及到會話中的哪個部分,這樣強制必須調用這些操作中的訂單(參見清單3)。
清單 3
/**
* Create a new order
* @common:operation
* @jws:conversation phase="start"
*/
public void createOrder(String inAccountNumber, String inOrderNumber)
最后,WebLogic Workshop會話能夠為多個用戶保持環境。會話標記指出要在會話期間保持環境信息(狀態)。使用這種機制,訂單管理服務能夠同時處理多個客戶端。
部署面向服務的應用程序也帶來了新的挑戰
不幸的是,世上沒有免費的午餐。面向服務的應用程序大幅削減了開發和維護的費用,但代價就是管理復雜度的增加:
監視應用程序的健康狀況,不僅僅是組件
單管理應用程序示例。當前的管理工具僅僅監視單個組件和組件的低級基礎架構。基于這點,我們沒辦法驗證一個分布式Web services應用程序是否工作正常。如果應用程序使用外部Web services(如合作伙伴的報價服務),那么只會激化這個問題。由于沒有方法管理外部公司所運行的服務器,所以常規的監視方法完全沒用了。因此在被憤怒的經理訓斥前,您如何檢測正在出現的問題?
不知道去哪里排除故障
一旦你開始每過幾分鐘就被不高興的銷售副主管所訓斥,因為訂單管理應用程序出錯了(在季度結束前兩天),您應該到哪里去查找罪魁禍首呢?是提供訪問由制造IT部門所管理的存貨系統的WebLogic Workshop控件嗎?是這個應用程序所依賴的眾多Web services之一嗎?更糟的是,您怎么知道應用程序依賴哪個Web services和外部資源?隨著訓斥頻率的增加,您僅有的資源都用來開始記錄多個系統的眾多日志上了。
記錄審核和記帳的請求和響應
要求內部IT部門追蹤軟件應用程序的使用也在日漸增加,以便不同的業務部門支付其公平的IT投入份額。同樣,任何跨越公司邊界實現業務流程自動化的應用程序也必須擁有一個計劃,用來解決發送者和接收者之間的拒付糾紛。在調用程序和被調用程序時的一致消息日志記錄,是處理這些審核和記帳需求的關鍵。IT經理如何確保所有的開發人員在所有的入口點和退出點都實現正確級別的日志記錄?對于使用XML加密進行加密的消息,您如何確保當消息被清除時沒有記錄(這會破壞公司的保密政策)?對于由打包應用程序本身所發布的Web services,如何完成消息日志記錄?
確保始終如一地執行安全策略
即使在簡化的示例應用程序中,一份文檔也會在應用程序組件間傳送多次。當調用createOrder操作時,客戶端程序發送一個P.O;一旦該訂單被提交,這個PO最終會被送到不同的Web service。為了確保端到端的保密性和完整性,開發人員可以使用WS-Security、XML加密和XML簽名(BEA WebLogic 8.1支持WS-Security)。擁有這些能力是很好的,但是如果沒有堅持使用,就沒有購買意義了。安全構架師如何確保所有的企業間Web services在處理消息前都驗證了消息的數字簽名呢?
在開始將松散耦合的、分布式的應用程序向行業范圍中部署時,這只是IT人員需要應對的某些新挑戰。為了簡潔,這里我們選擇只關注幾個關鍵問題。順便還提及了很多其他問題——包括實現故障切換和處理傳輸層故障的重試規劃、實現單點登錄和服務版本控制。
評估用于管理SOA部署的新管理工具
現在,您應該確信成功部署Web服務最初需要處理一大堆棘手的管理問題。即使現今您的Web services仍然處于試驗階段,您也不應該推遲考慮管理方面的問題。好消息就是很多管理工具多已著眼于此。壞消息也是這樣。很多新的Web services管理工具、應用服務器管理工具、系統管理工具、XML路由工具、管理器的管理工具等等,“Web services”這個單詞似乎要揭露出它所有的數據表。
下面看一看為管理您所創建的、新的面向服務的應用程序找尋評估工具時要注意的幾件事情。
它能非侵入地監視所有WebLogic控件和Web Services的調用嗎?
在BEA WebLogic 8.1中,使用控件訪問所有外部資源。這樣監視延遲和所有控件調用的輸入/輸出的管理工具就能可視化地提供應用程序依賴的所有組件。該工具應該能“探察”任何Web services,而不管用于發布這些服務的平臺是什么(J2EE應用服務器、.NET、集成代理或者打包應用程序)。監視控件和分布式Web services必須以一個非侵入的方式來完成。這至少意味著應該能夠插入管理層而無需改變任何應用程序。但是管理層應該超越此要求,還應該能夠不侵入應用程序的運行時行為。例如,管理層應該利用處理中的SOAP偵聽機制,在任何可能的情況下都減少延遲開銷并避免添加新的故障點。
它能跟蹤端到端事務流和會話嗎?
為了使您能夠排除分布式應用程序故障,管理工具必須能夠實時跟蹤應用程序的執行。該跟蹤必須包括應用程序用到的所有控件。
BEA Weblogic 8.1簡化了異步的、會話的、應用程序到應用程序交互的創建——為了跟蹤這些會話,管理工具必須能夠標識和關聯那些共享會話環境的消息,并具備可視化表示執行時間線的能力。進行故障排除的同時,您應該能夠從一個會話中所涉及的所有Web服務調用的高層次視圖向下查看,直到關于該服務內所用任何控件的執行細節。一旦問題限定到特定的控件,會話系統管理工具就可以用于調試。然后,您可以垂直向下移動執行,通過支持基礎架構的多個層,從Java對象到應用服務器,向下直到操作系統,最終到達到硬件服務器。
它能夠主動管理Web Services間的交互嗎?
為了確保持續地實施IT策略,如日志和安全,這些動作必須從應用程序代碼中提取出來,而用一個分離的策略管理層來自動執行。例如,開發人員無需再明確地編寫代碼來記錄Web service請求和響應消息。也不必編寫代碼來驗證數字簽名或者進行壓縮,或檢查病毒,或任何此類操作問題。相反,通過截取消息和主動地操縱消息內容,管理層應該負責強制實行策略。如果公司以后改變了策略,例如,決定只記錄消息頭部而不記錄所有消息內容,就無需更改代碼。一個簡單的配置改變就能夠獲得成功。
它能夠與您的WebLogic 8.1開發環境集成嗎?
從過去來看,應用程序已經開發和測試完畢后,工作通常集中在管理上。即使對于被動的監控工具這也不是最理想的。而對于使用主動的管理工具,這將是災難性的。有了需要攔截傳送中的消息并作用于消息的管理層,開發和管理之間的分裂消失了。需要在開發周期中先行解決管理問題,以便能夠以和生產中相同的方法執行所有的測試(功能和性能)。正如上面所討論的,主動管理工具幫助完成持久策略執行,方法是用中心配置的策略處理器替換隱藏在每個服務中的代碼。要在開發早期解決管理問題,并在處理安全和日志時使用配置替代編碼,您的管理工具必須與您的WebLogic開發工具和您的端到端程序開發過程完美地集成。
在全異的遠程服務之間,它能夠為安全/QOS策略提供單點配置嗎?
隨著應用程序內Web services使用的膨脹,多個應用程序將會發布和使用Web services。管理工具應該能夠允許您集中查看,為環境中的任何服務提供監控、安全和QOS策略,并能向多個服務“廣播”管理策略的更新,而不必本地逐臺服務器和逐個服務地進行配置。
Confluent 的Web Services管理解決方案
Confluent提供了一個管理工具,可將其插入到BEA WebLogic Workshop IDE中,并添加了易用的管理功能。它允許您自動監視Web services和所有組成控件的執行,而無需任何額外的編碼。
讓我們在運行中快速了解這個工具,使用它管理我們的示例應用程序。
一旦您啟動了BEA的CORE,您會注意到在BEA WebLogic Workshop環境下半部分的一些其他窗格(參見圖2)。在右下方,有一個Configure Policy窗格,可使用它定義運行策略,以強制實行Web service,如日志、簽名檢查或者調用第三方SAML提供商。左下方窗格顯示了訂單管理Web service使用的控件——dbOrderManagement、serviceNotify和ejbAccount。單擊相應的控件可切換監視控件。
圖2:Runtime View選項卡
點擊Runtime View 選項卡可顯示所有與服務相關的會話細節。例如,在5422毫秒的時間內成功完成一個會話(表示一個訂單事務開始于13.38.39)。用戶也可以回顧會話、簡單的操作、成功和失敗的數目。
Operations 選項卡能夠顯示所選會話的詳細信息(參見圖3)。它顯示了所選會話中調用的所有Web service操作。它用一個圖形顯示了這些操作、它們的時間、延遲和狀態的次序。注意payload窗格同時顯示了觸發執行操作的SOAP消息和發回請求者的SOAP結果。
圖3:Operations選項卡
點擊Controls 選項卡可以看到更多關于所選操作內所調用的控件細節。對于每個被調用的控件,它的名稱、類型、操作、狀態和延遲都顯示在表格和圖中。
總之,Runtime View 窗格允許程序員分析Web service在多個層次的運行時行為:從會話層到操作層,最后到底層控件。
要了解關于Confluent用于BEA Weblogic的Web services管理軟件的更多信息,可以查閱BEA Premier Component Gallery:http://dev2dev.bea.com/products/wlworkshop81/partners/index.jsp,或者查閱www.confluentsoftware.com。
結束語
除了WSDL、UDDI和SOAP,還有很多面向服務的應用程序。BEA WebLogic 8.1提供了一個全面的平臺,用以開發企業級面向服務的應用程序。但是請記住,要盡早開始考慮管理問題。在過去忽略這一說教可能不是致命的。但現在是。
示例應用程序的源代碼見:www.sys-con.com/weblogic/sourcec.cfm。
附錄:示例應用程序源代碼
import examples.ejb20.basic.containerManaged.Account;
public class OrderManagementService implements com.bea.jws.WebService
{
/**
* EJB holding user accounts
* @common:control
*/
private ejbControl.AccountEJBControl ejbAccount;
/**
* The remote service where notifications of committed orders are sent
* @common:control
*/
private service.NotifyOrderServiceControl serviceNotify;
/**
* The orders database control
* @common:control
*/
private database.OrderManagementDB dbOrderManagement;
// The fee charged when ever a transaction is performed
private final int BASIC_FEE = 10;
/**
* @common:operation
*/
public String queryOrderStatus(String inAccountNumber, String inOrderNumber)
throws Exception {
int result = dbOrderManagement.checkOrder(inOrderNumber);
withdraw(inAccountNumber, BASIC_FEE);
return String.valueOf(result);
}
/**
* Created a new order
* @common:operation
* @jws:conversation phase="start"
*/
public void createOrder(String inAccountNumber, String inOrderNumber)
throws Exception {
dbOrderManagement.insertOrder(inOrderNumber);
withdraw(inAccountNumber, BASIC_FEE);
}
/**
* Commits a new order
* @common:operation
* @jws:conversation phase="finish"
*/
public void commitOrder(String inAccountNumber, String inOrderNumber)
throws Exception {
serviceNotify.notifyOrder(inOrderNumber);
withdraw(inAccountNumber, BASIC_FEE);
}
/**
* Withdraws money from a customer account
*/
private double withdraw(String accountKey, double withdrawAmount)
throws Exception {
return getAccount(accountKey).withdraw(withdrawAmount);
}
/**
* <p>Helper function -- returns an EJB account for a given key<p>
*
* @return An Account object
*/
private Account getAccount(String accountKey)
throws Exception {
return ejbAccount.findByPrimaryKey(accountKey);
}
}
原文出處
http://www.sys-con.com/story/?storyid=42997&DE=1
| ?作者簡介 | |
| ? | Amit Dayal是Confluent Software公司產品管理方面的副主管,該公司是Web services管理軟件方面的主要提供商。Amit在企業軟件方面有超過14年的經驗。在為Confluent公司工作之前,Amit是interKeel公司的創始人,該公司在Web services管理類中是一個先鋒。 |
| ? | Didier Guzzoni是現在是Confluent Software公司的高級軟件工程師。他于1996年畢業于瑞士聯邦理工大學,獲得軟件工程碩士學位。他曾是VerticalNet的研究工程師,在那里他參加了OSM項目,該項目是促進和協調Web Services的基礎結構。他作為一名研究工程師在SRI(Stanford Research Institute)International公司開始其職業生涯,從事OAA(Distributed software architecture)項目,并為CHIC! Lab(Computer Human Interface Center)工作,他的研究重點是未來多模式用戶界面。他還曾積極參與移動機器人項目,其中機器人被認為是實施團隊協作以執行合作任務的物理載體。 |
轉載于:https://www.cnblogs.com/fhway/archive/2007/05/31/2461756.html
總結
以上是生活随笔為你收集整理的简化管理面向服务的应用程序的创建的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [导入]使用tomcat5.0自带的连接
- 下一篇: JS 控制RadioButtonList