葉海松
【摘要】文章分析了軟件整合的需求和面向服務構架的特點,論述了如何使用基于面向服務構架的方法對軟件進行模塊級別的整合,以達到模塊重用和降低開發(fā)成本的目標;并通過在Moodle的資源頁面中嵌入簡單的代碼調用另一平臺的評分模塊服務,提供了面向服務構架的整合實例。
【關鍵詞】軟件整合;面向服務構架;學習管理系統(tǒng);Web服務
【中圖分類號】G40-057 【文獻標識碼】A 【論文編號】1009—8097(2009)08—0102—03
一 整合問題的產(chǎn)生
現(xiàn)代社會對軟件的需求不斷提高,單個的復雜系統(tǒng)所消耗的人力和物力資源急劇上升。為了對付持續(xù)改變的需求,軟件變得越來越復雜,而軟件使用者和開發(fā)者的持續(xù)投入,使得軟件的成本越來越高。在這樣的背景下,軟件整合,即用多個小系統(tǒng)的整合來代替一個超級復雜的單一系統(tǒng)的方法逐漸受到人們的重視[1]。
在上海師范大學教育技術系實施的“現(xiàn)代教育技術網(wǎng)絡課程平臺”項目中就遇到了這種情況。在有限的經(jīng)費投入下,項目使用開源的學習管理系統(tǒng)Moodle在構建了一個在線學習平臺,Moodle能夠滿足我們大部分的需求,包括課程管理、用戶管理、資源管理、在線測試和使用報告等。但在用戶需求中有一條在Moodle的核心組件沒有提供,即對課程資源的投票評價功能(如圖1),項目要求能夠讓用戶對資源進行無記名的評分,然后提交結果,同時會看到總體的評分情況。
這個功能在另一套成熟資源庫平臺中,已有現(xiàn)成的功能模塊。但是這個資源庫并不是用PHP來實現(xiàn)的,而是使用ASP.NET實現(xiàn)的。如果按照Moodle的模塊設計接口,沒有辦法直接將已有的ASP.NET的模塊嵌入Moodle[2]。因此需要尋找一種能夠重復使用既有代碼又能在兩個系統(tǒng)中保持松耦合關聯(lián)的方法,讓 Moodle能夠完全調用原有的ASP.NET的模塊,只增加少量的PHP代碼來實現(xiàn)整合工作。并且新增加的功能不影響原系統(tǒng)的穩(wěn)定性,即便新功能失效也不影響系統(tǒng)的運行。在研究各種整合方法后,我們選擇了面向服務的整合框架。
二 面向服務的整合思路
1 面向服務的特點
整合的基礎是建立系統(tǒng)之間的對話機制,面向服務的構架提供了一種基于消息的對話機制。基于消息的模式通過傳遞數(shù)據(jù)塊來實現(xiàn)關聯(lián),這些數(shù)據(jù)塊與原系統(tǒng)的運行邏輯無關,這樣的數(shù)據(jù)塊統(tǒng)稱稱作“消息”[3],如圖2。
圖2中網(wǎng)絡右側是服務提供者,它通過接口的形式暴露在網(wǎng)絡上,并使用標準的服務描述語言進行描述(如WSDL)。網(wǎng)絡左側的使用者通過接口和描述服務的本地代理來訪問服務。在調用過程中,網(wǎng)絡上傳遞的就是消息。消息的格式可以是任意的,由設計和開發(fā)者創(chuàng)建。在這里采用的是標準的SOAP協(xié)議提供的XML格式的消息。在接口的背后,服務的具體實現(xiàn)和調用的具體技術與接口定義是無關的,只要接口返回的是協(xié)商好的消息格式即可[4]。為了最大限度的利用現(xiàn)有的應用程序功能組件,這里將原來的應用組件以WebService的標準方式進行接口封裝,并發(fā)布在服務器上。
2 整合實例結構
這里所碰到的整合問題是一個典型的異構技術平臺的整合問題。Moodle使用的是PHP,而另一個評分模塊是運行在ASP.NET上的,PHP不能直接調用ASP.NET平臺的組件。使用標準的Web Service則可以解決這個調用問題。圖3的結構解釋了這個整合的框架。
圖3中,我們將原來系統(tǒng)中的Rating模塊利用ASP.NET重新進行Web Service的封裝,使用標準的接口暴露Rating模塊中的投票評價方法。RatingDAL為原系統(tǒng)中負責評分功能的數(shù)據(jù)層組件。這里僅通過增加服務層組件RatingService對其進行方法的調用,不改變它原有的接口。因為沒有對原來的Rating模塊作修改,因此不會引起原系統(tǒng)的運行問題。而Moodle中的資源頁面作為服務的消費者,可通過標準的SOAP訪問RatingService[5]。圖3中的RatingService將作為一個獨立的服務存在,可以被除Moodle以外的其它程序調用。原來使用RatingDAL組件的模塊也可以通過RatingService進行調用。在這個構架中,兩個平臺所使用的技術不再是主要的矛盾了。
三 技術實現(xiàn)
1 Web服務的封裝和發(fā)布
在服務實現(xiàn)上,考慮到PHP的交互,我們選擇了使用ASP.NET實現(xiàn)基于SOAP標準的Web服務[6][7]。我們通過RatingService,聲明了必須的接口,然后通過對RatingDAL的調用完成封裝。下面是RatingService的封裝代碼,可以看到代碼中完全是對原RatingDAL的封裝,沒有任何具體的數(shù)據(jù)庫訪問代碼。完成后在IIS上發(fā)布,測試通過。
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class RatingService : System.Web.Services.WebService
{
[WebMethod]
//對原模塊的調用,提交用戶的評分public int Rating(string applicationid, int resourceid, int score){
RatingDAL dal = RatingDAL.GetInstance();
return dal.AddRatingRecord(applicationid,resourceid,score);}
[WebMethod]
//對原模塊的調用,得到具體資源的平均分
private int GetAverageScore(string applicationid, int resourceid)
{
RatingDAL dal = RatingDAL.GetInstance();
return dal.GetStatistic(applicationid,resourceid);
}
[WebMethod]
//對原模塊的調用,得到具體資源評分人數(shù)
private int GetTotalUsers(string applicationid, int resourceid)
{
RatingDAL dal = RatingDAL.GetInstance();
return dal.GetStatistic(applicationid,resourceid);
}
//其它的WebMethods
//……
}
在這個版本的RatingService中,每個需要進行投票統(tǒng)計的應用程序必須先手動的生成一個GUID作為ApplicationID。以后每次記錄投票和統(tǒng)計時都必須提供相應的ApplicationID。
2 Moodle的Web服務調用
在Moodle調用方法上,可選擇PHP調用Web服務,或者使用JavaScript進行Ajax調用??紤]到跨域訪問的安全性問題,我們選擇了使用PHP的PEAR_SOAP模塊。
在Moodle中我們找到顯示資源的頁面,moodlemod esourceview.php文件。我們在該文件中使用HTML設計如圖1的界面,然后增加Web服務的調用代碼。
首先,利用soapclient對象訪問RatingService,獲得其接口方法,并創(chuàng)建服務代理,代碼如下:
表2 WebService聲明
include(“SOAP/Client.php”);
//設置ApplicationID,這個ID是手工注冊生成的
$applicationid=”3c4b5694-339c-4fe6-8248-4409f2eb1050$wsdl=new”;
//獲取自動生成的WSDL代碼
$wsdl=SOAP_WSDL(“http://localhost/Rating/RatingService.asmx?WSDL”);
//根據(jù)$wsdl生成RatingService的代理$soapclient
$soapclient=$wsdl->getProxy();
然后,進行投票記錄,通過$soapclient調用Rating方法,記錄投票的分值:
最后,獲取評分情況,存儲在變量中,供下文應用:
表4 WebService的數(shù)據(jù)讀取方法調用
//調用RatingService的方法,分別得到平均分和評分用戶數(shù)
$average=$soapclient->GetAverageScore($applicationid, $id);
$totalusers=$soapclient->GetTotalUsers($applicationid, $id);
……
//在相應位置顯示平均得分和參與用戶數(shù)
最終結果如圖4所示。
上面的實例中Moodle本身并不是面向服務構架,但是PHP有支持Web Service調用的模塊,為實施整合提供了條件。實例中,我們沒有對原評價模塊作過多的調整,只是將它通過Web Service進行封裝發(fā)布,實現(xiàn)了服務和具體調用的分離,不僅為Moodle提供了服務同時也可以向其它應用程序提供評分的服務。上述實例在本地機Moodle1.9/PHP/Apache/MySql/Windows和ASP.NET2.0/IIS5/MSSQL/Windows環(huán)境下調試通過。
3 進一步的研究目標
文中的兩個系統(tǒng)是在同一個服務器上運行的,因此并沒有涉及到有關安全性的問題。在后續(xù)的應用中,可能會遇到分布式的調用,因此對WebService安全性的控制將是下一步的研究目標。
四 小結
綜上所述,軟件整合的目的是充分重用現(xiàn)有的軟件,減少軟件維護和開發(fā)的成本。要達到這個目的,整合的方法是很重要的,不然很有可能會和預期的目標被道而馳。本文研究的面向服務的軟件整合方法,在使用不同技術實現(xiàn)的軟件中,通過基于消息的通訊來實施整合,大大減少了軟件之間的依賴性,提高了整合的可靠性。當然,任何方法都不是萬能的,具體的整合過程還牽涉到原有系統(tǒng)的開發(fā)框架、目標軟件本身的可靠性和可擴展性都等因素,在實施軟件整合時要結合各種實際情況進行綜合的研究。