孟永勝 曹海萍
摘要:系統(tǒng)的可擴(kuò)展性是構(gòu)建現(xiàn)代軟件系統(tǒng)的一個重要課題,微服務(wù)架構(gòu)通過將功能分解到多個獨立的服務(wù),以實現(xiàn)對解決方案或者復(fù)雜系統(tǒng)的解耦,該文提供一種基于微服務(wù)架構(gòu)動態(tài)擴(kuò)展軟件功能的方法。
關(guān)鍵詞:微服務(wù);架構(gòu);功能擴(kuò)展
中圖分類號:TP311.5 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2018)23-0105-02
隨著IT技術(shù)的迅猛發(fā)展,軟件系統(tǒng)架構(gòu)在發(fā)生著重大變化。對軟件系統(tǒng)的要求主要有系統(tǒng)可管理性、可靠性、可擴(kuò)展性、可維護(hù)性和安全性等等。系統(tǒng)的可擴(kuò)展性是構(gòu)建現(xiàn)代軟件系統(tǒng)的一個重要課題。
微服務(wù)架構(gòu)(Micro Service Architecture)是近年來軟件體系架構(gòu)領(lǐng)域出現(xiàn)的一個新名詞,它通過將功能分解到多個獨立的服務(wù),以實現(xiàn)對解決方案或者復(fù)雜系統(tǒng)的解耦,其根本理念是將大型、復(fù)雜且歷時長久的應(yīng)用在架構(gòu)上設(shè)計為內(nèi)聚的小服務(wù),這些服務(wù)能夠隨著時間的流逝而演化。
軟件在運(yùn)行時動態(tài)擴(kuò)展功能的方法一般有以下幾種方式:
1)插件方式。首先定義統(tǒng)一接口,基于Liskov替換原則,對擴(kuò)展點進(jìn)行擴(kuò)展,然后加載動態(tài)庫。如Java的OSGI框架和著名的Eclipse IDE都屬于此類擴(kuò)展方式;
2)打補(bǔ)丁的方式。在運(yùn)行時動態(tài)更換指針?biāo)傅暮瘮?shù),如C/C++語言在通信產(chǎn)品上,一般采用打熱補(bǔ)丁的方式修復(fù)系統(tǒng)錯誤,也是運(yùn)行時擴(kuò)展功能的一種方式;
3)語言層級的自然支持,如Erlang語言的Hot Code Swapping特性支持在運(yùn)行時替換模塊代碼,從而實現(xiàn)功能擴(kuò)展;
4)配置文件。通過在運(yùn)行時修改配置文件,可以在一定程度上擴(kuò)展軟件處理業(yè)務(wù)的范圍,但在功能擴(kuò)展的范圍也被限制在某種可配參數(shù)范圍內(nèi),無法加載其他新功能。
軟件擴(kuò)展功能的方式很多,有些語言(如Go語言)只支持引用靜態(tài)代碼直接編譯,不支持鏈接靜態(tài)庫和生成、加載動態(tài)庫。這樣在運(yùn)行時就無法通過更換動態(tài)庫文件來擴(kuò)展功能。
1 微服務(wù)擴(kuò)展
針對無法生成并加載動態(tài)庫的語言,本文提供一種基于微服務(wù)架構(gòu)動態(tài)擴(kuò)展軟件功能的方法?;谖⒎?wù)擴(kuò)展軟件功能的系統(tǒng)包括以下服務(wù)模塊,如圖1所示:
1)全局名字服務(wù):用于存儲微服務(wù)的名稱和網(wǎng)絡(luò)地址;
2)掃描注冊服務(wù):用于實時掃描微服務(wù)并向全局名字服務(wù)注冊信息;
3)轉(zhuǎn)發(fā)代理服務(wù):用于轉(zhuǎn)發(fā)微服務(wù)之間的請求消息。轉(zhuǎn)發(fā)規(guī)則定義過程如下:首先定義URL的ACL過濾規(guī)則,一條規(guī)則對應(yīng)一個目標(biāo)資源池,資源池中有若干個相同的微服務(wù)實例。若匹配該規(guī)則就到對應(yīng)的資源池中取出某個實例地址進(jìn)行轉(zhuǎn)發(fā)。這樣只需要定義不同的轉(zhuǎn)發(fā)規(guī)則,就可以實現(xiàn)請求的定向轉(zhuǎn)發(fā),進(jìn)而擴(kuò)展功能;
4)業(yè)務(wù)功能服務(wù):指以微服務(wù)形式部署的功能模塊。
基于微服務(wù)架構(gòu)在運(yùn)行時動態(tài)擴(kuò)展軟件功能的具體流程如下圖所示:
第一步,定義功能擴(kuò)展點及接口;
第二步,將該功能的接口實現(xiàn)改變?yōu)槲⒎?wù)的方式;
第三步,建立全局名字服務(wù),收集所有待擴(kuò)展功能的微服務(wù)的注冊消息,保存這些微服務(wù)的相關(guān)信息,如名稱和網(wǎng)絡(luò)地址;
第四步,建立轉(zhuǎn)發(fā)代理服務(wù),從全局名字服務(wù)獲取微服務(wù)相關(guān)信息并生成轉(zhuǎn)發(fā)配置文件,提供對請求消息轉(zhuǎn)發(fā)服務(wù);
第五步,實現(xiàn)功能擴(kuò)展,即提供符合擴(kuò)展接口的新的實現(xiàn)方式,并以微服務(wù)的形式部署;
第六步,微服務(wù)之間采用輕量級通信協(xié)議(如RESTful,RPC等),微服務(wù)發(fā)送帶有特定URL的請求,轉(zhuǎn)發(fā)代理根據(jù)轉(zhuǎn)發(fā)規(guī)則將該請求轉(zhuǎn)發(fā)到帶有擴(kuò)展功能的微服務(wù)上,從而實現(xiàn)功能擴(kuò)展。
使用微服務(wù)架構(gòu),原有系統(tǒng)按照領(lǐng)域驅(qū)動設(shè)計的方法分解成多個微服務(wù)獨立部署,各微服務(wù)之間通過REST接口通信協(xié)作,實現(xiàn)整個系統(tǒng)的功能。按照以上的模塊劃分,系統(tǒng)每個功能模塊都是可擴(kuò)展的。功能模塊在部署時,掃描注冊模塊會自動發(fā)現(xiàn)已啟動的微服務(wù),注冊到全局名字服務(wù)模塊,名字服務(wù)會將發(fā)現(xiàn)的微服務(wù)信息存儲起來。同時,轉(zhuǎn)發(fā)代理模塊會周期地從全局名字服務(wù)查詢當(dāng)前可用的微服務(wù)信息,并生成轉(zhuǎn)發(fā)代理的配置文件,以便對微服務(wù)功能模塊的請求進(jìn)行正確轉(zhuǎn)發(fā)。
2 具體實施方式
2.1 人工配置服務(wù)方式
1)人工編輯轉(zhuǎn)發(fā)代理模塊的配置文件;
2)啟動各個微服務(wù)進(jìn)程;
3)功能微服務(wù)a發(fā)出請求消息1到轉(zhuǎn)發(fā)代理服務(wù)模塊,轉(zhuǎn)發(fā)代理根據(jù)收到的URL地址及配置的轉(zhuǎn)發(fā)規(guī)則找到對應(yīng)的功能微服務(wù)b,并將消息轉(zhuǎn)發(fā)給功能微服務(wù)b;
4)需要用新的功能微服務(wù)b來擴(kuò)展或替換原來的功能微服務(wù)2,修改轉(zhuǎn)發(fā)代理模塊的配置文件,增加功能微服務(wù)b的相關(guān)信息及轉(zhuǎn)發(fā)規(guī)則;
5)轉(zhuǎn)發(fā)代理模塊收到微服務(wù)模塊a的請求消息3時,根據(jù)新的匹配規(guī)則將消息4轉(zhuǎn)發(fā)給功能微服務(wù)b處理,從而實現(xiàn)在不中斷系統(tǒng)原有服務(wù)的情況下,實現(xiàn)系統(tǒng)功能動態(tài)擴(kuò)展。
2.2 自動發(fā)現(xiàn)服務(wù)方式
自動發(fā)現(xiàn)服務(wù)方式如圖4所示,相比人工配置服務(wù)方式,自動發(fā)現(xiàn)服務(wù)增加了“掃描注冊”和“全局名字”兩個服務(wù)。
1)業(yè)務(wù)功能微服務(wù)a和b啟動以后,掃描注冊服務(wù)通過實時掃描消息1和2,發(fā)現(xiàn)當(dāng)前啟動的微服務(wù),將其信息通過消息3發(fā)給 全局名字服務(wù) 緩存;
2)全局名字服務(wù) 通過消息4將當(dāng)前最新的微服務(wù)信息發(fā)送給 轉(zhuǎn)發(fā)代理服務(wù),生成其配置文件;
3)轉(zhuǎn)發(fā)代理服務(wù)收到功能微服務(wù)a發(fā)送的請求消息5以后,根據(jù)目標(biāo)服務(wù)信息匹配和轉(zhuǎn)發(fā)規(guī)則,以消息6轉(zhuǎn)發(fā)給微服務(wù)模塊b進(jìn)行處理;
4)根據(jù)業(yè)務(wù)功能需求形成增強(qiáng)的功能微服務(wù)b,并正常部署啟動運(yùn)行;
5)周期掃描注冊服務(wù)實時發(fā)現(xiàn)新啟動的功能微服務(wù)b,并將其信息通過消息8發(fā)送給全局名字服務(wù);
6)全局名字服務(wù)在收到消息8以后更新本地服務(wù)緩存,并通過消息9通知轉(zhuǎn)發(fā)代理模塊,并更新其配置文件;
7)轉(zhuǎn)發(fā)代理模塊收到消息10時,可以根據(jù)當(dāng)前的最新目標(biāo)信息匹配和轉(zhuǎn)發(fā)規(guī)則,經(jīng)消息11將其轉(zhuǎn)發(fā)給功能微服務(wù)b,從而實現(xiàn)業(yè)務(wù)功能自動擴(kuò)展。
3 小結(jié)
采用本文方法,可以讓不支持運(yùn)行時加載動態(tài)庫的語言達(dá)到動態(tài)擴(kuò)展功能的目的,并且在擴(kuò)展功能或軟件升級過程中不中斷原有服務(wù),在提高軟件系統(tǒng)可擴(kuò)展性及可用性上取得明顯成效。
參考文獻(xiàn):
[1] 崔蔚,李春陽,劉迪,等.面向微服務(wù)的統(tǒng)一應(yīng)用開發(fā)平臺[J]. 電力信息與通信技術(shù),2016(9).
[2] 郝庭毅,吳恒,吳國全,等.面向微服務(wù)架構(gòu)的容器級彈性資源供給方法[J].計算機(jī)研究與發(fā)展, 2017(3).
[3] 翟永超.Spring Cloud微服務(wù)實戰(zhàn)[M].北京:電子工業(yè)出版社,2017.
【通聯(lián)編輯:光文玲】