作者:Anders小明
2009年5月5日
 

一、什么是基礎(chǔ)平臺

基礎(chǔ)平臺對應(yīng)于業(yè)務(wù)應(yīng)用,主要處理技術(shù)問題,是為業(yè)務(wù)應(yīng)用提供技術(shù)支撐以及技術(shù)方案的模塊或者組件。其目的是使得應(yīng)用組件可只關(guān)注于業(yè)務(wù)邏輯,而不考慮或者少考慮技術(shù)問題。

基礎(chǔ)平臺通常包括如下:基礎(chǔ)功能,開發(fā)類庫,開發(fā)模式以及開發(fā)部署工具。

二、為何要基礎(chǔ)平臺

應(yīng)用系統(tǒng)的設(shè)計(jì)可以說是將一個業(yè)務(wù)語言翻譯成程序語言的過程,這個過程同時處理兩個內(nèi)容:業(yè)務(wù)和技術(shù)。

1. 學(xué)習(xí)業(yè)務(wù),編寫的代碼符合用例的流程;

2. 學(xué)習(xí)技術(shù),編寫的代碼符合技術(shù)平臺的規(guī)范和要求。

這里不同底層技術(shù)的難易度不同,導(dǎo)致學(xué)習(xí)成本、開發(fā)成本和應(yīng)用成本也不同。同時對于一個有較長生命周期的軟件項(xiàng)目或者產(chǎn)品,其依賴的底層技術(shù)的升級也會帶來相應(yīng)的維護(hù)成不

面對特定領(lǐng)域的軟件項(xiàng)目或者產(chǎn)品,其所依賴的底層技術(shù)的廣度和深度相對穩(wěn)定,基礎(chǔ)平臺可以填平或者減少技術(shù)層面的鴻溝。

那么,我們就面臨另一個問題,即:業(yè)界已經(jīng)存在大量優(yōu)秀的開源框架,我們?yōu)楹我A(chǔ)平臺。

首先,大量優(yōu)秀開源框架可以幫助我們,但是:

1.優(yōu)秀的開源框架通常偏向通用性,而面向特定領(lǐng)域的相關(guān)特性和功能還不支持;即便有面向特定領(lǐng)域的,其支持的特性還存在一定差異性;同時其未必支持相應(yīng)的基礎(chǔ)設(shè)施。

因此需要進(jìn)行二次開發(fā),以完善所需的基礎(chǔ)設(shè)施;

2.優(yōu)秀的開源框架在通用性支持廣泛,提供多種選擇,同時還有一定學(xué)習(xí)成本;而面向特定領(lǐng)域,需要的模式相對固定。

因此需要進(jìn)行定制,減少學(xué)習(xí)成本,提供開發(fā)模式,進(jìn)而提高開發(fā)效率;

3.技術(shù)升級的平穩(wěn)性,雖然優(yōu)秀的開源框架會盡量提供升級平穩(wěn)性,但是和產(chǎn)品目標(biāo)未必一致;也需要進(jìn)一步的測試工作;為了進(jìn)一步減少成本和風(fēng)險需要基礎(chǔ)平臺來處理相應(yīng)工作;

4.開源框架本身存在一定的缺陷,其修復(fù)有一定周期,和產(chǎn)品項(xiàng)目周期不同步。所以也需要做些修復(fù)和規(guī)避工作;

因此開發(fā)維護(hù)支持特定領(lǐng)域的基礎(chǔ)平臺存在客觀需要。更進(jìn)一步,基礎(chǔ)平臺是在關(guān)注點(diǎn)分離原則下的一個必然產(chǎn)物。

三、基礎(chǔ)平臺的考核

基礎(chǔ)平臺的考核需要依照其目標(biāo)以及特性來,包括:

1. 功能復(fù)用所帶來的成本降低。這個比較好衡量,直接使用復(fù)用。

2. 提高業(yè)務(wù)應(yīng)用的開發(fā)效率(新增或維護(hù))。這個指標(biāo)的衡量有一定難度,需要有兩個近似項(xiàng)目分別應(yīng)用不同基礎(chǔ)平臺,并在一個較長時期內(nèi)(比如2年,以便消除人員差異、具體功能差異性和難易度)。

3. 技術(shù)風(fēng)險的可控性,技術(shù)更新的平穩(wěn)性。這個指標(biāo)比較好衡量,需要收集開發(fā)過程中處理各種突發(fā)技術(shù)問題以及其解決成本。

