李正權
(廣東省科技基礎條件平臺中心,廣州 510033)
隨著互聯網的興起,人們對軟件應用、企業應用的不再是片面和簡單的認識;因此現今企業應用大部分都是復雜多變的,并且還帶有各種不同企業文化的個性化要求,例如OA、CRM、ERP等,雖然網上很多通用型產品,但很大的場景還是針對不同的企業進行個性化的定制,那么如何更有效地應對市場上這類需求,正是現在所提出的云端面向構件開發(以下簡稱云構件)的模式所解決的問題。
圖1為云構件平臺的開發流程;與傳統的開發模式相似,以傳統的軟件定制模式為切入點,使用數據庫驅動為主,但它并不依賴如Eclipse、IDEA這樣開發工具,它的載體是瀏覽器;它是具備面向構件模式(具有高可重用性的特性)和云端部署(有效地體現共享模式和實時發布)。
(1)構件的實現
構件是整個架構的主要部分,是一種把代碼包裝成一個個粒度極少的組件,每個組件會完成一個微少的功能,不同組件的組合,就可以完成一個完整的業務功能,然后又可以被重新使用,轉化為一個更大粒度的組件;因此它具有高的可重用性;構件主要有三種表現形式,分別是預編譯的構件、動態編譯的構件,還有兩者混合組成的構件。

圖1 開發流程圖示
①預編譯的構件
就是指預先編譯好的代碼(下面以Java為例,編譯后會產生class文件),其本質上是一個函數,有標準的入口和出口參數,如下代碼:

這是一個簡單Java函數,功能是把兩個字符串合成一個字符串;象這類函數,我們編譯好class文件后,傳統的開發模式是放到開發環意下就能直接使用;
但在云模式中,我們要像在開發環境一樣地使用它,就得先讓使用者知道它放在哪里和怎么使用,因此需要預先登記這個函數的信息,并保存進容器中(如數據庫),如圖2。

圖2 構件發布
被成功登記并發布后就會形成我們所說的構件;通過上述的配置,使用者就能夠通過代碼(上圖中為join)在云端找到這個函數,并在自已的設計業務中使用,而云端也能夠獲取使用這個構件的方法,并且可以利用Java反射機制設置它的入參,執行它,得到回參。
②動態編譯的構件
預編譯的構件存在一定的限制,依賴用戶開發環境進行編譯,最后打包到平臺上才能使用,嚴格來說,這種方式還不是真正的云端開發所使用的模式,這種構件比較適合一些不經常修改的功能,例如郵件發送、短信發送、數據表的增刪改等操作;但實際使用中有很大一部分是需要靈活編寫的,這種代碼需要實時進行修改并實時發布使用,例如查詢條件、變量設置等;這時候我們需要一個能支撐代碼動態執行的環境,使用腳本引擎是一個不錯的選擇,例如Java8自帶的Java-Script,使用Java編寫的Groovy,還有Python等也是一個很好的選擇;如圖3。

圖3 構件發布
同樣地,我們需要保存這些代碼進容器中(如數據庫),并通過代碼(上圖中為join)在云端找到這個函數并使用,而云端也能夠獲取使用這個構件的代碼體,并選擇適當的引擎執行它。
③兩者混合組成的構件
兩者指的是預編譯的構件和動態編譯的構件,云平臺中為了資源更合理的利用,應該允許不同類型的構件重新再組合使用,該類構件是一種對現成的和歷史資源再利用的一種重要表現,軟件企業中經歷了一段時間后,由于各種原因會留下很多歷史可用資源,這些資源可能是某個功能包、一些函數等;而該類資源還是具有很大的應用價值,利用構件對該類應用進行重新包裝,形成構件,不但可以再利用現有的資源,而且可以把資源更抽象化,形成通用形組件,例如:郵件發送、短信發送等;如圖4是一個短信發送的通用構件:

圖4 短信發送構件
它的使用過程跟上述兩種構件類似,也有唯一的代碼,并能通過云端查找和運行。
(2)性能優化
通過第一點對構件的實現描述不難發現,構件基本上運作在反射機制和動態編譯的環境下,這會給運行環境帶來極大的資源損耗,使性能是急速下降;為此我們需要為云構件平臺考慮緩存機制。
①類緩存
由于使用Java反射機制,相比正常的類調用,性能會下降很多,例如當Class會被調用時會用Class.for?Name進行加載,而Class.forName方法的調用會執行Class類文件在整個類路徑下的搜索,頻繁調用比較影響性能,同樣地還有對方法的執行等,那么這類操作,我們需要使用緩存機制、靜態集合或者緩存中間件en?cache等都是一個不錯的選擇;如下代碼片段:

