吳志偉,鐘立民,黃永亮,李國華
(中國鐵道科學研究院集團有限公司 電子計算技術研究所,北京 100081)
鐵路貨運信息化是鐵路貨物運輸行業(yè)能力提升的重要方式,是提高貨運效率的重要手段之一。鐵路貨運信息化主要內(nèi)容之一是增強貨運信息在貨運各系統(tǒng)間的流轉能力。王軍提出對電子貨運票據(jù)進行管理[1]。2018年鐵路貨運推進貨運票據(jù)電子化工程,基于電子票據(jù)打通了貨運系統(tǒng)間信息傳輸和流轉,但信息沖突問題時有發(fā)生。王雪峰人等提出將微服務應用于高鐵WiFi運營,提高信息系統(tǒng)可擴展性和可維護性[2]。本文將解決信息沖突的重點放在構建統(tǒng)一的貨運基礎字典,一點維護多點使用,為貨運內(nèi)外提供統(tǒng)一的字典接口,結合微服務的相關優(yōu)點,構建伸縮性強,可維護性高且易于修改和發(fā)布的鐵路貨運基礎字典統(tǒng)一運維應用系統(tǒng)。本文希望通過對該系統(tǒng)的設計與實現(xiàn),可以達到提高貨運數(shù)據(jù)質(zhì)量的目的,并探索微服務在鐵路貨運的應用方式,為新系統(tǒng)構建和老舊系統(tǒng)改造提供參考。
規(guī)范統(tǒng)一鐵路貨運信息系統(tǒng)基礎字典,包括站名字典、局名字典、車務段字典、貨物品名品類字典、專用線字典、集裝箱箱型字典、客戶關系字典和辦理限制相關字典;統(tǒng)一引用外部系統(tǒng)車輛字典、線名字典,將內(nèi)外部數(shù)據(jù)字典進行統(tǒng)一匯總,確保貨運各信息系統(tǒng)引用字典的唯一性。明確各項基礎字典數(shù)據(jù)來源與歸口業(yè)務管理部門,明確與主數(shù)據(jù)平臺的對應關系,國鐵集團一點維護,多處使用,當字典變更后,以服務推送方式分發(fā)至各業(yè)務系統(tǒng),實現(xiàn)準確實時的字典同步,避免多處維護帶來的不一致性。同時設置字典使用有效期限,保留字典變更軌跡,便于后續(xù)追溯。
微服務架構是一種致力于精簡和廢除業(yè)務邏輯開發(fā)以外工作的新興軟件設計架構。微服務架構的核心在于微服務,即將龐大的軟件產(chǎn)品細分成多個零散的小型應用,然后通過微服務架構來重新組織這些零散的小型應用,達到了解決軟件產(chǎn)品高耦合問題的目的[3]。同時,微服務架構使細分后的應用工作簡單有序,降低了開發(fā)難度,減少了系統(tǒng)研發(fā)人力成本和資源成本[4]。微服務架構的另外一個優(yōu)勢,通過擴展組件的形式可以處理功能上的瓶頸問題。
微服務架構支持對每一個劃分后的小型應用單獨編譯、單獨部署。開發(fā)系統(tǒng)時,可以通過編譯、重新部署單個子服務來驗證變更。由于鐵路貨運基礎字典統(tǒng)一維護的現(xiàn)實要求,統(tǒng)一維護的基礎字典以及相關統(tǒng)計分析都可能會出現(xiàn)新的需求,而未來隨著接入系統(tǒng)的增加,性能也可能會出現(xiàn)瓶頸,所以系統(tǒng)設計開發(fā)時應充分考慮到系統(tǒng)功能的擴展和修改情況以及性能的擴充能力。所以,本系統(tǒng)采用微服務架構作為系統(tǒng)設計架構。
SpringBoot是Spring項目組的微服務產(chǎn)品,是基于Spring4.0版本設計出來的,目的是為了簡化Spring開發(fā)過程中的復雜配置操作,最終實現(xiàn)零配置[5]。一般Web開發(fā)中,使用SpringBoot基本框架,主要包括:Spring框架基礎功能的Spring Core模塊,控制邏輯和業(yè)務邏輯分離的Spring MVC模塊[6],聲明式事務和編程式事務支持的Spring DAO模塊,Web框架提供集成功能的Spring Web模塊,各種ORM框架接口的Spring ORM模塊,事件處理、資源裝載、數(shù)據(jù)校驗、框架式的Bean的訪問等功能的Spring Context模塊, AOP功能的Spring AOP模塊,創(chuàng)建獨立的、可生產(chǎn)的、基于Spring且能直接運行的應用程序的Spring Boot模塊,服務器端Java引擎接口的Thymeleaf模塊等[7-8]。
SpringBoot是一些庫的集合,只要包含相應依賴,就可以方便地被項目使用。SpringBoot可以輕松創(chuàng)建獨立的、可生產(chǎn)的、基于Spring且可以直接運行的應用系統(tǒng)[9]。由于其可以實現(xiàn)微服務架構且沒有復雜配置,所以在應用開發(fā)中,可以將更多精力投入到項目的業(yè)務邏輯研發(fā)中。
本系統(tǒng)在采用SpringBoot實現(xiàn)微服務架構的基礎上,也采用了Spring的相關產(chǎn)品,包括SpringMVC、SpringTemplate、SpringAOP等。由于業(yè)務需求的變化,未來可能會追加字典到統(tǒng)計維護中,系統(tǒng)需求中有一部分需求進行修改維護的可能較高,包括基礎字典同步、統(tǒng)計分析管理等,這部分功能完全按照微服務架構設計,將功能拆解為簡單的微服務。而系統(tǒng)需求中還有一部分是按照傳統(tǒng)Web應用方式可以實現(xiàn)且要求提供頁面功能服務,包括提供基礎字典維護、應急處置中部分功能等。針對這部分需求,設計系統(tǒng)時,采用SpringBoot微服務架構設計后臺功能并提供數(shù)據(jù)接口,前臺界面調(diào)用后臺接口的方式實現(xiàn)。
Vue是用于構建用戶界面的漸進式框架,通過整合第三方庫,基于腳手架框架開發(fā)Web前段頁面,提供強大的伸縮能力[10]。Vue支持各種類庫的同時,還易于使用,還可以為復雜的單頁應用提供驅(qū)動。
考慮到未來系統(tǒng)多平臺應用的可能和Vue強大的伸縮能力,同時,還考慮到Vue技術與SpringBoot技術可以實現(xiàn)前后臺分離,可以針對前臺和后臺單獨進行開發(fā)、維護和部署,減少了開發(fā)維護的復雜度和人力成本,所以將Vue確定為功能界面的開發(fā)技術。
系統(tǒng)整體上采用前后臺分離的服務架構,后臺由SpringBoot作為最主要框架,前臺由Vue實現(xiàn)界面展示。前后臺之間通過數(shù)據(jù)服務訪問的方式調(diào)用功能。
設計系統(tǒng)時,考慮到技術可靠程度和技術學習的人工成本,所以采用Oracle關系數(shù)據(jù)庫作為數(shù)據(jù)存儲的方式。采用SpringBoot作為業(yè)務邏輯實現(xiàn)的基礎框架,用于支持微服務的實現(xiàn)。采用SpringMVC實現(xiàn)服務的接收和提供,采用SpringTemplate實現(xiàn)與數(shù)據(jù)庫交互,采用SpringAOP實現(xiàn)日志等功能。由于系統(tǒng)在提供數(shù)據(jù)服務的基礎上,也需要提供功能服務,所以采用Vue、Webpack和Maven作為系統(tǒng)前臺實現(xiàn)的主要技術。同時,考慮到服務的認證問題,所以采用Redis來進行前臺數(shù)據(jù)存儲。
系統(tǒng)功能架構,如圖1所示。
圖1 系統(tǒng)功能架構
(1)基礎字典查詢,主要是提供基礎字典查詢的功能服務和數(shù)據(jù)服務;
(2)授權管理,主要提供系統(tǒng)功能服務和數(shù)據(jù)服務的授權訪問控制功能;
(3)基礎字典同步,主要是配置同步信息和根據(jù)配置信息與相關業(yè)務系統(tǒng)信息同步,推送方式包括主動推送字典信息和只通知字典修改2種方式;
(4)基礎字典維護,主要用于維護基礎字典和記錄維護軌跡,維護基礎字典的方式主要是設置定時任務;
(5)應急處置,用于定時維護任務出錯時值班人員應急維護基礎字典;
(6)統(tǒng)計分析管理,主要包括統(tǒng)計中間數(shù)據(jù)定時生成和統(tǒng)計數(shù)據(jù)加工展示;
(7)監(jiān)控管理,主要對系統(tǒng)字典維護、同步系統(tǒng)連接、字典同步執(zhí)行情況進行監(jiān)控。
服務訪問權限管理,主要是為了解決不同用戶或系統(tǒng)訪問的權限控制問題。由于系統(tǒng)主要功能就是提供基礎字典服務,不僅需要較高的可靠性,也需要較高的安全性。所以,必須要設計完善的服務訪問權限機制以保證系統(tǒng)的安全。
考慮到系統(tǒng)提供服務的方式主要包括數(shù)據(jù)服務和功能服務2種,所以針對2種訪問方式采用不同的服務訪問授權機制。如圖2所示,由于功能服務主要由Vue來實現(xiàn),所以針對功能服務,本系統(tǒng)采用Vue中成熟的角色控制機制和用戶權限管理來對訪問權限進行管理。針對數(shù)據(jù)服務,本系統(tǒng)主要采用授權碼模式,在微服務架構中加入授權服務器,客戶端引導用戶代理到授權服務器,用戶代理確認授權,則授權服務器返回授權碼,客戶端獲取授權碼后向授權服務器獲取訪問令牌,并通過訪問令牌訪問服務資源。
圖2 服務訪問權限管理示意圖
系統(tǒng)維護的字典主要是貨運相關基礎字典,系統(tǒng)還為貨運相關系統(tǒng)提供基礎字典訪問服務。系統(tǒng)中涉及全路數(shù)據(jù)的基礎字典從鐵路主數(shù)據(jù)平臺獲取,其他更多數(shù)據(jù)是貨運各系統(tǒng)中需要的基礎數(shù)據(jù)和多個貨運系統(tǒng)間共用的數(shù)據(jù),在實際生產(chǎn)維護中發(fā)現(xiàn),這些數(shù)據(jù)需要提取出來進行統(tǒng)一運維。隨著貨票電子化的實施,貨運相關系統(tǒng)進行有效關聯(lián),所以需要獲取字典信息的系統(tǒng)數(shù)量猛增。由此,考慮將字典同步方式設計為非侵入式設計,主要包括2種:(1)根據(jù)配置字典,將同步字典直接同步給相關系統(tǒng);(2)通知相關系統(tǒng)基礎字典已經(jīng)修改,相關系統(tǒng)訪問服務獲取修改后字典。
設計了3個微服務來實現(xiàn)字典同步功能,包括修改通知服務,字典獲取服務,字典推送服務。對于已經(jīng)存在的系統(tǒng),可以采用第1種方式,系統(tǒng)設計一個解析同步數(shù)據(jù)的接口,在獲得字典數(shù)據(jù)后,通過接口將數(shù)據(jù)加工成系統(tǒng)內(nèi)部格式,然后保存。對于新系統(tǒng),可以在獲得字典修改通知后,去訪問字典服務,直接獲得修改內(nèi)容。
系統(tǒng)中的定時任務在功能主要分為3種,對每一種定時任務設計如下。
2.3.1 用于維護基礎字典的非周期性定時任務
一般基礎字典的維護都有一定的提前時間,規(guī)定基礎字典修改的生效時間。這時,就需要通過定時任務實現(xiàn)規(guī)定時間的基礎字典信息生效。由于基礎字典維護工作是本系統(tǒng)的一個主要工作,所以不能采用一般的維護方式。針對這種情況,通過配置和功能設計的方式實現(xiàn)維護信息保存和定時任務的自動執(zhí)行。
2.3.2 用于基礎字典同步的周期性定時任務
基礎字典同步,涉及到與外部系統(tǒng)的通信和定時任務的執(zhí)行。考慮到現(xiàn)實情況,基礎字典同步一般可以發(fā)生在一天中的特定時間。所以,定時任務中變化的信息主要包括基礎字典配置推送列表,維護內(nèi)容發(fā)布列表,推送結果反饋。定時任務設計為定時任務對每一個外部系統(tǒng)啟用一個線程實現(xiàn)同步工作。
2.3.3 用于統(tǒng)計分析處理和監(jiān)控的周期性定時任務
基礎字典的統(tǒng)計分析方式比較多,參考多年系統(tǒng)應用經(jīng)驗和相關業(yè)務要求,對統(tǒng)計數(shù)據(jù)設計中間表。執(zhí)行周期性定時任務,將基礎數(shù)據(jù)提前處理并保存,用以提高統(tǒng)計分析處理的效率。系統(tǒng)監(jiān)控的定時任務頻率較高且內(nèi)容簡單,但比較重要,所以采用多個線程交替執(zhí)行的方式。
本系統(tǒng)是貨運基礎性應用系統(tǒng),系統(tǒng)安全涉及到安全生產(chǎn),系統(tǒng)設計時著重考慮了系統(tǒng)的安全問題。系統(tǒng)設計中采用斷路保護機制Hystrix斷路器,防止因系統(tǒng)中某個服務不可用導致故障蔓延而造成其它系統(tǒng)故障。系統(tǒng)還采用HystrixDashboard實現(xiàn)系統(tǒng)監(jiān)控,對服務的健康程度、請求變化率、節(jié)點個數(shù)、最近10 s錯誤率、每秒并發(fā)數(shù)和斷路器狀態(tài),最近1 min的響應時間、熔斷數(shù)和線程池拒絕數(shù)等信息進行統(tǒng)計監(jiān)控。系統(tǒng)參考OAuth認證方式,采用授權碼模式實現(xiàn)對服務訪問控制。
如圖3所示,數(shù)據(jù)維護中的站名字典維護界面,對主要站名信息進行維護。
圖3 系統(tǒng)站名維護界面
如圖4所示,定時任務監(jiān)控界面,通過設置時間條件,可以獲得當日定時任務的完成情況。
圖4 系統(tǒng)定時任務監(jiān)控界面
如圖5所示,應急處置界面,主要是用于值班人員在站名維護出現(xiàn)問題時直接對站名進行修改,站名修改涉及到的其它修改信息,則由應急處置服務直接根據(jù)其他信息獲取。
圖5 系統(tǒng)應急處置站名修改界面
目前,綜合應用系統(tǒng)、貨運價格系統(tǒng)、運輸條件系統(tǒng)等已經(jīng)采用由本系統(tǒng)統(tǒng)一提供的站名字典、辦理限制字典等基礎字典。以車站字典為例,此前,各個系統(tǒng)單獨維護,部分系統(tǒng)甚至還沒有友好的字典維護界面,所以,系統(tǒng)一次維護的平均時長為2 h,并且平均每15天就會有因字典沖突問題造成生產(chǎn)、票據(jù)、統(tǒng)計等數(shù)據(jù)不一致的情況發(fā)生。采用本系統(tǒng)后,只需對統(tǒng)一字典進行維護,一次維護的平均時長為0.5 h,車站字典維護工作量明顯減少,字典維護困難的問題也得到了根本性解決,且未再有數(shù)據(jù)不一致的情況發(fā)生。
本文介紹了鐵路貨運基礎字典統(tǒng)一運維應用系統(tǒng)的相關背景和建設系統(tǒng)的主要目標。在此基礎上介紹了采用的微服務架構、SpringBoot和Vue等相關技術,以及根據(jù)這些技術設計的系統(tǒng)的技術架構。系統(tǒng)主要關注點包括系統(tǒng)的服務訪問權限控制,字典同步方式,定時任務設計和其它相關安全設計。本系統(tǒng)已經(jīng)得到應用,并取得了良好的應用效果。在未來一段時間,我們將會在系統(tǒng)的圖形化展示方面和移動端訪問方式等方面進行改進,結合時空地理信息,創(chuàng)建更加生動的展示方式。
鐵路貨運基礎字典統(tǒng)一運維應用系統(tǒng)的建立,統(tǒng)一了貨運基礎字典數(shù)據(jù),便于管理和維護,還減少了各系統(tǒng)的維護工作量。另外,系統(tǒng)對微服務架構進行一定的探索和實踐,為其它系統(tǒng)構建和老舊系統(tǒng)的改造提供了參考,也為未來大數(shù)據(jù)平臺的構建奠定了堅實的數(shù)據(jù)基礎。