王敬林 ,朱韋橋
(1.中國鐵道科學研究院 研究生部,北京 100081;2.北京經緯信息技術有限公司,北京 100081;3.中國鐵道科學研究院集團有限公司 電子計算技術研究所,北京 100081)
鐵路企業(yè)面對著繁雜的企業(yè)年金經辦業(yè)務、巨額的年金基金管理和嚴格的投資監(jiān)督等日常業(yè)務管理,傳統(tǒng)的手工方式或完全依托賬管人提供的信息系統(tǒng)進行管理,已無法滿足業(yè)務發(fā)展需要,部分企業(yè)已經建設了相關企業(yè)年金信息系統(tǒng),用于企業(yè)年金業(yè)務管理,由于設計理念和開發(fā)技術的限制,多采用單體架構進行系統(tǒng)的構建[1-2],但在運行過程中暴露了一些問題:
(1)企業(yè)年金政策性強、時效要求嚴格,鐵路企業(yè)年金業(yè)務調整頻繁,具有涉及人員廣、業(yè)務操作復雜、專業(yè)性強等特點,年金系統(tǒng)需要根據(jù)業(yè)務規(guī)則的變化,進行及時迭代與更新,而傳統(tǒng)的單體架構信息系統(tǒng)可維護性和可擴展性較差,面對微小的調整,整體系統(tǒng)都需要經歷開發(fā)、測試、整體打包、停機、更新、部署、啟動等實施過程,無法適應高頻率更新升級的業(yè)務要求。
(2)年金信息系統(tǒng)涉及成員單位多、業(yè)務規(guī)則多、對口機構多且數(shù)據(jù)交互頻繁,導致子系統(tǒng)和功能模塊多,單體架構信息系統(tǒng)局部子系統(tǒng)或功能模塊的故障,將導致整體系統(tǒng)崩潰,無法滿足系統(tǒng)的高可用性。
(3)隨著鐵路云計算的發(fā)展,鐵路企業(yè)已基本實現(xiàn)資源虛擬化、系統(tǒng)集群化的生產環(huán)境,單體架構信息系統(tǒng)面臨運行瓶頸,同時,無法充分利用云計算可伸縮性、高擴展性的優(yōu)勢和特長[3]。
本文主要研究基于微服務架構構建的鐵路企業(yè)年金信息系統(tǒng)(簡稱:微服務年金系統(tǒng)),解決單體年金信息系統(tǒng)的諸多問題。
鐵路企業(yè)一般采用理事會受托管理模式,即鐵路企業(yè)和職工作為委托人,委托企業(yè)年金理事會(受托人)管理企業(yè)年金基金。理事會下一般會設置專門經辦機構(理事會辦公室),負責企業(yè)年金理事會日常工作。由受托人選擇一家同時具有賬戶管理、托管資質的機構作為賬戶管理人和托管人,由受托人選擇若干家具有投資管理資質的機構作為投資管理人[2],企業(yè)年金各管理機構的職責分工與信息流傳輸如圖1所示。
圖1 企業(yè)年金管理機構職責分工及信息流傳輸示意圖
鐵路企業(yè)年金業(yè)務整體可分為計劃層和成員層,其中,計劃層包括產生和存續(xù)2個階段,成員層包括產生、存續(xù)和終止3個階段。計劃層產生階段主要包含計劃建立相關流程;存續(xù)階段主要包含計劃監(jiān)督、基金運作、投資監(jiān)督和信息披露4部分。成員層產生階段主要包含單位及職工的計劃加入相關流程;存續(xù)階段主要包含單位及職工的信息變更和年金繳費2部分;終止階段主要包含計劃退出流程。需求結構,如圖2所示。
圖2 鐵路企業(yè)年金管理總體需求結構圖
微服務架構是一系列小的、松耦合的分布式服務,這些服務圍繞業(yè)務能力劃分構建,具有組件化、通信協(xié)議輕量化、服務集中化、數(shù)據(jù)分散化的優(yōu)點,能夠使用不同的編程語言、不同的存儲技術在云平臺下獨立部署[4-6]。
1.3.1 微服務拆分
領域驅動設計(DDD,Domain Driven Design)是一種以領域為核心的設計方法與理念。系統(tǒng)采用DDD理念,結合鐵路企業(yè)年金管理業(yè)務,將企業(yè)年金業(yè)務領域拆分為:(1)核心域:成員領域;(2)支撐子域:年金計劃子域,成員單位子域,繳費子域,支付子域等;(3)通用子域:消息子域,文件子域,流程子域,報表子域等。
使用場景走查的方法,確認領域模型滿足領域中的業(yè)務場景和業(yè)務流程,根據(jù)每一個子域對應的邊界上下文完成服務的拆分。業(yè)務服務主要包括:年金計劃服務,成員單位服務,成員服務,年金繳費服務,年金支付服務等;公共服務包括:消息服務,文件服務,日志服務,流程服務等。
1.3.2 微服務年金系統(tǒng)總體架構
系統(tǒng)總體架構分為表現(xiàn)層、接口層、實體層、業(yè)務服務層、公共服務層、服務治理與監(jiān)督、資源層等7個部分,如圖3所示。
圖3 微服務年金系統(tǒng)總體架構圖
(1)表現(xiàn)層:使用前后端分離技術,對后臺服務進行組合,完成與用戶的交互。本系統(tǒng)中的年金日常業(yè)務管理和年金投資監(jiān)督管理等頁面功能,可以在后臺服務接口確定的情況下進行前端的獨立開發(fā)。
(2)接口層:將實體層、業(yè)務服務層、公共服務所覆蓋的內容進行聚合,按照客戶端的需求,為表現(xiàn)層提供符合展示要求的數(shù)據(jù),封裝成接口服務。如成員單位接口、成員接口、年金繳費接口、待遇支付接口、成交管理接口、投資轉換接口等。接口提供在線數(shù)據(jù)交互和數(shù)據(jù)文件導入導出2種方式。
(3)實體層:微服務架構下的實體同時為業(yè)務服務和公共服務提供支持,在接口需要的情況下也可以直接調用。系統(tǒng)中,所有的數(shù)據(jù)均將封裝為接口,方便對外提供統(tǒng)一的數(shù)據(jù)服務能力,包括計劃信息、成員單位信息、成員信息、繳費信息、支付信息模型等。
(4)業(yè)務服務層:結合企業(yè)年金的實際業(yè)務,將實體和公共服務進行封裝,為接口層提供支持。本層涵蓋本系統(tǒng)的主要業(yè)務,包括年金計劃服務、成員單位服務、成員服務、年金繳費服務、待遇支付信息服務等。
(5)公共服務:將微服務年金系統(tǒng)中多處用到的功能進行統(tǒng)一封裝,以便更好地為業(yè)務服務層提供支持,包括消息服務、文件服務、日志服務、流程服務、緩存服務等。
(6)服務監(jiān)督與治理:微服務架構下,對服務的安全、監(jiān)控、預警十分重要。服務監(jiān)督與治理貫穿公共服務層、業(yè)務服務層和接口層,主要提供服務注冊、服務監(jiān)控、服務授權、日志分析、熔斷器等功能,實現(xiàn)對微服務的治理。
(7)資源層:主要是指系統(tǒng)操作的相關資源,包括數(shù)據(jù)庫資源及各類文件資源,如計劃信息庫、成員單位信息庫、成員信息庫、繳費信息庫、待遇支付信息庫,以及相關的各類附件信息庫(業(yè)務經辦文件、指令等)。
Spring Cloud 是一系列框架有序集合,其標準化的、全站式的技術方案構成了一個生態(tài)圈,涵蓋了眾多微服務架構實現(xiàn)所需的核心組件,例如,服務網關、服務注冊發(fā)現(xiàn)、配置中心、認證授權、容錯限流、調用鏈監(jiān)控、日志監(jiān)控等[7-8]。本系統(tǒng)微服務架構實現(xiàn)主要使用的組件如圖4所示。
圖4 微服務年金系統(tǒng)技術實現(xiàn)圖
(1)服務網關:客戶端請求通過統(tǒng)一的服務網關接入后端服務。網關使用Zuul、Ribbon和Eureka 3個組件,實現(xiàn)智能路由和負載均衡的功能。智能路由就是依據(jù)請求策略將請求網關轉發(fā)到認證授權服務,按照相應的權限分發(fā)到相應的服務實例,防止非法請求訪問后端服務,同時,Zuul為后期規(guī)劃的灰度測試創(chuàng)造了條件。
(2)服務注冊發(fā)現(xiàn):Eureka是一個基于REST的服務注冊中心。在微服務架構中,服務需要集中化管理,因此,基礎服務、公共服務和通用服務需要通過服務治理實現(xiàn)自動化注冊和發(fā)現(xiàn)。服務注冊中心是網關服務路由信息存儲倉庫,也是服務之間進行交互的媒介,發(fā)揮著服務注冊和發(fā)現(xiàn)的作用。Eureka支持服務續(xù)約和服務下線,方便用戶定位服務問題以及提供中間層服務器的故障轉移。
(3)配置中心:Spring Cloud Config結合Git實現(xiàn)配置中心的搭建和配置信息的統(tǒng)一管理。配置服務通過注冊中心注冊到Eureka Server,企業(yè)年金服務可以通過注冊中心發(fā)現(xiàn)配置服務,企業(yè)年金服務從而獲取所需要的配置信息。
(4)認證授權:Spring Security、OAuth2和JWT實現(xiàn)微服務年金系統(tǒng)的認證授權??蛻舳苏埱笸ㄟ^網關路由到認證鑒權服務,獲取用戶登錄信息和權限信息,客戶端攜帶Token支持跨程序調用。微服務年金系統(tǒng)存在異構系統(tǒng),利用JWT實現(xiàn)單點登錄。
(5)容錯限流:Hystrix實現(xiàn)微服務架構的服務可靠性,Hystrix服務延遲和容錯庫可用來隔離服務故障,確保系統(tǒng)穩(wěn)健運行。各個服務獨立部署,且服務與服務之間存在相互依賴關系,因此,服務訪問失敗的原因和場景非常復雜,容錯限流服務可以實現(xiàn)服務隔離、服務降級和服務熔斷,從而阻止聯(lián)動故障的發(fā)生。
(6)調用鏈監(jiān)控:Spring Cloud Sleuth結合Zipkin構建微服務的調用鏈監(jiān)控,客戶端每一個請求在調用過程需要多個服務,每個服務獨立部署在不同物理機器和不同數(shù)據(jù)存儲之間,調用鏈監(jiān)控可以跟蹤一個或多個事務,然后,拼接出服務運行的全鏈路。通過Zipkin可以查看跨多個事務的事務流。
(7)日志監(jiān)控:日志監(jiān)控通過ELK(Elastic Search、Logstash、Kibana)和Kafka實現(xiàn)日志收集與監(jiān)控,分布在不同服務器的日志收集組件,通過消息中間件Kafka傳遞給Logstash,進行過濾分析后將數(shù)據(jù)存儲在Elastic Search,通過Kibana查看所有的日志數(shù)據(jù)。
微服務年金系統(tǒng)采用前后端分離,前端使用Angular和Typescript開發(fā),實現(xiàn)MVC劃分和通道、路由等設計。前端應用部署在Nginx組合的服務器上,通過反向代理轉發(fā)頁面請求到后端服務器,同時Nginx實現(xiàn)前端的負載均衡[9]。
應用整體界面采用完全的響應式編程,使得數(shù)據(jù)驅動、局部刷新容易實現(xiàn);采用Bootstrap兼容可擴展框架,通過頁面柵格自適應各種分辨率的顯示器,實現(xiàn)更好的用戶體驗。
通常,微服務架構的認證授權采用Spring Security、OAuth2和JWT的組合,該認證授權框架雖然具有一次獲取Token可以多次使用的優(yōu)勢,即不需要每次都到認證授權服務去獲取用戶信息和權限信息,但是,如果用戶權限發(fā)生改變,Token存儲的信息不能及時變更,就會造成業(yè)務的漏洞,微服務年金系統(tǒng)通過引入緩存數(shù)據(jù)庫(Redis)技術,用于存儲Token信息,當用戶權限更改時,將會自動刪除存在Redis的Token,請求再次經過網關時,驗證Token不存在,提示用戶重新登錄。
微服務年金系統(tǒng)授權認證過程,如圖5所示。
(1)客戶端發(fā)送請求到服務網關后,網關會根據(jù)請求路徑過濾請求[9]。如果該路徑是登錄并獲取Token操作的路徑則直接放行,請求直接到達認證授權服務進行登錄操作;
(2)進行JWT私鑰加密,生成Token存儲到Redis;
(3)返回給客戶端。如果是其他請求,將會到Redis驗證Token是否存在,若不存在,則返回客戶端重新登錄;若Token存在,則進行Token私鑰解密校驗:如果token被篡改或者失效,則直接拒絕訪問并返回錯誤信息;如果驗證成功,經過路由到達請求的年金業(yè)務服務,請求服務響應并返回數(shù)據(jù)。
圖5 微服務年金系統(tǒng)授權認證過程圖
微服務年金系統(tǒng)將數(shù)據(jù)和服務分開,保證服務的獨立性。由于鐵路企業(yè)數(shù)據(jù)要求集中管理,數(shù)據(jù)存儲采用集中式的數(shù)據(jù)管理方式再實現(xiàn)數(shù)據(jù)的獨立性[10-11]。系統(tǒng)針對每個業(yè)務服務劃分專門的獨立空間,從邏輯上與其他服務相隔離,如圖6所示??缙髽I(yè)年金業(yè)務的數(shù)據(jù)存儲依據(jù)BASE思想,即基本可用(Basically Available)、軟狀態(tài)(Soft state)和最終一致性(Eventually consistent)的TCC模式實現(xiàn)分布式事務。
圖6 微服務年金系統(tǒng)數(shù)據(jù)存儲實現(xiàn)圖
微服務年金系統(tǒng)已上線運行,應用效果顯著。系統(tǒng)實現(xiàn)了鐵路企業(yè)內部成員、年金資金、年金業(yè)務規(guī)則等基礎數(shù)據(jù)統(tǒng)一管理,與相關系統(tǒng)數(shù)據(jù)交換和信息共享,信息流、資金流全程監(jiān)控,為年金基金管理和投資監(jiān)督提供了保障。企業(yè)年金政策調整、業(yè)務管理變化后,利用微服務架構的優(yōu)勢,系統(tǒng)具有橫向擴展、快速更新升級的能力,為企業(yè)年金日常經辦提供了時效保證,提高了用戶體驗。通過微服務架構改造的系統(tǒng)業(yè)務相對獨立,服務集群部署,日志監(jiān)控全面,運維定位迅速,為系統(tǒng)的高可用提供了技術支撐。
本文分析使用單體架構進行鐵路企業(yè)年金系統(tǒng)構建的問題,介紹了微服務架構的概念和關鍵特性,并將微服務架構的理念引入到鐵路企業(yè)年金信息化建設的系統(tǒng)設計中,實現(xiàn)了鐵路企業(yè)年金業(yè)務流程貫通及全過程信息化管理,提高了系統(tǒng)的負載能力、可擴展性和獨立性。
該系統(tǒng)需要進一步研究的內容有:
(1)雖然按照領域驅動設計進行了服務拆分,但是,隨著日常業(yè)務的開展,服務拆分策略的合理性依然值得探討,后續(xù)繼續(xù)研究鐵路企業(yè)年金業(yè)務特點,優(yōu)化服務拆分;
(2)微服務年金系統(tǒng)服務可靠性的設計仍不夠全面,服務訪問的雪崩效應、服務失敗應對策略、服務容錯、服務隔離、服務限流、服務降級等問題沒有完全解決,需要繼續(xù)研究服務可靠性方案,進一步完善方案。