戴云鵬,喬運華,周文坤,張宵銘
(1.北京機械工業自動化研究所,北京 100120;2.北京機械工業自動化研究所有限公司,北京 100120)
RS10系統作為一個面向集團型企業管理的大型信息系統,已經經歷了十幾年的發展。在十幾年間,RS10系統不斷發展和壯大,功能不斷增多、增強。尤其是近年來,MES系統的飛速發展,對底層架構的沖擊非常大,原有的單體式架構已經無法滿足RS10系統對性能的需求。微服務架構將大型的系統拆解成為分散的、可以單獨部署的服務,并且每個服務都可以有自己的數據庫,新擴展一個功能,可以增加一個新的微服務。這樣的架構特點,無疑滿足了RS10系統對底層架構的性能需求,對擴展業務系統功能的需求。
單體式架構易于部署,在系統功能比較簡單時運行的很好。但是歷經十幾年時間的發展,為了滿足客戶日益多樣化的需求,RS10系統經過一次又一次的擴展,變得越來越龐大、復雜。單個開發者已經越來越難以了解透徹整個系統,系統維護過程中需要接受的挑戰越來越多,往往一個錯誤的修改就會耗費很長時間,而且由于系統耦合度高,一個舊有錯誤的修改往往會帶來很多新的錯誤,這給系統的維護帶來了很多不便,在原有系統上開發新功能也變得越來越困難,越來越復雜。同時新員工對系統的學習也變得越來越困難,往往為了解自己負責的部分而不得不了解整個系統,這對新員工快速進入工作不利,降低了工作效率的同時變相增加了人工成本。
微服務是一種面向服務的架構風格,應用程序被構建為多個不同的小型服務的集合而不是單個應用程序[1]。相比于單體式架構,微服務架構的部署比較復雜,但是系統各模塊之間的耦合度很低。微服務架構將整個系統以業務功能為基礎進行劃分,將單個的系統服務拆解成不同的服務。微服務架構具有以下特點:
在傳統開發模式下,程序的多個功能會統一到一個項目里面,開發時必然會伴隨著代碼沖突,開發人員溝通困難等諸多問題,這個問題會隨著團隊人數增多,軟件復雜度提高變得越來越突出[2]。但是在微服務架構下,系統的不同功能被拆分成了單獨的服務,服務之間耦合度很小,每個服務作為一個項目組,每個項目組的人員只需要負責自己項目組的代碼即可,開發始終是簡潔高效的。同時在交付階段,傳統的項目組必須等到所有功能全部檢測完畢之后才可以交付,某一個地方的錯誤會拖累整個項目組的進度。而微服務是獨立部署和運行的,每項服務的檢測和交付都是獨立的,因此可以持續交付,這樣持續交付的方式提高了交付的速度。
每項微服務可以有自己的編碼方式,甚至是獨立的數據庫,這樣就使得系統的維護和升級難度大大降低,開發和維護團隊只需要了解自己負責的服務即可,不需要了解整個系統,每個服務都是單獨部署,單獨升級的。這樣使得系統的升級變得輕松,不需要像單體式架構一樣升級需要考慮整個系統,降低了系統升級的難度。
系統在開發完成之后并不是一成不變的,為了滿足客戶的需求,增加新功能不可避免,在傳統模式下每增加一個新功能,都要考慮對其他功能的影響,但是在微服務模式下,可以將新功能開發成一個新的微服務,由于獨立開發和部署的原因,和其他功能的關聯很小,可以保證原有功能不會受到影響,這樣就很大的提升了系統的擴展性。

圖1 單體架構和微服務架構[3]
RS10云平臺是系統底層技術架構的核心,RS10系統的所有服務都運行在云平臺上。云平臺采用了docker容器引擎和Kubernetes容器集群管理系統[4]。
docker是一個開源的容器引擎,docker容器本質上是一個進程,容器之間相互隔離,保證了容器的獨立運行。這符合微服務架構要求的服務獨立運行和部署的理念。docker建立容器需要以鏡像為模板,因此docker需要一個鏡像倉庫來存儲和管理鏡像。出于安全因素的考慮,公共的鏡像倉庫不符合系統的需要,因此建立私有的harbor鏡像倉庫。這樣不但可以存儲和管理鏡像版本,還可以保證內部開發環境的安全。鏡像在倉庫內部按照項目的不同進行分組,同一個項目的鏡像放在一起,管理十分方便。
Kubernetes是google公司推出的開源容器集群管理系統,它支持多種語言,Java、Python等語言都可以使用,這是RS10云平臺采用Kubernetes的原因之一。Kubernetes集群的節點分為master節點和node節點,其中master節點主要負責調度集群的資源,無論是資源的建立、刪除還是停止,都需要通過master節點來控制,是重中之重。Master節點一旦出現故障,整個集群都會癱瘓,因此RS10云平臺要求最少有兩個master節點,確保集群不會因為一個節點的故障影響整個系統。node節點負責工作資源的運行,部署的服務都會運行在node節點上。Node節點的故障不會影響整個集群,無論是哪個節點停止工作,master節點都會將故障節點負責的工作轉移到其他節點。因此node節點的數量是不固定的,一般會根據集群運行資源的需要進行調整。
Kubernetes不但可以通過命令控制資源,還可以通過可視化工具來管理系統資源。Kubernetes使用dashboard作為可視化工具,無論是節點,還是名稱空間、存儲類、控制器等資源,都可以通過dashboard進行管理。dashboard將用戶分為管理用戶和普通用戶,管理用戶可以對資源進行編輯、刪除等操作,普通用戶只能瀏覽頁面,查看集群情況,沒有修改的權限。另外Kubernetes不但可以擴充節點,還可以實現pod資源的擴容。傳統單體式應用的集群如果資源緊張,需要擴容,那么整個系統的所有功能都需要重新部署在一個新的節點上。但是大部分時候系統的資源緊張僅僅是其中某一個功能使用頻繁,并不是所有功能都使用頻繁,并且這樣的資源緊張在經過一個高峰期后會迅速回落,盲目增加節點的方式造成了資源的浪費。Kubernetes系統可以針對某個服務進行擴容,將資源緊張的微服務對應的pod節點進行擴容,這樣只針對某個服務進行擴容的方式無疑比起增加一個節點來說不僅節省了大量的資源,而且節省了大量的時間。等到服務使用的高峰期過去,還可以恢復原來的pod節點數量,這樣的工作機制,對用戶來說無疑是高效而又簡便的。