圖5 類緩存
②腳本緩存
腳本指的是由動態編譯的構件保存的代碼,這類代碼相比反身機制更損耗資源和性能,預編譯的構件,至少類是已經存在的,但動態構件它的類是在云端被使用時才進行實時的編譯,因此同樣需要緩存;以Groovy為例,其主要緩存目標是已編譯好的腳本對象Script。
(3)軟件結構與模板
構件是一個單獨的微業務單元,他們的互相組合會產生新的業務,就好象堆積木一樣,然后一個或者多個構件形成軟件所需要的功能模塊,不同功能模塊的組合就是我們所說的應用軟件;優化處理后的軟件形成一個通用性極高的模板,可以針對未來相似的應用再進行復制和二次開發重用,以下是軟件的組成結構圖:

圖6 軟件組成圖示
不難看出,通過一定時間的沉淀,不同的應用模板最終會組成企業所中心應用庫;再開發類似的項目時,就可以在中心庫中提出相似度高的模板進行二次開發,成本會大幅下降。
(1)云端開發與部署
云端是一個很好的軟件聚合平臺,它能提供一系列的強大的服務,包括代碼的編譯、版本的管理、模塊功能的導出、安裝、部署、以及軟件授權與發布等;在云端上進行開發,我們不需要額外安裝第三方的開發環境,只需要準備一個瀏覽器就可以進入開發工作。
云端上的應用開發一般是實時進行的,基于SaaS的即見即所得的應用服務,而這些應用中包含構件、業務模塊、UI界面等;被開發出來的應用,經過云端平臺提供的授權配置,可以供應給第三方使用。
同時,云端上除了能支持多租戶方式外,還支持個性定制和使用模式,軟件模塊能單獨被導出到另外一個云端應用服務器上使用,并且安裝過程簡單,安裝后的軟件能進行二次定制開發

圖7 生成安裝包圖示
(2)資源共享
過去的開發應用中,資源之間并未能很好地分享,各種資源相當于一個單獨的孤島;云端的出現,解決了這種資源被發現和共享使用的問題,在云端中,只要一人開發了某構件,并發布到平臺上,其他接入人員就能實時地發現和使用,很好地避免了資源的重復開發帶來的人力和時間耗損,如圖8。

圖8 云端開發圖示
在過去項目實施中,往往有這樣一種場景,就是開發過程中有新的成員加入,或者某些成員被臨時調配其他項目組,新的成員接手,這種情況下接手的人員必須從相關文檔和代碼中理解當前項目中的邏輯關系,這樣會造成一個學習和理解時間上的耗損,而且這個耗損代價并不少;在構件化的平臺里面,邏輯性都是以圖型的形式表達并加以注釋,使得新接手的人員能快速地理解當前業務邏輯,同時由于構件的封裝,開發人員也只需要通過相關說明,理解構件的入口參數和出口參數就可以使用,維護的成本會大大減少。
現今市場上不少的軟件企業創造了各類不同的開發平臺,并為自己的平臺定義各種各樣的開發模式,但無論開發速度上有多優越,還是存在著各種缺失,例如維護的成本,學習成本,資源的再利用等;云構件模式是一種具有隨著資源的增長,開發時間縮短和成本降低的特性,在實際應用中,能更有效地提高熟練開發人員的開發時間,提高其效率;能夠有利于新接觸的開發人員縮短學習的時間,快速進入正作狀態。
隨著AI人工智能技術的興起,很多資深的專家開始研究讓AI來完成項目代碼的編寫工作,但是代碼隨機性和復雜性將會帶來很大的問題;而構件模式未來可以利用人工智能的各類算法讓機器學習構件的使用,更進一步從現有的庫中學習業務邏輯的排列方法,做到讓機器識別出各類需求對應的業務功能,并自動完成;相比于代碼的實現方式難度將會大大降低。

圖9 優化開發過程圖示
本設計是基于云端的構件開發模型,在利用構件的高可重用性的基礎上,配合云端的共享資源模式,使得資源的再利用達到一個更高的階段,具有隨著構件、模塊、模板應用的增長,開發周期會大幅縮短、成本會降低;對人員技術要求的也會將隨之而降低。
[1](美)Vaughn Vernon(沃恩·弗農).企業應用架構模式.滕云譯.電子工業出版社,2014-03-01.
[2](美)Eric Evans.實現領域驅動設計.趙俐,盛海艷,劉霞譯.人民郵電出版社,2016-06-01.