4. 招聘成本。這個指標(biāo)也屬于比較好衡量的。

5. 架構(gòu)推廣。架構(gòu)推廣有賴于一個良好的基礎(chǔ)平臺,避免成為空中樓閣。

總之,基礎(chǔ)平臺的應(yīng)用將使開發(fā)和維護(hù)的成本具備平穩(wěn)性和收斂性。

四、基礎(chǔ)設(shè)施的選型

應(yīng)考慮幾點(diǎn):1. 商業(yè)角度的維護(hù)性和升級性;2. 組織的學(xué)習(xí)和管理能力;3. 基礎(chǔ)設(shè)施自身功能以及所支持的開發(fā)效率.以下是詳細(xì)要求:

客戶角度

成熟度要求

基礎(chǔ)設(shè)施是業(yè)界成熟方案;

性能要求

基礎(chǔ)設(shè)施滿足系統(tǒng)運(yùn)行的性能要求;

穩(wěn)定性要求

基礎(chǔ)設(shè)施版本穩(wěn)定,經(jīng)過大量測試;

環(huán)境性要求

基礎(chǔ)設(shè)施不會帶來額外的軟硬件兼容要求;

管理角度

開發(fā)成本要求

基礎(chǔ)設(shè)施的開發(fā)維護(hù)成本低,最好是業(yè)界成熟開源成果;

開發(fā)效率要求

維護(hù)成本要求

分析設(shè)計(jì)與開發(fā)之間的銜接性好;

測試成本要求

基于該基礎(chǔ)設(shè)施的應(yīng)用測試成本低,效率高;

培訓(xùn)招聘成本要求

網(wǎng)絡(luò)上的參考資料豐富性;基礎(chǔ)設(shè)施的流行度;

內(nèi)部員工學(xué)習(xí)培訓(xùn)成本低; 招聘外部員工成本低;

五、基礎(chǔ)平臺的構(gòu)建

選取基礎(chǔ)設(shè)施之后就根據(jù)需要進(jìn)行二次開發(fā)。包括如下內(nèi)容:

1. 平臺的核心

1.1 領(lǐng)域化支持

領(lǐng)域化的核心是建立業(yè)務(wù)相關(guān)的領(lǐng)域模型以及領(lǐng)域服務(wù)。

領(lǐng)域化支持需要三個方面:

A. 持久層支持:這個是領(lǐng)域化支持第一個要素,持久層能夠持久化并重建領(lǐng)域模型。

從持久化的方式來看可以分為文件形式和數(shù)據(jù)庫形式,以及二進(jìn)制形式或文本形式。由于數(shù)據(jù)庫的廣泛使用,ORM是常見的方式;但有時這不夠,我們可能還在此基礎(chǔ)上,進(jìn)一步擴(kuò)展提供二進(jìn)制或文本形式的持久化策略。

B. 業(yè)務(wù)邏輯支持:包括兩個方面:a. 領(lǐng)域模型涉及到的業(yè)務(wù)邏輯依賴;b.領(lǐng)域模型的并發(fā)支持;c. 領(lǐng)域服務(wù)的構(gòu)建;

C. 界面層支持:包括延遲加載以及長會話支持;

領(lǐng)域模型雖然包括所有的數(shù)據(jù),但考慮到性能,以及特定界面層所需要的數(shù)據(jù)通常是子集,因而界面層延遲加載異常重要。而領(lǐng)域模型跨界面?zhèn)鬟f,即長會話操作,也成為一種必然。

1.2 組件化支持

在組件化技術(shù)上,業(yè)界現(xiàn)有的規(guī)范和開源實(shí)現(xiàn),尤其OSGiSCA都提出了各自的組件規(guī)范,并且OSGiSCA有融合方案。但是總體上看,由于其關(guān)注的組件元素是最為經(jīng)典的,在實(shí)踐應(yīng)用上還需要有一定擴(kuò)展。

基礎(chǔ)平臺需要提供一個簡易的組件支持框架,可以支持掃描,識別并加載組件下的各種技術(shù)類型資源。包括:界面擴(kuò)展點(diǎn),國際化消息文件,應(yīng)用服務(wù),監(jiān)聽服務(wù),領(lǐng)域模型,配置數(shù)據(jù)(包括初始數(shù)據(jù)和運(yùn)行數(shù)據(jù)),以及數(shù)據(jù)庫表;

主要包括如下功能:

0. 組件的加載和運(yùn)行(依賴檢查);