圖2 Kubernetes集群節點關系簡單示意圖

圖3 用可視化工具進行編輯、刪除操作
RS10系統將服務分為三種,分別是基礎服務,業務系統服務和第三方服務。
基礎服務包括安全認證、搜索服務、存儲服務、資源管理服務、業務元數據服務、信息推送服務、日志、監控等服務。這些服務是RS10系統運行所必需的服務,例如日志服務統一記錄應用程序產生的各種信息,包括服務的部署、運行、停止過程中產生的信息和記錄。維護和部署人員統一通過調用服務,來查看系統是否報錯,并對報出的錯誤進行處理;監控服務可以監控系統的軟硬件資源,硬件方面主要監控內存、硬盤、CPU等資源是否充足,一旦硬件資源剩余量過低,就會通知維護人員,通過增加集群工作節點的方式對系統硬件資源進行擴充,或者關閉不必要的微服務,減少硬件資源的使用。軟件資源方面主要監視pod、service等資源是否正常運行,如果資源沒有正常運行,就需要對沒有正常運行的資源進行維護,確認資源沒有正常運行的原因,并修改,記錄。通過軟硬件資源的監視,可以很方便的看出RS10系統的運行狀態,出現錯誤可以及時改正,減輕了系統維護人員的負擔;安全認證服務主要用于安全驗證。服務與服務之間,業務系統與服務之間的通信,都存在著網絡數據被竊取的風險,所以需要通過安全認證服務進行安全驗證,通過驗證之后進行安全有效的交互,屏蔽過濾掉惡意、不安全的請求,這樣增加了系統的安全性,確保系統數據不會被竊取。這些服務提供了對RS10系統業務的支撐。
業務系統服務包括EIP門戶服務、公文服務、合同服務、財務流程服務、MES服務、工作流服務、移動端服務、郵件服務等。業務系統服務是對業務系統中存在的標準業務流程進行抽取,抽取成標準服務,例如EIP門戶服務是對EIP系統中公共部分抽取服務,包括一些標準化的流程和頁面動態布局提供支持;公文服務是對公文的流程,包括公文創建、發起、查看、撤銷等抽取出標準的流程服務,對公文系統進行更好的服務支撐;工作流服務主要對工作流系統進行支撐,可以進行行政事務的審批和業務申請的審批。如請假申請,程序錯誤提交申請等;郵箱服務可以用于企業內部的郵件的接收、發送;移動端服務可以讓企業人員在移動設備上進行辦公,方便出差人員的使用,提高企業的辦公效率。
第三方服務是與第三方插件或工具集成的服務,包括報表和打印服務、ireport服務、語音服務、圖像識別服務、人工智能服務等。客戶的需求是多種多樣的,因此在系統中集成一些第三方服務變得不可避免。原來的單體式架構集成需要考慮第三方插件與系統的沖突,導致系統對第三方插件選擇的余地很小,需要多次測試才能夠確定是否可以采用第三方插件。但是在微服務架構下,系統的選擇范圍大了很多,可以更多的側重插件的性能。隨著人工智能和大數據的發展,圖像識別、人工智能等已經逐漸應用到了很多領域,對這些服務的集成,可以更好地適應時代的發展,滿足客戶的需求。
結合當前用戶越來越多的需求和單體式RS10系統越來越復雜的現狀,基于微服務架構的RS10系統的開發已經成為了當前迫切的需求。微服務架構具有的低耦合特性符合RS10的發展需要。將龐大的RS10系統拆解成一個個的微服務,解決了RS10系統當前系統復雜,學習入門難,升級難的問題,每個微服務的升級與其他微服務無關,這樣使得團隊之間的分工明確,每個團隊只需要維護自己所負責的服務即可,不用為了維護或者升級一個服務,必須將整個系統都了解一遍,極大地節約了人力資源。RS10系統從單體式架構升級為微服務架構,可以有效降低RS10系統的開發難度,提升RS10系統的開發效率。