戴云鵬,喬運(yùn)華,周文坤,張宵銘
(1.北京機(jī)械工業(yè)自動(dòng)化研究所,北京 100120;2.北京機(jī)械工業(yè)自動(dòng)化研究所有限公司,北京 100120)
RS10系統(tǒng)作為一個(gè)面向集團(tuán)型企業(yè)管理的大型信息系統(tǒng),已經(jīng)經(jīng)歷了十幾年的發(fā)展。在十幾年間,RS10系統(tǒng)不斷發(fā)展和壯大,功能不斷增多、增強(qiáng)。尤其是近年來,MES系統(tǒng)的飛速發(fā)展,對(duì)底層架構(gòu)的沖擊非常大,原有的單體式架構(gòu)已經(jīng)無法滿足RS10系統(tǒng)對(duì)性能的需求。微服務(wù)架構(gòu)將大型的系統(tǒng)拆解成為分散的、可以單獨(dú)部署的服務(wù),并且每個(gè)服務(wù)都可以有自己的數(shù)據(jù)庫,新擴(kuò)展一個(gè)功能,可以增加一個(gè)新的微服務(wù)。這樣的架構(gòu)特點(diǎn),無疑滿足了RS10系統(tǒng)對(duì)底層架構(gòu)的性能需求,對(duì)擴(kuò)展業(yè)務(wù)系統(tǒng)功能的需求。
單體式架構(gòu)易于部署,在系統(tǒng)功能比較簡單時(shí)運(yùn)行的很好。但是歷經(jīng)十幾年時(shí)間的發(fā)展,為了滿足客戶日益多樣化的需求,RS10系統(tǒng)經(jīng)過一次又一次的擴(kuò)展,變得越來越龐大、復(fù)雜。單個(gè)開發(fā)者已經(jīng)越來越難以了解透徹整個(gè)系統(tǒng),系統(tǒng)維護(hù)過程中需要接受的挑戰(zhàn)越來越多,往往一個(gè)錯(cuò)誤的修改就會(huì)耗費(fèi)很長時(shí)間,而且由于系統(tǒng)耦合度高,一個(gè)舊有錯(cuò)誤的修改往往會(huì)帶來很多新的錯(cuò)誤,這給系統(tǒng)的維護(hù)帶來了很多不便,在原有系統(tǒng)上開發(fā)新功能也變得越來越困難,越來越復(fù)雜。同時(shí)新員工對(duì)系統(tǒng)的學(xué)習(xí)也變得越來越困難,往往為了解自己負(fù)責(zé)的部分而不得不了解整個(gè)系統(tǒng),這對(duì)新員工快速進(jìn)入工作不利,降低了工作效率的同時(shí)變相增加了人工成本。
微服務(wù)是一種面向服務(wù)的架構(gòu)風(fēng)格,應(yīng)用程序被構(gòu)建為多個(gè)不同的小型服務(wù)的集合而不是單個(gè)應(yīng)用程序[1]。相比于單體式架構(gòu),微服務(wù)架構(gòu)的部署比較復(fù)雜,但是系統(tǒng)各模塊之間的耦合度很低。微服務(wù)架構(gòu)將整個(gè)系統(tǒng)以業(yè)務(wù)功能為基礎(chǔ)進(jìn)行劃分,將單個(gè)的系統(tǒng)服務(wù)拆解成不同的服務(wù)。微服務(wù)架構(gòu)具有以下特點(diǎn):
在傳統(tǒng)開發(fā)模式下,程序的多個(gè)功能會(huì)統(tǒng)一到一個(gè)項(xiàng)目里面,開發(fā)時(shí)必然會(huì)伴隨著代碼沖突,開發(fā)人員溝通困難等諸多問題,這個(gè)問題會(huì)隨著團(tuán)隊(duì)人數(shù)增多,軟件復(fù)雜度提高變得越來越突出[2]。但是在微服務(wù)架構(gòu)下,系統(tǒng)的不同功能被拆分成了單獨(dú)的服務(wù),服務(wù)之間耦合度很小,每個(gè)服務(wù)作為一個(gè)項(xiàng)目組,每個(gè)項(xiàng)目組的人員只需要負(fù)責(zé)自己項(xiàng)目組的代碼即可,開發(fā)始終是簡潔高效的。同時(shí)在交付階段,傳統(tǒng)的項(xiàng)目組必須等到所有功能全部檢測(cè)完畢之后才可以交付,某一個(gè)地方的錯(cuò)誤會(huì)拖累整個(gè)項(xiàng)目組的進(jìn)度。而微服務(wù)是獨(dú)立部署和運(yùn)行的,每項(xiàng)服務(wù)的檢測(cè)和交付都是獨(dú)立的,因此可以持續(xù)交付,這樣持續(xù)交付的方式提高了交付的速度。
每項(xiàng)微服務(wù)可以有自己的編碼方式,甚至是獨(dú)立的數(shù)據(jù)庫,這樣就使得系統(tǒng)的維護(hù)和升級(jí)難度大大降低,開發(fā)和維護(hù)團(tuán)隊(duì)只需要了解自己負(fù)責(zé)的服務(wù)即可,不需要了解整個(gè)系統(tǒng),每個(gè)服務(wù)都是單獨(dú)部署,單獨(dú)升級(jí)的。這樣使得系統(tǒng)的升級(jí)變得輕松,不需要像單體式架構(gòu)一樣升級(jí)需要考慮整個(gè)系統(tǒng),降低了系統(tǒng)升級(jí)的難度。
系統(tǒng)在開發(fā)完成之后并不是一成不變的,為了滿足客戶的需求,增加新功能不可避免,在傳統(tǒng)模式下每增加一個(gè)新功能,都要考慮對(duì)其他功能的影響,但是在微服務(wù)模式下,可以將新功能開發(fā)成一個(gè)新的微服務(wù),由于獨(dú)立開發(fā)和部署的原因,和其他功能的關(guān)聯(lián)很小,可以保證原有功能不會(huì)受到影響,這樣就很大的提升了系統(tǒng)的擴(kuò)展性。
圖1 單體架構(gòu)和微服務(wù)架構(gòu)[3]
RS10云平臺(tái)是系統(tǒng)底層技術(shù)架構(gòu)的核心,RS10系統(tǒng)的所有服務(wù)都運(yùn)行在云平臺(tái)上。云平臺(tái)采用了docker容器引擎和Kubernetes容器集群管理系統(tǒng)[4]。
docker是一個(gè)開源的容器引擎,docker容器本質(zhì)上是一個(gè)進(jìn)程,容器之間相互隔離,保證了容器的獨(dú)立運(yùn)行。這符合微服務(wù)架構(gòu)要求的服務(wù)獨(dú)立運(yùn)行和部署的理念。docker建立容器需要以鏡像為模板,因此docker需要一個(gè)鏡像倉庫來存儲(chǔ)和管理鏡像。出于安全因素的考慮,公共的鏡像倉庫不符合系統(tǒng)的需要,因此建立私有的harbor鏡像倉庫。這樣不但可以存儲(chǔ)和管理鏡像版本,還可以保證內(nèi)部開發(fā)環(huán)境的安全。鏡像在倉庫內(nèi)部按照項(xiàng)目的不同進(jìn)行分組,同一個(gè)項(xiàng)目的鏡像放在一起,管理十分方便。
Kubernetes是google公司推出的開源容器集群管理系統(tǒng),它支持多種語言,Java、Python等語言都可以使用,這是RS10云平臺(tái)采用Kubernetes的原因之一。Kubernetes集群的節(jié)點(diǎn)分為master節(jié)點(diǎn)和node節(jié)點(diǎn),其中master節(jié)點(diǎn)主要負(fù)責(zé)調(diào)度集群的資源,無論是資源的建立、刪除還是停止,都需要通過master節(jié)點(diǎn)來控制,是重中之重。Master節(jié)點(diǎn)一旦出現(xiàn)故障,整個(gè)集群都會(huì)癱瘓,因此RS10云平臺(tái)要求最少有兩個(gè)master節(jié)點(diǎn),確保集群不會(huì)因?yàn)橐粋€(gè)節(jié)點(diǎn)的故障影響整個(gè)系統(tǒng)。node節(jié)點(diǎn)負(fù)責(zé)工作資源的運(yùn)行,部署的服務(wù)都會(huì)運(yùn)行在node節(jié)點(diǎn)上。Node節(jié)點(diǎn)的故障不會(huì)影響整個(gè)集群,無論是哪個(gè)節(jié)點(diǎn)停止工作,master節(jié)點(diǎn)都會(huì)將故障節(jié)點(diǎn)負(fù)責(zé)的工作轉(zhuǎn)移到其他節(jié)點(diǎn)。因此node節(jié)點(diǎn)的數(shù)量是不固定的,一般會(huì)根據(jù)集群運(yùn)行資源的需要進(jìn)行調(diào)整。
Kubernetes不但可以通過命令控制資源,還可以通過可視化工具來管理系統(tǒng)資源。Kubernetes使用dashboard作為可視化工具,無論是節(jié)點(diǎn),還是名稱空間、存儲(chǔ)類、控制器等資源,都可以通過dashboard進(jìn)行管理。dashboard將用戶分為管理用戶和普通用戶,管理用戶可以對(duì)資源進(jìn)行編輯、刪除等操作,普通用戶只能瀏覽頁面,查看集群情況,沒有修改的權(quán)限。另外Kubernetes不但可以擴(kuò)充節(jié)點(diǎn),還可以實(shí)現(xiàn)pod資源的擴(kuò)容。傳統(tǒng)單體式應(yīng)用的集群如果資源緊張,需要擴(kuò)容,那么整個(gè)系統(tǒng)的所有功能都需要重新部署在一個(gè)新的節(jié)點(diǎn)上。但是大部分時(shí)候系統(tǒng)的資源緊張僅僅是其中某一個(gè)功能使用頻繁,并不是所有功能都使用頻繁,并且這樣的資源緊張?jiān)诮?jīng)過一個(gè)高峰期后會(huì)迅速回落,盲目增加節(jié)點(diǎn)的方式造成了資源的浪費(fèi)。Kubernetes系統(tǒng)可以針對(duì)某個(gè)服務(wù)進(jìn)行擴(kuò)容,將資源緊張的微服務(wù)對(duì)應(yīng)的pod節(jié)點(diǎn)進(jìn)行擴(kuò)容,這樣只針對(duì)某個(gè)服務(wù)進(jìn)行擴(kuò)容的方式無疑比起增加一個(gè)節(jié)點(diǎn)來說不僅節(jié)省了大量的資源,而且節(jié)省了大量的時(shí)間。等到服務(wù)使用的高峰期過去,還可以恢復(fù)原來的pod節(jié)點(diǎn)數(shù)量,這樣的工作機(jī)制,對(duì)用戶來說無疑是高效而又簡便的。
圖2 Kubernetes集群節(jié)點(diǎn)關(guān)系簡單示意圖
圖3 用可視化工具進(jìn)行編輯、刪除操作
RS10系統(tǒng)將服務(wù)分為三種,分別是基礎(chǔ)服務(wù),業(yè)務(wù)系統(tǒng)服務(wù)和第三方服務(wù)。
基礎(chǔ)服務(wù)包括安全認(rèn)證、搜索服務(wù)、存儲(chǔ)服務(wù)、資源管理服務(wù)、業(yè)務(wù)元數(shù)據(jù)服務(wù)、信息推送服務(wù)、日志、監(jiān)控等服務(wù)。這些服務(wù)是RS10系統(tǒng)運(yùn)行所必需的服務(wù),例如日志服務(wù)統(tǒng)一記錄應(yīng)用程序產(chǎn)生的各種信息,包括服務(wù)的部署、運(yùn)行、停止過程中產(chǎn)生的信息和記錄。維護(hù)和部署人員統(tǒng)一通過調(diào)用服務(wù),來查看系統(tǒng)是否報(bào)錯(cuò),并對(duì)報(bào)出的錯(cuò)誤進(jìn)行處理;監(jiān)控服務(wù)可以監(jiān)控系統(tǒng)的軟硬件資源,硬件方面主要監(jiān)控內(nèi)存、硬盤、CPU等資源是否充足,一旦硬件資源剩余量過低,就會(huì)通知維護(hù)人員,通過增加集群工作節(jié)點(diǎn)的方式對(duì)系統(tǒng)硬件資源進(jìn)行擴(kuò)充,或者關(guān)閉不必要的微服務(wù),減少硬件資源的使用。軟件資源方面主要監(jiān)視pod、service等資源是否正常運(yùn)行,如果資源沒有正常運(yùn)行,就需要對(duì)沒有正常運(yùn)行的資源進(jìn)行維護(hù),確認(rèn)資源沒有正常運(yùn)行的原因,并修改,記錄。通過軟硬件資源的監(jiān)視,可以很方便的看出RS10系統(tǒng)的運(yùn)行狀態(tài),出現(xiàn)錯(cuò)誤可以及時(shí)改正,減輕了系統(tǒng)維護(hù)人員的負(fù)擔(dān);安全認(rèn)證服務(wù)主要用于安全驗(yàn)證。服務(wù)與服務(wù)之間,業(yè)務(wù)系統(tǒng)與服務(wù)之間的通信,都存在著網(wǎng)絡(luò)數(shù)據(jù)被竊取的風(fēng)險(xiǎn),所以需要通過安全認(rèn)證服務(wù)進(jìn)行安全驗(yàn)證,通過驗(yàn)證之后進(jìn)行安全有效的交互,屏蔽過濾掉惡意、不安全的請(qǐng)求,這樣增加了系統(tǒng)的安全性,確保系統(tǒng)數(shù)據(jù)不會(huì)被竊取。這些服務(wù)提供了對(duì)RS10系統(tǒng)業(yè)務(wù)的支撐。
業(yè)務(wù)系統(tǒng)服務(wù)包括EIP門戶服務(wù)、公文服務(wù)、合同服務(wù)、財(cái)務(wù)流程服務(wù)、MES服務(wù)、工作流服務(wù)、移動(dòng)端服務(wù)、郵件服務(wù)等。業(yè)務(wù)系統(tǒng)服務(wù)是對(duì)業(yè)務(wù)系統(tǒng)中存在的標(biāo)準(zhǔn)業(yè)務(wù)流程進(jìn)行抽取,抽取成標(biāo)準(zhǔn)服務(wù),例如EIP門戶服務(wù)是對(duì)EIP系統(tǒng)中公共部分抽取服務(wù),包括一些標(biāo)準(zhǔn)化的流程和頁面動(dòng)態(tài)布局提供支持;公文服務(wù)是對(duì)公文的流程,包括公文創(chuàng)建、發(fā)起、查看、撤銷等抽取出標(biāo)準(zhǔn)的流程服務(wù),對(duì)公文系統(tǒng)進(jìn)行更好的服務(wù)支撐;工作流服務(wù)主要對(duì)工作流系統(tǒng)進(jìn)行支撐,可以進(jìn)行行政事務(wù)的審批和業(yè)務(wù)申請(qǐng)的審批。如請(qǐng)假申請(qǐng),程序錯(cuò)誤提交申請(qǐng)等;郵箱服務(wù)可以用于企業(yè)內(nèi)部的郵件的接收、發(fā)送;移動(dòng)端服務(wù)可以讓企業(yè)人員在移動(dòng)設(shè)備上進(jìn)行辦公,方便出差人員的使用,提高企業(yè)的辦公效率。
第三方服務(wù)是與第三方插件或工具集成的服務(wù),包括報(bào)表和打印服務(wù)、ireport服務(wù)、語音服務(wù)、圖像識(shí)別服務(wù)、人工智能服務(wù)等??蛻舻男枨笫嵌喾N多樣的,因此在系統(tǒng)中集成一些第三方服務(wù)變得不可避免。原來的單體式架構(gòu)集成需要考慮第三方插件與系統(tǒng)的沖突,導(dǎo)致系統(tǒng)對(duì)第三方插件選擇的余地很小,需要多次測(cè)試才能夠確定是否可以采用第三方插件。但是在微服務(wù)架構(gòu)下,系統(tǒng)的選擇范圍大了很多,可以更多的側(cè)重插件的性能。隨著人工智能和大數(shù)據(jù)的發(fā)展,圖像識(shí)別、人工智能等已經(jīng)逐漸應(yīng)用到了很多領(lǐng)域,對(duì)這些服務(wù)的集成,可以更好地適應(yīng)時(shí)代的發(fā)展,滿足客戶的需求。
結(jié)合當(dāng)前用戶越來越多的需求和單體式RS10系統(tǒng)越來越復(fù)雜的現(xiàn)狀,基于微服務(wù)架構(gòu)的RS10系統(tǒng)的開發(fā)已經(jīng)成為了當(dāng)前迫切的需求。微服務(wù)架構(gòu)具有的低耦合特性符合RS10的發(fā)展需要。將龐大的RS10系統(tǒng)拆解成一個(gè)個(gè)的微服務(wù),解決了RS10系統(tǒng)當(dāng)前系統(tǒng)復(fù)雜,學(xué)習(xí)入門難,升級(jí)難的問題,每個(gè)微服務(wù)的升級(jí)與其他微服務(wù)無關(guān),這樣使得團(tuán)隊(duì)之間的分工明確,每個(gè)團(tuán)隊(duì)只需要維護(hù)自己所負(fù)責(zé)的服務(wù)即可,不用為了維護(hù)或者升級(jí)一個(gè)服務(wù),必須將整個(gè)系統(tǒng)都了解一遍,極大地節(jié)約了人力資源。RS10系統(tǒng)從單體式架構(gòu)升級(jí)為微服務(wù)架構(gòu),可以有效降低RS10系統(tǒng)的開發(fā)難度,提升RS10系統(tǒng)的開發(fā)效率。