分為兩個層次:部署期,即部署幾個組件就加載幾個組件;運(yùn)行期,根據(jù)運(yùn)行期信息,加載和運(yùn)行組件。部署期組件體系相對于運(yùn)行期較為簡單,實(shí)際上部署期可以完全不考慮組件的邊界,而直接加載組件內(nèi)的不同技術(shù)工件;而運(yùn)行期需要嚴(yán)格明確組件的邊界。

1. 組件間集成和交互方法:同步異步,進(jìn)程內(nèi)或分布式),包括UI,服務(wù),對象和數(shù)據(jù)庫;

2. 組件間集成和交互的上下文數(shù)據(jù)傳遞,如權(quán)限和事務(wù)等待;

3. 組件的安裝、卸載、升級和定制;

1.3 產(chǎn)品化支持

    產(chǎn)品化支持包括了兩個方面:

    參數(shù)化支持:用戶可以通過修改預(yù)定義的參數(shù)設(shè)定調(diào)整系統(tǒng)行為。

    定制化支持:包括兩個層面:1.用戶定制化,即用戶通過系統(tǒng)提供的工具進(jìn)行的定制化;2.系統(tǒng)定制化,即通過開發(fā)人員進(jìn)行編碼開發(fā)提供的定制化。

1.4 平臺化支持

       框架提供相應(yīng)的事務(wù)管理,集成支持和并發(fā)處理等等涉及各個技術(shù)支持,使得業(yè)務(wù)應(yīng)用僅需關(guān)注業(yè)務(wù)邏輯。

2. 平臺的功能支持

0. 業(yè)務(wù)事務(wù)與日志

這里提的業(yè)務(wù)事務(wù),是不同于數(shù)據(jù)庫所提供的物理事務(wù)。以B/S應(yīng)用為例,一個業(yè)務(wù)事務(wù),對應(yīng)如下:

a. 一個業(yè)務(wù)事務(wù):一個web請求,一個服務(wù)調(diào)用,一筆數(shù)據(jù)更新;

b. 一個業(yè)務(wù)事務(wù):一個web請求,多個服務(wù)調(diào)用,多筆數(shù)據(jù)更新;

c. 一個業(yè)務(wù)事務(wù):多個web請求,n個服務(wù)調(diào)用,多筆數(shù)據(jù)更新;

對于a,業(yè)務(wù)事務(wù)和物理事務(wù)的邊界是一致的;而對于bc,顯然,由于物理事務(wù)和業(yè)務(wù)事務(wù)邊界的不一致性,導(dǎo)致基于傳統(tǒng)的物理事務(wù)是無法跟蹤一個業(yè)務(wù)事務(wù)所帶來的數(shù)據(jù)變更。

為了可以跟蹤業(yè)務(wù)事務(wù),就需要通過建立業(yè)務(wù)事務(wù)及其業(yè)務(wù)日志來記錄并跟蹤數(shù)據(jù)的變化。取決于業(yè)務(wù)應(yīng)用,更多的時候,只需要跟蹤相應(yīng)歷史數(shù)據(jù)即可。

此外,若需要提供分布式事務(wù)(不依賴特定的商業(yè)產(chǎn)品),也需要業(yè)務(wù)事務(wù)和日志的支持。

1. 系統(tǒng)操作日志

系統(tǒng)操作日志通常是審計(jì)相關(guān)的。在嚴(yán)格的審計(jì)要求下,業(yè)務(wù)日志可以提供完整的數(shù)據(jù)跟蹤能力。操作日志相對于業(yè)務(wù)日志,較為簡單,只需要跟蹤相應(yīng)的歷史數(shù)據(jù)。

2. 安全體系

現(xiàn)有基礎(chǔ)設(shè)施大都提供了豐富了安全體系。不過開源框架尚未提供一種基于數(shù)據(jù)庫,可以由最終用戶配置的安全體系。

基礎(chǔ)平臺需要在如下方面加以完善:

a.    開放角色定義;

b.   開放角色可訪問資源定義;

c.    開放角色可訪問數(shù)據(jù)定義;

實(shí)際上,bca的基礎(chǔ),只有角色的資源和數(shù)據(jù)可以定義,角色定義才有意義。

