摘 要:在以Car構(gòu)件為基礎(chǔ)的嵌入式研究領(lǐng)域中,構(gòu)建面向Web服務(wù)的Car構(gòu)件運(yùn)行容器一直是研究的熱點(diǎn)。文章闡述了面向Web服務(wù)的Car構(gòu)件運(yùn)行容器的特點(diǎn),介紹了構(gòu)件技術(shù)以及“和欣”操作系統(tǒng),討論了構(gòu)件化的Web Container的分層設(shè)計(jì)理念,闡述了在“和欣”操作系統(tǒng)上實(shí)現(xiàn)的基于構(gòu)件的Car Faces系統(tǒng)。該系統(tǒng)充分發(fā)揮了構(gòu)件技術(shù)的優(yōu)勢(shì),并具有簡(jiǎn)單、高效可配置等特點(diǎn),很好地滿(mǎn)足了以Car構(gòu)件為基礎(chǔ)的Web應(yīng)用程序的需求。
關(guān)鍵詞:嵌入式系統(tǒng);Web容器;構(gòu)件技術(shù);和欣
0 引言
基于構(gòu)件的軟件工程是實(shí)現(xiàn)高生產(chǎn)率、低維護(hù)費(fèi)用和高可靠軟件產(chǎn)品的關(guān)鍵技術(shù),在這種工程模式下,按照一定的架構(gòu)把構(gòu)件組裝起來(lái)成為軟件開(kāi)發(fā)的核心工作。目前絕大多數(shù)傳統(tǒng)的嵌入式應(yīng)用仍然是采用強(qiáng)類(lèi)型的系統(tǒng)編程語(yǔ)言(比如c和Java等)來(lái)完成對(duì)構(gòu)件的組裝。對(duì)于一個(gè)應(yīng)用程序僅需改變應(yīng)用的表現(xiàn)層,而不必大量修改構(gòu)件功能的情況,傳統(tǒng)開(kāi)發(fā)模式所要經(jīng)過(guò)的修改一編譯一運(yùn)行的過(guò)程就顯得效率低下,開(kāi)發(fā)周期長(zhǎng)和不能隨需求靈活變化的弱點(diǎn)就暴露了出來(lái);另外,采用強(qiáng)類(lèi)型語(yǔ)言來(lái)實(shí)現(xiàn)功能構(gòu)件并將這些構(gòu)件組裝成應(yīng)用程序,將造成構(gòu)件之間的強(qiáng)耦合關(guān)系,會(huì)使得開(kāi)發(fā)維護(hù)的難度加大。
為了實(shí)現(xiàn)構(gòu)件問(wèn)的松散耦合,提高開(kāi)發(fā)維護(hù)的效率和適應(yīng)需求變化的能力,有必要在應(yīng)用的開(kāi)發(fā)中引入新的開(kāi)發(fā)模式,采用新的構(gòu)件組裝技術(shù)來(lái)適應(yīng)新形勢(shì)的發(fā)展。考慮到腳本語(yǔ)言的語(yǔ)法簡(jiǎn)單、功能強(qiáng)大、易學(xué)易用的特點(diǎn),本文基于CAR構(gòu)件技術(shù),提出了新的XML+CAR+其他腳本語(yǔ)言(Javascript、Ruby等)的Car Faces編程范式,實(shí)現(xiàn)了更為靈活的構(gòu)件組裝機(jī)制,為在“和欣”上的應(yīng)用開(kāi)發(fā)提供了更加快速、靈活的編程范式。另外,手機(jī)上網(wǎng)已成為一種潮流,采用原始的模型勢(shì)必導(dǎo)致服務(wù)器高負(fù)載運(yùn)轉(zhuǎn),所以也需要一種新的架構(gòu)模式,用來(lái)解決手機(jī)上網(wǎng)所帶來(lái)的新問(wèn)題。
1 構(gòu)件技術(shù)及“和欣”操作系統(tǒng)
構(gòu)件技術(shù)是在面向?qū)ο蠹夹g(shù)的基礎(chǔ)上發(fā)展起來(lái)的。面向?qū)ο蠹夹g(shù)通過(guò)類(lèi)的封裝和繼承成功實(shí)現(xiàn)了代碼級(jí)的復(fù)用。類(lèi)的封裝性,實(shí)現(xiàn)數(shù)據(jù)抽象和信息隱蔽;而類(lèi)的繼承,提高了代碼復(fù)用性。但是面向?qū)ο蟮膹?fù)用脫離不了代碼復(fù)用的本質(zhì),對(duì)象之間的關(guān)系在編譯時(shí)被固定,模塊之間的關(guān)系是靜態(tài)的,無(wú)法解決軟件動(dòng)態(tài)升級(jí)和軟件模塊動(dòng)態(tài)替換。
構(gòu)件技術(shù)通過(guò)二進(jìn)制的封裝以及動(dòng)態(tài)鏈接技術(shù)解決軟件的動(dòng)態(tài)升級(jí)和軟件的動(dòng)態(tài)替換問(wèn)題。面向構(gòu)件技術(shù)對(duì)一組類(lèi)的組合進(jìn)行封裝,它代表完成一個(gè)或多個(gè)功能的特定服務(wù),同時(shí)為用戶(hù)提供多個(gè)接口。整個(gè)構(gòu)件隱藏了具體的實(shí)現(xiàn),只用接口提供服務(wù)。這樣,在不同層次上,構(gòu)件均可以將底層多個(gè)邏輯組合成高層次上的粒度更大的新構(gòu)件。構(gòu)件之間通過(guò)約定的接口進(jìn)行數(shù)據(jù)交換和信息傳遞,構(gòu)件的位置是相互透明的,可以在同一個(gè)用戶(hù)進(jìn)程空間,也可以在不同的用戶(hù)進(jìn)程空間,甚至在不同的機(jī)器上;而且不同的構(gòu)件可以用不同的語(yǔ)言編寫(xiě),只要它們符合事先約定的構(gòu)件規(guī)范。
“和欣”操作系統(tǒng)是科泰世紀(jì)公司開(kāi)發(fā)的具有自主知識(shí)產(chǎn)權(quán)、基于微內(nèi)核和構(gòu)件技術(shù),支持構(gòu)件化應(yīng)用的嵌入式操作系統(tǒng)?!昂托馈辈僮飨到y(tǒng)對(duì)CAR構(gòu)件技術(shù)提供了內(nèi)置的支持。
CAR構(gòu)件技術(shù)是面向構(gòu)件編程的編程模型。它規(guī)定了一組構(gòu)件間相互調(diào)用的標(biāo)準(zhǔn),使得二進(jìn)制構(gòu)件能夠自描述,能夠在運(yùn)行時(shí)動(dòng)態(tài)鏈接,進(jìn)行系統(tǒng)升級(jí)的時(shí)候也只需要升級(jí)相關(guān)的構(gòu)件即可,具有可靠性、容錯(cuò)性、安全性,代表了軟件工廠化生產(chǎn)的方向。
2 構(gòu)件化Car Faces的設(shè)計(jì)
為了能滿(mǎn)足新的需求,如圖1所示,整個(gè)系統(tǒng)的服務(wù)器端分為四層:呈現(xiàn)層、導(dǎo)行層、驗(yàn)證層和業(yè)務(wù)處理層。另外,底層采用Car構(gòu)件支撐各個(gè)環(huán)節(jié)的運(yùn)行和交互。
圖1 Car Faces業(yè)務(wù)邏輯架構(gòu)
其中,呈現(xiàn)層實(shí)現(xiàn)視圖的相互轉(zhuǎn)換:(1)將頁(yè)面提交的html代碼還原成Car Faces樹(shù),并以xml樹(shù)形格式呈現(xiàn)。同時(shí)這一層負(fù)責(zé)將樹(shù)上的各節(jié)點(diǎn)值或組件與后臺(tái)支撐的Car構(gòu)件動(dòng)態(tài)綁定。(2)將頁(yè)面導(dǎo)行系統(tǒng)提交的Car Faces樹(shù)轉(zhuǎn)換成html代碼表示,整個(gè)系統(tǒng)通過(guò)這一層實(shí)現(xiàn)服務(wù)器和客戶(hù)的直接交互。
當(dāng)呈現(xiàn)層從客戶(hù)端接收完數(shù)據(jù)并轉(zhuǎn)化成Car Faces代碼后,就將轉(zhuǎn)換結(jié)果遞交到驗(yàn)證層。驗(yàn)證層從樹(shù)的根結(jié)點(diǎn)遍歷整棵樹(shù)并調(diào)用綁定到各結(jié)點(diǎn)的相應(yīng)的驗(yàn)證程序。如果一旦遇到錯(cuò)誤信息,驗(yàn)證程序?qū)阉玫降腻e(cuò)誤信息排隊(duì)。驗(yàn)證結(jié)束后根據(jù)決策代碼決定是否向下層提交或者直接調(diào)用Response.finish()將錯(cuò)誤信息呈現(xiàn)給客戶(hù)端。驗(yàn)證過(guò)程中,我們可以調(diào)用默認(rèn)程序EzValidate,也可以調(diào)用用戶(hù)自定義為結(jié)點(diǎn)綁定的驗(yàn)證程序。驗(yàn)證程序的實(shí)現(xiàn),也是通過(guò)調(diào)用各后臺(tái)支撐Car構(gòu)件來(lái)完成的。
如果驗(yàn)證程序驗(yàn)證結(jié)束,將進(jìn)入業(yè)務(wù)處理模塊。在這一模塊中我們定義了許多業(yè)務(wù)Car構(gòu)件,通過(guò)調(diào)用業(yè)務(wù)Car構(gòu)件的應(yīng)用程序,可以完成對(duì)用戶(hù)數(shù)據(jù)的處理。業(yè)務(wù)處理模塊根據(jù)客戶(hù)端產(chǎn)生的事件調(diào)用相應(yīng)的業(yè)務(wù)處理程序,最終得到處理結(jié)果。處理完成后將處理結(jié)果提交業(yè)務(wù)導(dǎo)行模塊。
導(dǎo)行層次是為客戶(hù)呈現(xiàn)具體頁(yè)面而設(shè)計(jì)的。在這一層里,我們通過(guò)業(yè)務(wù)層的運(yùn)行結(jié)果或者錯(cuò)誤信息選擇適當(dāng)?shù)捻?yè)面信息返回給客戶(hù)。用戶(hù)根據(jù)返回信息可以知道操作的結(jié)果。
所以在整個(gè)架構(gòu)的設(shè)計(jì)過(guò)程中,構(gòu)件容器占據(jù)著至關(guān)重要的作用。
3 Car Faces生命周期
圖2為我們展示了car Faces請(qǐng)求響應(yīng)的生命周期。
圖2 Car Faces生命周期
接到客戶(hù)端的請(qǐng)求后,首先將請(qǐng)求視圖轉(zhuǎn)換為Car Faces樹(shù)狀視圖。在轉(zhuǎn)換過(guò)程中可能會(huì)出現(xiàn)轉(zhuǎn)換異?,F(xiàn)象。當(dāng)發(fā)生了異常后,應(yīng)用程序捕獲異常,根據(jù)錯(cuò)誤類(lèi)型作相應(yīng)的處理。
呈現(xiàn)結(jié)束后,根據(jù)轉(zhuǎn)換的結(jié)果樹(shù)的值動(dòng)態(tài)綁定到相應(yīng)的構(gòu)件上,并在此作一些初步處理。
上面兩步完成后,生命周期將進(jìn)入下一個(gè)階段:驗(yàn)證處理階段。在驗(yàn)證處理階段將對(duì)Car Faces視圖的每個(gè)結(jié)點(diǎn)實(shí)行驗(yàn)證處理。一旦出現(xiàn)錯(cuò)誤,處理程序立即捕獲錯(cuò)誤,并根據(jù)錯(cuò)誤類(lèi)型實(shí)施相應(yīng)的處理。
以上各階段工作完成后,將進(jìn)行的就是核心工作:業(yè)務(wù)處理。業(yè)務(wù)處理調(diào)用業(yè)務(wù)處理程序?qū)D(zhuǎn)換后的數(shù)據(jù)進(jìn)行相應(yīng)的處理,進(jìn)而達(dá)到為客戶(hù)服務(wù)的目的。在這一階段也可能會(huì)有意想不到的異常發(fā)生。一旦發(fā)生異常,將有異常處理程序做相應(yīng)的處理。
業(yè)務(wù)處理完畢后,處理結(jié)果樹(shù)被遞交給頁(yè)面導(dǎo)行。頁(yè)面導(dǎo)行根據(jù)業(yè)務(wù)處理結(jié)果做出抉擇,最終確定要向用戶(hù)返回哪個(gè)頁(yè)面。
上面所有處理完成后,Car Faces生命周期也進(jìn)入了最后的階段:頁(yè)面呈現(xiàn)。在這一階段,將根據(jù)頁(yè)面導(dǎo)行程序所遞交的結(jié)果對(duì)結(jié)果樹(shù)實(shí)施頁(yè)面呈現(xiàn)。同時(shí),服務(wù)器端各種組件給用戶(hù)呈現(xiàn)可識(shí)別代碼,最終以html代碼的形式返回給客戶(hù)。
4 Car Faces在“和欣”上的實(shí)現(xiàn)
完整的Car Faces架構(gòu)可以表示為圖3
圖3 Car Faces系統(tǒng)架構(gòu)
(1)最外層是Car Faces運(yùn)行環(huán)境(Runtime),負(fù)責(zé)初始化和釋放Car Faces應(yīng)用所需資源。
(2)內(nèi)部頂層是腳本語(yǔ)言及其配套設(shè)施。這一層相當(dāng)于提供了對(duì)MVC中View的支持。
XML/JavaScriptt/Other Scripts提供了多種描述Car Faces應(yīng)用的形式,讓開(kāi)發(fā)人員能夠靈活利用各種腳本語(yǔ)言的優(yōu)勢(shì)。
(3)SCI(script Callable Interface)是腳本語(yǔ)言與CAR構(gòu)件系統(tǒng)通信的橋梁。這一層相當(dāng)于提供了對(duì)MVC中Controller的支持。
(4)CFSTL(Car Faces Standard Tag Library)是Car Faces提供的標(biāo)準(zhǔn)標(biāo)簽庫(kù),其中Car Faces提供了標(biāo)準(zhǔn)的自定義組件。CTL(Custom Tag Library)是用戶(hù)自定義標(biāo)簽庫(kù)。頁(yè)面設(shè)計(jì)人員能夠使用這兩個(gè)標(biāo)簽庫(kù)所提供的標(biāo)簽。
(5)CAR構(gòu)件系統(tǒng)。它是服務(wù)的提供者。這一層相當(dāng)于提供了對(duì)MVC中Model的支持。在這一層,實(shí)現(xiàn)了各種Car構(gòu)件。這些構(gòu)件支持著上層的業(yè)務(wù)邏輯能夠順暢運(yùn)行。
本Car Faces架構(gòu)集成了XML-GIue特點(diǎn)。
通過(guò)以上論述,可以看出使用Car Faces具有諸多優(yōu)點(diǎn):(1)Car構(gòu)件直接運(yùn)行在本地機(jī)器上,某些操作甚至可以直接控制硬件,所以其速度相對(duì)較快。(2)Car Faces實(shí)現(xiàn)了清晰的分層概念,不像AJXA只局限于技術(shù)的實(shí)現(xiàn)。(3)組件的可擴(kuò)展性好。在本系統(tǒng)中,提供了許多標(biāo)準(zhǔn)組件,但同時(shí)也給用戶(hù)提供了組件定義接口,使用戶(hù)開(kāi)發(fā)出自己的組件。(4)采用本體系容易實(shí)現(xiàn)瘦客戶(hù)端。一些簡(jiǎn)單的邏輯判別可在客戶(hù)端直接完成,比如采用Script語(yǔ)言提供驗(yàn)證機(jī)制。這些特點(diǎn)為在手機(jī)上實(shí)現(xiàn)快速網(wǎng)絡(luò)瀏覽器提供了捷徑。
5 結(jié)束語(yǔ)
本文采用科泰公司的CAR構(gòu)件技術(shù)在和欣操作系統(tǒng)上實(shí)現(xiàn)了一代新的網(wǎng)絡(luò)開(kāi)發(fā)架構(gòu)。該體系中的一些簡(jiǎn)單業(yè)務(wù)邏輯可以以Script的形式直接嵌套在客戶(hù)端代碼中。另外本架構(gòu)采用了清晰的分層概念,使得開(kāi)發(fā)和調(diào)試更加快捷方便。借助CAR構(gòu)件的元數(shù)據(jù)和自描述信息,在“和欣”操作系統(tǒng)上使用JavaScript、Ruby等腳本語(yǔ)言和XML文件動(dòng)態(tài)地編寫(xiě)圖形界面成為可能。使用構(gòu)件化的方法開(kāi)發(fā)圖形系統(tǒng)也可以推廣到其他支持構(gòu)件的操作系統(tǒng)上。
下一步的工作是完善系統(tǒng)的構(gòu)件粒度劃分,同時(shí)優(yōu)化各步算法,以提高Car Faces系統(tǒng)的效率。
注:本文中所涉及到的圖表、注解、公式等內(nèi)容請(qǐng)以PDF格式閱讀原文。