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