此外,對于可訪問數(shù)據(jù)定義,還存在一定爭議,認(rèn)為此是業(yè)務(wù)范疇,基礎(chǔ)平臺或框架不做處理。若要在基礎(chǔ)平臺提供支持,可以有兩種策略:在業(yè)務(wù)層檢查和在數(shù)據(jù)連接層增強(qiáng)。業(yè)務(wù)層的檢查通常通過AOP技術(shù)進(jìn)行,此種方法存在一定的性能消耗問題,且其適應(yīng)性存在局限;而數(shù)據(jù)連接層,則是針對最終的sql語句進(jìn)行解析和增強(qiáng),由于SQL是標(biāo)準(zhǔn),其適應(yīng)性更強(qiáng)些。

3. 批處理服務(wù)

批處理或者說batch處理。

支持不同的觸發(fā)策略:定時以及手動策略;支持批處理的多步驟處理,包括步驟同一數(shù)據(jù)、不同步驟不同數(shù)據(jù),后一步驟處理前一步驟成功的數(shù)據(jù);提供不同的控制策略:包括中斷以及暫停;支持不同的批處理策略:串行和并發(fā);支持不同的事務(wù)控制策略;完善的運(yùn)行日志支持;支持不同的運(yùn)行策略:單機(jī)和集群;

4. 打印和報表

對于信息系統(tǒng)來說,打印和報表這兩塊幾乎是少不了的。

一方面是打印和報表通常都需要通過第三方支持來加以實(shí)現(xiàn),一定的開發(fā)模式有助于降低學(xué)習(xí)成本并提高開發(fā)效率;另一方面是針對不同應(yīng)用領(lǐng)域,打印和報表本身存在一定管理需求。

5.系統(tǒng)診斷支持

3. 平臺的開發(fā)模式

0. 國際化支持

通常提到國際化,最能想到的時文本消息的國際化。文本消息的國際化固然很重要,但是國際化不僅僅包括文本消息。

1.文字消息國際化

對于異步操作或者分布式操作,以及操作日志而言,文本消息并非直接呈現(xiàn),而是存儲于數(shù)據(jù)庫或者文件,并在用戶查詢時呈現(xiàn)。此時若存儲的是國際化后的文本消息,則有局限性:文本消息在產(chǎn)生時決定,而非查看時決定,它的假定是系統(tǒng)的所有用戶都是同一個Locale;但是對于擁有多locale用戶的系統(tǒng),因此支持文本消息存儲信息為非國際化后結(jié)果,而在查詢時根據(jù)用戶的區(qū)域轉(zhuǎn)換為合適的國際化文本消息;

2.布局國際化

多數(shù)的布局方式是從上而下,從左而右。尤其是界面上的表格布局,通常都是label在左,而輸入輸出控件在右。這樣的布局方式在大部分國家和人群是沒有問題的。然而還有另外:阿拉伯國家是從右到左。而中立的做法是label在上,而輸入輸出控件在下,形成上下布局。這樣的布局方式是更為通用。

若要支持兩者布局方式的自由轉(zhuǎn)換,在界面不能采用傳統(tǒng)的表格布局。同時,label和輸入輸出控件必需是一個邏輯控件。現(xiàn)有的大量的控件設(shè)計(jì)都不是如此,label是獨(dú)立的。因此也封裝新的表格控件;

3.業(yè)務(wù)時間

大部分情況下,一個國家通常只有一個時區(qū),而像美國,俄羅斯這樣跨多個時區(qū)的國家相對較少。若一個業(yè)務(wù)系統(tǒng)的用戶跨越了多個時區(qū)。系統(tǒng)就面臨業(yè)務(wù)時間的處理。即用戶的時區(qū)和系統(tǒng)所在時區(qū)不同。

系統(tǒng)處理業(yè)務(wù)時必需同時記錄兩個時間,一是用戶所在時區(qū)時間,一個是系統(tǒng)時間。而業(yè)務(wù)程序在處理數(shù)據(jù)時,必需指明當(dāng)前采用的時間類型。

此外,數(shù)據(jù)庫層面還需要考慮,并非所有數(shù)據(jù)庫支持記錄時區(qū)。

4.計(jì)量單位,多幣種;

國際化面臨的另一個問題就是度量衡問題,常見的有英制,美制。用戶自行轉(zhuǎn)換制式會帶來使用上不便。由基礎(chǔ)平臺提供封裝并自動轉(zhuǎn)換能力。

另一個更為重要的問題時多幣種問題。通常發(fā)生的交易系統(tǒng)上,交易貨幣和本位幣的不同。系統(tǒng)必須同時記錄兩個幣種,以幫助統(tǒng)計(jì)匯兌損失。

1. 異常體系

異常體系的設(shè)計(jì)

A.異常體系原則

異常屬于程序接口的一部分,是除返回值以外的一類輸出對象。Java語言中異常分為checkedUnchecked兩種,而.NET只有一種Unchecked異常。

B.異常的應(yīng)用:

異常用于提示(人工處理)或者用于驅(qū)動流程。實(shí)踐中,由于兩點(diǎn)原因使得異常通常用于提示(人工處理)而非驅(qū)動流程。

B.1.由于異常屬于正常流程體系外的輸出,屬于不受歡迎的輸出。通常系統(tǒng)上出現(xiàn)異常后,程序也無法做相應(yīng)的處理。

B.2.異常在捕獲體系上自身的缺陷。OO設(shè)計(jì)講究是是抽象和封裝,而異常捕獲體系是順序捕獲,捕獲程序必須了解異常的繼承體系,否則一定高層異常早于底層異常則將導(dǎo)致底層異常無法被捕獲并處理。

C.異常的分類

異常分為校驗(yàn)錯誤,業(yè)務(wù)告警,業(yè)務(wù)異常和框架異常

C.1.校驗(yàn)錯誤通常是一種輕量的業(yè)務(wù)異常,校驗(yàn)錯誤所依賴信息單一或較少。

C.2.業(yè)務(wù)異常通常為用戶業(yè)務(wù)數(shù)據(jù)錯誤導(dǎo)致的異常信息,通常依賴較多的數(shù)據(jù)和邏輯。因此針對此類異常只要以友好的方式展示在UI上,用戶通過修正輸入等方式解決。

C.3.框架異常則是基礎(chǔ)平臺自身錯誤,用戶無法通過界面操作加以解決,需要開發(fā)人員介入修正。

2. 多任務(wù)處理

多任務(wù)處理包括了異步操作和并發(fā)處理兩部分內(nèi)容。多任務(wù)處理在技術(shù)上屬于一個較難的部分,開發(fā)以及測試的成本都比較高。

第一個要處理的就是異常的捕獲以及重拋出。

其次是并發(fā)處理。包括兩個部分:并發(fā)策略(鎖)控制以及并發(fā)操作支持。

并發(fā)策略(鎖)不僅僅是基礎(chǔ)平臺提供相應(yīng)框架支持,還是涉及到應(yīng)用系統(tǒng)的設(shè)計(jì)包括模型及其服務(wù)。這點(diǎn)上目前沒有通用的并發(fā)框架,只能是根據(jù)特定應(yīng)用領(lǐng)域,制定相應(yīng)的支持。

并發(fā)操作支持,系統(tǒng)提供元數(shù)據(jù),自動分解輸入?yún)?shù)集合,進(jìn)行并發(fā)處理(可參考Terrecota)。

3. 應(yīng)用交互模式

基礎(chǔ)平臺提供基類,同時支持一些約定,封裝常用的開發(fā)模式,如CRUD,以及異步控制等等面向特定交互應(yīng)用的開發(fā)模式。

4. 平臺的類庫

0. 工具類

包括類操作,對象操作,斷言操作,容器操作等。

1. UI控件

雖然基礎(chǔ)設(shè)施以及開源界提供豐富的UI控件。但是還是存在一些不足。

第一是UI控件適配性不足,應(yīng)用系統(tǒng)已經(jīng)提供各個模型以及服務(wù),但依然需要寫代碼,而非配置方式;需要基礎(chǔ)平臺對已有控件擴(kuò)展,提供適配能力,使得應(yīng)用組件通過配置將數(shù)據(jù)暴露給UI控件,從而使得應(yīng)用組件關(guān)注于業(yè)務(wù)邏輯。

第二是UI控件的國際化支持,詳見3.0國際化支持。

第三是UI控件在不同模式下的展示,比如在編輯模式和只讀模式下的展示。

2. 文件操作支持

3. 網(wǎng)絡(luò)通訊支持

包括底層網(wǎng)絡(luò)通訊(底層網(wǎng)絡(luò)協(xié)議)支持,以及上層網(wǎng)絡(luò)通訊(應(yīng)用網(wǎng)絡(luò)協(xié)議,如Web SeviceRMI等)。

4. 參數(shù)化支持

5. 平臺的工具

1. 打包工具

2. 部署工具

3. 設(shè)計(jì)工具

4. 生成工具

無論何種工具都是幫助提高工作效率。即它不解決業(yè)務(wù)和技術(shù)的核心問題(核心問題的解決依賴于整體設(shè)計(jì)方案),而是提供一個加速器,處理所謂的臟活累活。