曹海鵬,唐偉忠,朱祎雯,湯欣宇,劉海寧
(中國鐵路蘭州局集團(tuán)有限公司,蘭州 730000)
鐵路信息化歷經(jīng)多年的持續(xù)建設(shè),各專業(yè)領(lǐng)域信息系統(tǒng)已基本實(shí)現(xiàn)業(yè)務(wù)場景的全覆蓋,在運(yùn)輸組織、調(diào)度指揮、客貨營銷、辦公綜合等多個(gè)領(lǐng)域發(fā)揮著突出作用。隨著信息化進(jìn)入云計(jì)算時(shí)代,鐵路信息系統(tǒng)由第三代際向第四代際演進(jìn),對應(yīng)用系統(tǒng)開發(fā)效率和資產(chǎn)復(fù)用等方面提出更高要求[1]?!笆奈濉辫F路網(wǎng)絡(luò)安全和信息化規(guī)劃中提出,要加強(qiáng)一體化信息平臺建設(shè),優(yōu)化集成服務(wù)平臺,構(gòu)建業(yè)務(wù)和技術(shù)中臺,提升應(yīng)用開發(fā)效率和管控水平[2]。
隨著面向服務(wù)架構(gòu)(SOA,Service-Oriented Architecture)和微服務(wù)架構(gòu)的發(fā)展,無服務(wù)器(Serverless)理念已成為云時(shí)代企業(yè)應(yīng)用開發(fā)的主流發(fā)展方向[3]。無服務(wù)器架構(gòu)是傳統(tǒng)云計(jì)算平臺的延伸,是平臺即服務(wù)(PaaS,Platform as a Service )向更細(xì)粒度的函數(shù)即服務(wù)(FaaS,F(xiàn)unction as a Service )和后端即服務(wù)(BaaS,Backend as a Service )的發(fā)展。無服務(wù)器架構(gòu)將基礎(chǔ)設(shè)施與業(yè)務(wù)應(yīng)用解耦,將軟硬件資源抽象為服務(wù),將業(yè)務(wù)過程邏輯與表示邏輯進(jìn)行分離,以松散耦合方式集成函數(shù)、第三方服務(wù)和微服務(wù)。它提供各類基礎(chǔ)服務(wù),使開發(fā)人員在開發(fā)應(yīng)用系統(tǒng)時(shí)只需關(guān)注業(yè)務(wù)邏輯實(shí)現(xiàn),已成為一種基于微服務(wù)架構(gòu)的企業(yè)應(yīng)用研發(fā)、 部署、運(yùn)維新范式[4],促進(jìn)了應(yīng)用開發(fā)專業(yè)分工,有助于應(yīng)用快速迭代和降低開發(fā)成本。
為提升鐵路應(yīng)用開發(fā)的資源復(fù)用水平、交付能力和研發(fā)質(zhì)量,本文利用平臺化、服務(wù)化、流程化的設(shè)計(jì)理念,研究提出基于無服務(wù)器架構(gòu)的鐵路應(yīng)用開發(fā)資源共享與集成平臺(簡稱:開發(fā)資源共享平臺)設(shè)計(jì)方案,提供統(tǒng)一的應(yīng)用開發(fā)資源共享與集成方式,允許開發(fā)人員將應(yīng)用開發(fā)資源以服務(wù)形式進(jìn)行發(fā)布與集成,在共享既有鐵路應(yīng)用開發(fā)成果的基礎(chǔ)上,快速開發(fā)新應(yīng)用來滿足鐵路業(yè)務(wù)創(chuàng)新需求,加快鐵路數(shù)字化轉(zhuǎn)型和智能化發(fā)展。
(1)建立鐵路應(yīng)用開發(fā)資源公用服務(wù)庫
為鐵路企業(yè)內(nèi)部及外部合作單位的開發(fā)人員提供共享服務(wù)管理平臺,方便開發(fā)人員將可復(fù)用的公用功能封裝成不同粒度的服務(wù),包括登陸認(rèn)證、日志、報(bào)表、低代碼、定時(shí)任務(wù)、數(shù)據(jù)資源、中間件等,建成鐵路應(yīng)用開發(fā)資源公用服務(wù)庫;提供可視化服務(wù)編排操作界面,支持公用服務(wù)的低代碼開發(fā);依托該公用服務(wù)庫,形成基于公用服務(wù)的鐵路業(yè)務(wù)應(yīng)用開發(fā)模式,提高鐵路應(yīng)用開發(fā)成果的可復(fù)用水平,減少重復(fù)開發(fā),降低開發(fā)成本。
(2)提供安全可靠、規(guī)范高效的鐵路應(yīng)用集成方法
提供簡單便捷的服務(wù)訪問和完善靈活的訪問控制,確保開發(fā)人員安全、合規(guī)、高效地訪問平臺提供的共享服務(wù)資源;支持多協(xié)議(主流的Http(s)、Web Socket、MQ、Nacos 等)、多網(wǎng)域(鐵路外部服務(wù)網(wǎng)、鐵路綜合信息網(wǎng)、鐵路安全生產(chǎn)網(wǎng))的API 集成總線,提供統(tǒng)一的服務(wù)集成接口,實(shí)現(xiàn)異構(gòu)信息系統(tǒng)資源的的互聯(lián)互通,方便開發(fā)人員完成多網(wǎng)域業(yè)務(wù)應(yīng)用的集成、測試與上線部署。
(3)提供完善的運(yùn)維支持,保障平臺及相關(guān)業(yè)務(wù)應(yīng)用穩(wěn)定運(yùn)行
為服務(wù)提供者、服務(wù)調(diào)用者、平臺管理員提供服務(wù)資源調(diào)用日志查詢、服務(wù)使用監(jiān)控、服務(wù)異常預(yù)警等運(yùn)維支持,幫助相關(guān)人員及時(shí)發(fā)現(xiàn)和快速處置平臺及相關(guān)應(yīng)用系統(tǒng)運(yùn)行中出現(xiàn)的各類異常,確保納入平臺管理的所有服務(wù)、平臺自身以及基于該平臺開發(fā)的相關(guān)業(yè)務(wù)應(yīng)用能夠穩(wěn)定運(yùn)行。
開發(fā)資源共享平臺基于無服務(wù)器架構(gòu),通過建立鐵路應(yīng)用開發(fā)資源公用服務(wù)庫,實(shí)現(xiàn)鐵路應(yīng)用開發(fā)可復(fù)用共性服務(wù)的集中規(guī)范管理;依托公用服務(wù)庫,以API 網(wǎng)關(guān)作為應(yīng)用集成總線,為開發(fā)人員提供基于服務(wù)共享與集成的鐵路應(yīng)用開發(fā)新模式。在該平臺支持下,開發(fā)人員既可作為服務(wù)提供者將其應(yīng)用開發(fā)成果發(fā)布為可共享的服務(wù),也可作為服務(wù)調(diào)用者來使用公用服務(wù)完成應(yīng)用集成開發(fā)。該平臺架構(gòu)設(shè)計(jì)如圖1 所示。
圖1 開發(fā)資源共享平臺架構(gòu)示意
(1)基礎(chǔ)設(shè)施層:提供平臺運(yùn)行的網(wǎng)絡(luò)資源池、存儲資源池、服務(wù)器資源池,實(shí)現(xiàn)資源動態(tài)配置,提高資源利用率。
(2)存儲層:采用Oracle、Redis、MinIO、MongoDB 等多種數(shù)據(jù)庫存儲數(shù)據(jù)。其中,Oracle 主要用于存儲服務(wù)發(fā)布記錄、服務(wù)申請記錄等數(shù)據(jù);Redis 用于緩存API 網(wǎng)關(guān)動態(tài)路由、網(wǎng)關(guān)閾值等需要實(shí)時(shí)更新和快速訪問的數(shù)據(jù);MinIO 主要用于存儲服務(wù)使用文檔;MongoDB 用于存儲服務(wù)調(diào)用請求日志、服務(wù)調(diào)用鏈路記錄、服務(wù)編排操作記錄等數(shù)據(jù)。
(3)應(yīng)用層:實(shí)現(xiàn)共享服務(wù)的發(fā)布、調(diào)用、集成、監(jiān)控、評價(jià)全流程管理。提供服務(wù)管理功能,方便開發(fā)人員按規(guī)范發(fā)布共享服務(wù)資源;提供服務(wù)調(diào)用申請、接口路由配置、接口協(xié)議轉(zhuǎn)換、接口緩存等集成開發(fā)功能,方便開發(fā)人員利用共享服務(wù)資源快速開發(fā)應(yīng)用;通過流量控制、合法請求認(rèn)證、傳輸安全控制等服務(wù)訪問控制,支持高并發(fā)服務(wù)調(diào)用;提供API 網(wǎng)關(guān)監(jiān)控、日志查詢、數(shù)據(jù)庫性能監(jiān)控等運(yùn)維工具及異常處置功能,保證平臺穩(wěn)定性和高可用性。
(4)接口層:包括API 網(wǎng)關(guān)和統(tǒng)一門戶。API網(wǎng)關(guān)基于Nginx 和SpringGateWay 構(gòu)建,為服務(wù)集成提供路由選擇、數(shù)據(jù)轉(zhuǎn)發(fā)和協(xié)議轉(zhuǎn)換;統(tǒng)一門戶為平臺用戶提供統(tǒng)一身份認(rèn)證與權(quán)限管理。
(5)用戶層:基于Vue3 實(shí)現(xiàn)Web 端用戶界面,提供授權(quán)的服務(wù)管理、服務(wù)集成配置操作頁面,以及可視化監(jiān)控頁面。
開發(fā)資源共享平臺(以下簡稱平臺)實(shí)現(xiàn)服務(wù)發(fā)布、申請、審核、集成、監(jiān)控、預(yù)警全流程管控,建立鐵路應(yīng)用開發(fā)資源公用服務(wù)庫,支持開發(fā)人員安全、高效、可靠地共享與集成應(yīng)用開發(fā)資源。該平臺功能層次結(jié)構(gòu)如圖2 所示。
圖2 開發(fā)資源共享平臺功能層次結(jié)構(gòu)
平臺用戶主要包括服務(wù)提供者、服務(wù)調(diào)用者、平臺管理員3 類。面向服務(wù)提供者,提供服務(wù)發(fā)布、服務(wù)編排、服務(wù)清單、服務(wù)調(diào)用監(jiān)控等功能;面向服務(wù)調(diào)用者,提供服務(wù)申請、接口緩存、日志查詢等功能;面向平臺管理員,提供API 網(wǎng)關(guān)管理、異常預(yù)警、異常監(jiān)控等功能。
服務(wù)提供者通過填寫既有服務(wù)基本信息或者服務(wù)編排功能發(fā)布服務(wù),待平臺管理員通過發(fā)布申請后,展示在服務(wù)清單中。
3.1.1 服務(wù)發(fā)布
服務(wù)提供者整理既有開發(fā)成果的相關(guān)資料,按要求填寫服務(wù)發(fā)布申請,平臺支持多種接口協(xié)議類型的服務(wù)。
(1)服務(wù)發(fā)布申請:服務(wù)提供者整理既有開發(fā)成果的相關(guān)資料,按要求填寫服務(wù)發(fā)布申請,包括服務(wù)地址、服務(wù)接口協(xié)議類型(可選擇Socket、Http(s)、MQ 或Nacos 微服務(wù))等。
(2)服務(wù)變更申請:當(dāng)服務(wù)地址、配置服務(wù)緩存或日志存儲有效期等信息發(fā)生變化時(shí),服務(wù)提供者向平臺管理員發(fā)起變更申請。
(3)服務(wù)發(fā)布/變更審核:平臺管理員對服務(wù)提供者提交的服務(wù)發(fā)布申請或服務(wù)變更申請進(jìn)行細(xì)致審核,符合要求的申請被批準(zhǔn)后,對應(yīng)的服務(wù)會被列入服務(wù)清單;對于被拒絕的申請,會返回審核意見。
3.1.2 服務(wù)編排
服務(wù)提供者通過對已發(fā)布的服務(wù)進(jìn)行可視化組裝,將多個(gè)服務(wù)組合成更大粒度的新服務(wù),并對新服務(wù)進(jìn)行測試,經(jīng)測試驗(yàn)證合格的新服務(wù)按照服務(wù)發(fā)布申請與審核流程發(fā)布為新的服務(wù)。
(1)服務(wù)組裝:平臺提供可視化操作界面,服務(wù)提供者通過拖、拉、拽操作即可對已發(fā)布服務(wù)進(jìn)行組裝和編排,定義和調(diào)整各服務(wù)的數(shù)據(jù)處理邏輯、相互間依賴關(guān)系及調(diào)用順序,實(shí)現(xiàn)邏輯更復(fù)雜、顆粒度更大的新業(yè)務(wù)服務(wù),以快速響應(yīng)業(yè)務(wù)需求。
(2)服務(wù)測試:服務(wù)提供者完成所編排新服務(wù)的測試,包括模擬用戶操作、異常測試、邊界條件測試等,還能對封裝在服務(wù)中的各個(gè)組件或功能項(xiàng)點(diǎn)進(jìn)行獨(dú)立測試,檢查它們是否符合設(shè)計(jì)要求。
3.1.3 服務(wù)清單
按照服務(wù)性質(zhì),將服務(wù)劃分為應(yīng)用服務(wù)和數(shù)據(jù)服務(wù)2 類。應(yīng)用服務(wù)側(cè)重于數(shù)據(jù)計(jì)算和邏輯處理;數(shù)據(jù)服務(wù)側(cè)重于數(shù)據(jù)的采集與存儲。
(1)服務(wù)排名:以服務(wù)評分、穩(wěn)定性指標(biāo)、被調(diào)用次數(shù)的加權(quán)和作為評分值,按評分值由高到低顯示平臺上發(fā)布的所有服務(wù)排名列表。其中,服務(wù)評分是服務(wù)提供者對已申請服務(wù)的平均評分;穩(wěn)定性指標(biāo)主要依據(jù)服務(wù)發(fā)生異常的次數(shù);被調(diào)用次數(shù)是指該服務(wù)在最近 3 個(gè)月內(nèi)被調(diào)用的總次數(shù)。
(2)服務(wù)詳情:用戶可查看服務(wù)相關(guān)詳細(xì)信息,包括服務(wù)簡介、服務(wù)調(diào)用情況、日均被調(diào)用次數(shù)、故障率、服務(wù)使用說明等。
服務(wù)調(diào)用者通過提交服務(wù)調(diào)用申請來訪問平臺管理的公用服務(wù)庫,平臺提供路由匹配、協(xié)議轉(zhuǎn)換以及服務(wù)緩存等功能,完成合法調(diào)用請求的正確轉(zhuǎn)發(fā)。
3.2.1 服務(wù)調(diào)用申請
服務(wù)調(diào)用者根據(jù)業(yè)務(wù)開發(fā)需求提出服務(wù)調(diào)用申請,待平臺管理員審批通過之后,平臺自動生成唯一標(biāo)識符返回給服務(wù)調(diào)用者。
(1)調(diào)用申請:服務(wù)調(diào)用者選中要調(diào)用的服務(wù),設(shè)置自己用于調(diào)用服務(wù)的IP 地址,并按需選擇數(shù)據(jù)加密算法,然后發(fā)起調(diào)用申請。IP 地址支持單個(gè)IP、連續(xù)IP 段和整個(gè)IP 網(wǎng)段,加密算法可以是對稱加密算法或非對稱加密算法。
(2)服務(wù)標(biāo)識:服務(wù)調(diào)用申請通過平臺管理員的審批后,平臺會自動為其生成一個(gè)唯一的統(tǒng)一資源定位符(URL,Uniform Resource Locator)與密鑰標(biāo)識符,供服務(wù)調(diào)用者合法使用。
3.2.2 接口路由配置
平臺根據(jù)用戶操作記錄,自動實(shí)時(shí)更新API 網(wǎng)關(guān)的路由謂詞,將服務(wù)調(diào)用請求正確轉(zhuǎn)發(fā)。
(1)路由謂詞動態(tài)生成:平臺從持久層加載服務(wù)發(fā)布記錄和服務(wù)申請記錄,解析后生成路由謂詞(包含路由斷言和路由攔截器),并每隔30 s 更新一次,使路由謂詞處于最新狀態(tài)。
(2)請求轉(zhuǎn)發(fā)處理:當(dāng)請求到達(dá)時(shí),平臺根據(jù)路由斷言的請求匹配機(jī)制判斷路是否正確,并經(jīng)過多級過濾處理后,轉(zhuǎn)發(fā)至相應(yīng)服務(wù)。
3.2.3 接口協(xié)議轉(zhuǎn)換
平臺允許服務(wù)提供者通過多種主流接口協(xié)議(Http(s)、MQ、Socket 等)發(fā)布服務(wù),而服務(wù)調(diào)用者則統(tǒng)一采用標(biāo)準(zhǔn)接口協(xié)議調(diào)用服務(wù),由平臺完成接口協(xié)議的無縫轉(zhuǎn)換,實(shí)現(xiàn)接口協(xié)議規(guī)范化[5]。
(1)標(biāo)準(zhǔn)協(xié)議轉(zhuǎn)換:平臺根據(jù)服務(wù)提供者選擇的服務(wù)類型,將相應(yīng)類型的接口協(xié)議與Http(s)進(jìn)行轉(zhuǎn)換。
(2)數(shù)據(jù)轉(zhuǎn)換:每一種協(xié)議類型都有自身的數(shù)據(jù)格式,平臺將Http(s) 協(xié)議的JSON 數(shù)據(jù)轉(zhuǎn)換和映射為其它協(xié)議類型相應(yīng)的數(shù)據(jù)格式和結(jié)構(gòu)。
3.2.4 接口緩存
對于計(jì)算復(fù)雜、響應(yīng)時(shí)間長、響應(yīng)結(jié)果變化頻率較低的服務(wù),平臺提供了公用接口緩存機(jī)制。在高并發(fā)服務(wù)調(diào)用場景下,接口緩存有助于縮短服務(wù)調(diào)用請求的響應(yīng)時(shí)間,減輕目標(biāo)服務(wù)并發(fā)壓力,使服務(wù)提供者專注于業(yè)務(wù)邏輯,而無需考慮并發(fā)性能需求[6]。
(1)接口緩存創(chuàng)建:利用分布式緩存技術(shù),平臺以請求路由和請求參數(shù)的哈希值作為鍵值,以目標(biāo)服務(wù)的響應(yīng)結(jié)果作為哈希表記錄,創(chuàng)建具有預(yù)定義有效時(shí)間(緩存有效時(shí)間由服務(wù)提供者在發(fā)布服務(wù)時(shí)設(shè)置)的接口緩存。
(2)接口緩存使用:當(dāng)服務(wù)調(diào)用者首次調(diào)用某個(gè)設(shè)置有接口緩存的服務(wù)時(shí),從目標(biāo)服務(wù)獲取響應(yīng)結(jié)果后,在將響應(yīng)結(jié)果返回給服務(wù)調(diào)用者的同時(shí),會將響應(yīng)結(jié)果寫入公用接口緩存中,供其他訪問該服務(wù)的服務(wù)調(diào)用者讀取。當(dāng)其他服務(wù)調(diào)用者調(diào)用該服務(wù)時(shí),若對應(yīng)的接口緩存中保存著處于有效期內(nèi)的響應(yīng)結(jié)果,直接從接口緩存中讀取并返回給服務(wù)請求者,而無需將服務(wù)調(diào)用請求轉(zhuǎn)發(fā)給目標(biāo)服務(wù)。
API 網(wǎng)關(guān)作為服務(wù)調(diào)用者和目標(biāo)服務(wù)之間的一個(gè)中間層,提供了統(tǒng)一、安全、可管理的 API 訪問接口。通過流量控制,使API 網(wǎng)關(guān)能夠平穩(wěn)應(yīng)對高并發(fā)訪問,并結(jié)合合法請求認(rèn)證與傳輸安全控制,保證眾多的服務(wù)調(diào)用者能夠平穩(wěn)、合規(guī)、安全地使用公用服務(wù)庫。
3.3.1 流量控制
API 網(wǎng)關(guān)利用集群部署技術(shù)實(shí)現(xiàn)負(fù)載均衡,支持高并發(fā)服務(wù)調(diào)用請求;在出現(xiàn)突發(fā)的請求高峰時(shí),服務(wù)調(diào)用請求可按需均衡、平穩(wěn)轉(zhuǎn)發(fā),保證平臺穩(wěn)定運(yùn)行。
(1)API 網(wǎng)關(guān)閾值調(diào)整:當(dāng)承載API 網(wǎng)關(guān)的虛擬機(jī)資源發(fā)生變化或新增部署AIP 網(wǎng)關(guān)時(shí),平臺管理員依據(jù)虛擬機(jī)的帶寬與計(jì)算能力的容量,及時(shí)調(diào)整API 網(wǎng)關(guān)的權(quán)重、最大每秒查詢率閾值(QPS,Queries Per Second )和最大并發(fā)線程數(shù)等閾值。
(2)流量監(jiān)測與限流:平臺監(jiān)測API 網(wǎng)關(guān)的QPS、并發(fā)線程數(shù)和請求速率,當(dāng)調(diào)用請求超過API網(wǎng)關(guān)閾值時(shí),該API 網(wǎng)關(guān)自動降低權(quán)重,并進(jìn)入限流模式,避免網(wǎng)絡(luò)擁堵,保護(hù)平臺免受惡意或高負(fù)載請求的影響。
3.3.2 合法請求認(rèn)證
平臺根據(jù)請求源IP 黑白名單 ,確保服務(wù)調(diào)用請求的合法性,防范API 網(wǎng)關(guān)可能面臨的注入攻擊、掃描攻擊、篡改攻擊等風(fēng)險(xiǎn)[7]。
(1)合法請求識別:平臺解析服務(wù)調(diào)用請求報(bào)文中包含的服務(wù)請求來源IP、User-Agent、請求參數(shù)等請求頭信息,以服務(wù)調(diào)用者申請時(shí)提交的服務(wù)調(diào)用IP 地址,作為該唯一接口的白名單,來判斷服務(wù)請求是否合法。
(2)異常請求禁止:平臺判斷服務(wù)調(diào)用請求的接口路由是否為本平臺發(fā)出的可用接口,并自動識別爬蟲、SQL 注入、盜鏈攻擊、高頻惡意請求等非法請求,將識別出的非法服務(wù)調(diào)用請求IP 加入黑名單,禁止來自該IP 的服務(wù)訪問請求。
3.3.3 傳輸安全控制
針對數(shù)據(jù)傳輸?shù)陌踩珕栴},平臺提供統(tǒng)一的數(shù)據(jù)加密、脫敏、植入水印、壓縮等處理機(jī)制,防止數(shù)據(jù)在傳輸過程中被惡意截獲或篡改,保證服務(wù)調(diào)用請求的完整性、機(jī)密性、不可抵賴性,避免服務(wù)請求被不合規(guī)的二次流轉(zhuǎn),并實(shí)現(xiàn)服務(wù)調(diào)用請求版權(quán)宣誓。
(1)加密:使用特定算法對請求參數(shù)與響應(yīng)結(jié)果進(jìn)行加密,將其轉(zhuǎn)換為一段不易被識別或不可讀的代碼(即“密文”),以避免數(shù)據(jù)泄露、被篡改或?yàn)E用。
(2)脫敏:通過應(yīng)用替換、重排等規(guī)則,對響應(yīng)結(jié)果中的敏感數(shù)據(jù)進(jìn)行隱藏,有效保護(hù)隱私數(shù)據(jù)。
(3)植入水?。阂圆豢梢娀螂y以察覺的方式,在響應(yīng)數(shù)據(jù)中加入特殊標(biāo)識,在數(shù)據(jù)被傳輸、使用或共享時(shí),追蹤數(shù)據(jù)的來源和版權(quán)信息。
(4)壓縮:在返回響應(yīng)結(jié)果前采用數(shù)據(jù)壓縮技術(shù),消除數(shù)據(jù)冗余,減少傳輸位數(shù),降低數(shù)據(jù)容量及存儲成本,提高數(shù)據(jù)傳輸效率。
面向所有平臺用戶,提供授權(quán)的平臺運(yùn)行監(jiān)控功能,主要包括API 網(wǎng)關(guān)監(jiān)控、日志管理、數(shù)據(jù)庫性能監(jiān)控,為平臺運(yùn)維提供有力支持,保障平臺及相關(guān)業(yè)務(wù)應(yīng)用平穩(wěn)運(yùn)行[8]。
3.4.1 API 網(wǎng)關(guān)監(jiān)控
監(jiān)控API 網(wǎng)關(guān)運(yùn)行動態(tài),及時(shí)發(fā)現(xiàn)異常并預(yù)警,確保服務(wù)調(diào)用請求能夠順利通過API 網(wǎng)關(guān)。
(1)實(shí)時(shí)監(jiān)控圖:動態(tài)計(jì)算部署API 網(wǎng)關(guān)的虛擬機(jī)的內(nèi)存使用變化率、存活線程變化、CPU 使用變化率3 項(xiàng)監(jiān)控指標(biāo),自動生成 API 網(wǎng)關(guān)虛擬機(jī)的監(jiān)控指標(biāo)趨勢圖,幫助平臺管理員優(yōu)化虛擬機(jī)資源和API 網(wǎng)關(guān)配置。
(2)異常預(yù)警:平臺監(jiān)測API 網(wǎng)關(guān)監(jiān)控指標(biāo),一旦發(fā)現(xiàn)異常情況,立即通過短信向相關(guān)人員發(fā)送預(yù)警信息。
3.4.2 日志查詢
平臺采集服務(wù)調(diào)用相關(guān)信息,并持久化存儲服務(wù)調(diào)用日志,為用戶提供授權(quán)的日志檢索與查詢功能,便于服務(wù)異常排查和風(fēng)險(xiǎn)朔源。
(1)日志記錄:在不影響服務(wù)調(diào)用過程的前提下,平臺以異步方式持久化記錄服務(wù)調(diào)用日志;根據(jù)服務(wù)提供者設(shè)置的日志存儲有效期,定期刪除過期日志。
(2)日志查詢:服務(wù)提供者可查詢自己所發(fā)布服務(wù)的調(diào)用日志,服務(wù)調(diào)用者只能查看本人調(diào)用服務(wù)的日志。提供多種快捷的日志檢索與查看功能,日志內(nèi)容包括服務(wù)名稱、調(diào)用系統(tǒng)、調(diào)用服務(wù)來源服務(wù)IP、發(fā)生時(shí)間段等信息。
3.4.3 數(shù)據(jù)庫性能監(jiān)控
平臺動態(tài)計(jì)算SQL 執(zhí)行性能指標(biāo),并生成可視化的數(shù)據(jù)庫性能圖表,幫助平臺管理員發(fā)現(xiàn)平臺數(shù)據(jù)庫異常和性能劣化跡象,快速定位性能瓶頸,并開展性能調(diào)優(yōu),保證數(shù)據(jù)庫穩(wěn)定、高效運(yùn)行。
(1)指標(biāo)計(jì)算:根據(jù)已執(zhí)行SQL 的SQL 命令內(nèi)容、SQL 行數(shù)、執(zhí)行時(shí)間、更新行數(shù)、并發(fā)量信息,定時(shí)統(tǒng)計(jì)最大執(zhí)行時(shí)間、最大并發(fā)量、錯(cuò)誤執(zhí)行數(shù)等SQL 執(zhí)行性能指標(biāo)。
(2)性能圖表:平臺基于SQL 執(zhí)行性能指標(biāo),生成可視化的數(shù)據(jù)庫性能監(jiān)控圖表,幫助平臺管理員分析數(shù)據(jù)庫性能狀況,指導(dǎo)數(shù)據(jù)庫調(diào)優(yōu)和評估性能調(diào)優(yōu)方案的效果。例如,通過分析慢SQL 趨勢,可以為數(shù)據(jù)庫擴(kuò)容與索引優(yōu)化提供依據(jù)。
針對各服務(wù)可能出現(xiàn)的異常情況,平臺監(jiān)測服務(wù)調(diào)用過程,提供服務(wù)異常檢測、異常處置、異常通知等功能,實(shí)現(xiàn)服務(wù)異??焖俨蹲教幚恚_保平臺平穩(wěn)運(yùn)行。
3.5.1 異常檢測
平臺通過監(jiān)測服務(wù)異常度量指標(biāo),及時(shí)發(fā)現(xiàn)服務(wù)異常,并進(jìn)一步分析判斷異常類型。
(1)服務(wù)異常檢測:采用服務(wù)平均響應(yīng)時(shí)間、單位時(shí)間內(nèi)異常比例、單位時(shí)間內(nèi)異常數(shù)3 個(gè)指標(biāo)來衡量服務(wù)穩(wěn)定性,平臺動態(tài)計(jì)算服務(wù)異常度量指標(biāo),據(jù)此判斷服務(wù)是否出現(xiàn)異常情況。
(2)異常類型判斷:當(dāng)平臺檢測到異常時(shí),會根據(jù)自身與目標(biāo)服務(wù)建立連接的所花費(fèi)時(shí)間、服務(wù)響應(yīng)時(shí)間及服務(wù)響應(yīng)結(jié)果,自動分析和判斷服務(wù)發(fā)生異常的原因,如服務(wù)宕機(jī)、服務(wù)負(fù)載過高、服務(wù)下線(即服務(wù)進(jìn)程處于激活狀態(tài),但卻不可用)、服務(wù)處理過程異常。
3.5.2 異常處置
當(dāng)平臺檢測到某個(gè)服務(wù)出現(xiàn)異常時(shí),根據(jù)服務(wù)異常類型,自動進(jìn)行熔斷或降級運(yùn)行。
(1)服務(wù)熔斷:當(dāng)某個(gè)服務(wù)下線或在處理過程出現(xiàn)異常時(shí),該服務(wù)被開啟熔斷;一個(gè)服務(wù)被熔斷后,調(diào)用該服務(wù)的請求不再被轉(zhuǎn)發(fā)給該服務(wù),而是由平臺直接調(diào)用fallback 方法來返回異常響應(yīng)。
(2)服務(wù)降級:當(dāng)被調(diào)用服務(wù)的負(fù)載過高時(shí),該服務(wù)被開啟半熔斷,僅允許少量請求被轉(zhuǎn)發(fā)給該服務(wù);根據(jù)服務(wù)調(diào)用請求執(zhí)行的實(shí)際情況,決定使該服務(wù)恢復(fù)正常 ,或繼續(xù)保持半熔斷狀態(tài)。
3.5.3 異常通知
當(dāng)平臺檢測到異常時(shí),立即通知相關(guān)人員,提醒其快速排查和處置異常。
(1)通知格式定義:平臺管理員根據(jù)異常分類,設(shè)置預(yù)定義的異常類型,定義異常類型對應(yīng)的通知格式,并指定接收通知的相關(guān)人員。
(2)異常通知發(fā)送:當(dāng)平臺檢測到異常時(shí),根據(jù)異常類型和預(yù)定義的通知格式,自動生成異常通知,以短信形式發(fā)送給相關(guān)人員(服務(wù)提供者、服務(wù)調(diào)用者或平臺管理員),提醒其關(guān)注異常事件。
API 網(wǎng)關(guān)是實(shí)現(xiàn)服務(wù)共享與集成的關(guān)鍵,負(fù)責(zé)服務(wù)的請求轉(zhuǎn)發(fā)、監(jiān)控預(yù)警、協(xié)議轉(zhuǎn)換、安全控制、異常響應(yīng)、監(jiān)控日志采集、服務(wù)緩存等。所有服務(wù)調(diào)用請求都要先經(jīng)過API 網(wǎng)關(guān),由其根據(jù)路由謂詞將請求轉(zhuǎn)發(fā)至相應(yīng)的服務(wù)。此外,API 網(wǎng)關(guān)還需要采取安全保障措施來提供平臺內(nèi)外的安全隔離,以拒絕外部惡意訪問,避免身份和信息的泄露[9]。
Nginx 是一種開源的反向代理服務(wù)器與負(fù)載均衡器,具有高并發(fā)性、穩(wěn)定性和安全性;SpringGateWay是構(gòu)建微服務(wù)應(yīng)用的重要組件,利用異步非阻塞編程模型來處理高并發(fā)請求。本文基于Nginx 和SpringGateWay,設(shè)計(jì)了具備高并發(fā)訪問負(fù)載均衡能力的API 網(wǎng)關(guān),API 網(wǎng)關(guān)多級過濾處理過程如圖3 所示。
圖3 API 網(wǎng)關(guān)多級過濾處理機(jī)制示意
(1)Nginx 將高并發(fā)服務(wù)調(diào)用請求均衡地分配給SpringGateWay 集群進(jìn)行處理,以提高API 網(wǎng)關(guān)的數(shù)據(jù)處理能力和可用性。
(2)基于SpringGateWay,建立流量控制、異常請求禁止、合法請求識別、異常響應(yīng)等多級斷言,用于服務(wù)調(diào)用請求的合法性檢測和鑒權(quán)。
(3)在轉(zhuǎn)發(fā)服務(wù)調(diào)用請求或響應(yīng)結(jié)果之前,多級過濾器依次對請求參數(shù)或響應(yīng)結(jié)果進(jìn)行加密、壓縮、植入數(shù)據(jù)水印、脫敏、監(jiān)控日志采集,實(shí)現(xiàn)服務(wù)調(diào)用過程的安全防護(hù)和運(yùn)行監(jiān)控。
(4)在轉(zhuǎn)發(fā)服務(wù)調(diào)用請求或響應(yīng)結(jié)果之前,完成Http 與其它類型接口協(xié)議的轉(zhuǎn)換。
服務(wù)調(diào)用全鏈路是指從源端用戶發(fā)起服務(wù)調(diào)用到最終獲取響應(yīng)結(jié)果的過程中,服務(wù)調(diào)用請求經(jīng)過的所有處理環(huán)節(jié)及涉及的相關(guān)組件。在云計(jì)算時(shí)代,應(yīng)用中包含的組件類型不斷增多,組件間調(diào)用關(guān)系較為復(fù)雜,服務(wù)調(diào)用全鏈路的可視化跟蹤分析有助于增強(qiáng)故障檢測與定位能力[10]。平臺通過分析服務(wù)調(diào)用請求日志,追溯服務(wù)調(diào)用請求全鏈路,并據(jù)此自動構(gòu)建服務(wù)調(diào)用全景圖,完整揭示服務(wù)間調(diào)用關(guān)系、每個(gè)服務(wù)被調(diào)用的頻率和每次調(diào)用的執(zhí)行內(nèi)容等。服務(wù)調(diào)用全景圖可用于指導(dǎo)性能調(diào)優(yōu)和發(fā)現(xiàn)業(yè)務(wù)系統(tǒng)間依賴關(guān)系,為異常處置和故障分析提供參考。平臺使用監(jiān)控日志過濾與鏈路關(guān)聯(lián)技術(shù),實(shí)現(xiàn)服務(wù)調(diào)用請求全鏈路追蹤,具體流程如圖4 所示。
圖4 服務(wù)調(diào)用請求全鏈路監(jiān)控流程示意
(1)監(jiān)控日志過濾器從API 網(wǎng)關(guān)抓取日志數(shù)據(jù),并按統(tǒng)一命名規(guī)則為服務(wù)調(diào)用請求所經(jīng)過的所有結(jié)點(diǎn)命名:API 網(wǎng)關(guān)中各個(gè)SpringGateWay 以其運(yùn)行的IP 地址和端口作為標(biāo)識,目標(biāo)服務(wù)以其發(fā)布服務(wù)記錄時(shí)生成的唯一標(biāo)識ID 命名,源服務(wù)以其申請?zhí)幚碛涗洉r(shí)生成的唯一標(biāo)識ID 命名。
(2)監(jiān)控日志過濾器將抓取的日志數(shù)據(jù)放入RocketMQ 隊(duì)列中, 供監(jiān)控日志記錄進(jìn)程從RocketMQ 隊(duì)列讀取,實(shí)現(xiàn)了兩者之間通過異步方式傳輸日志數(shù)據(jù)。
(3)監(jiān)控日志記錄進(jìn)程將服務(wù)調(diào)用日志以異步方式持久化,并按服務(wù)調(diào)用請求的日期將服務(wù)調(diào)用鏈路記錄表劃分為多個(gè)子集,以分區(qū)形式存儲在MongoDB 數(shù)據(jù)庫中,以提高查詢性能,便于快速生成服務(wù)調(diào)用鏈路和服務(wù)調(diào)用全景圖。
(4)鏈路關(guān)聯(lián)進(jìn)程從MongoDB 數(shù)據(jù)庫讀取服務(wù)調(diào)用日志記錄,利用節(jié)點(diǎn)的標(biāo)識信息,分析節(jié)點(diǎn)間調(diào)用關(guān)系,將服務(wù)間調(diào)用依賴關(guān)系動態(tài)關(guān)聯(lián)起來,生成服務(wù)調(diào)用鏈路記錄表(包括請求源、請求時(shí)間、響應(yīng)結(jié)果等信息)。
(5)可視化監(jiān)控頁面從MongoDB 數(shù)據(jù)庫讀取服務(wù)調(diào)用鏈路記錄表,并基于完整服務(wù)調(diào)用鏈路快速顯示服務(wù)調(diào)用全景圖。
(6)根據(jù)服務(wù)發(fā)布者維護(hù)的被調(diào)用服務(wù)日志存儲有效期,創(chuàng)建日志清理任務(wù),由開源定時(shí)任務(wù)調(diào)度中心XXL-JOB 定時(shí)觸發(fā)該任務(wù),自動完成過期日志的清理,保證日志查詢效率。
完善的運(yùn)行監(jiān)控與報(bào)警功能是保證服務(wù)穩(wěn)定運(yùn)行的基礎(chǔ)[11],也是平臺運(yùn)維的利器。平臺為用戶提供簡單、直觀的監(jiān)控與預(yù)警信息展示,自動生成性能指標(biāo)監(jiān)控圖表,方便平臺管理員、服務(wù)提供者、服務(wù)調(diào)用者監(jiān)視API 網(wǎng)關(guān)的健康狀態(tài)及服務(wù)使用情況,隨時(shí)掌握系統(tǒng)運(yùn)行狀態(tài),快速響應(yīng)異常情況。
Prometheus 是一種開源的服務(wù)監(jiān)控系統(tǒng)和時(shí)序數(shù)據(jù)庫,提供了快捷數(shù)據(jù)采集、存儲和查詢功能;Grafana 是一款開源的度量工具和可視化套件,支持多種數(shù)據(jù)源以及豐富的插件庫,常用于系統(tǒng)數(shù)據(jù)分析和監(jiān)控?;赑rometheus 和Grafana,設(shè)計(jì)可視化監(jiān)控API 網(wǎng)關(guān),如圖5 所示。
圖5 API 網(wǎng)關(guān)可視化監(jiān)控
(1)開啟API 網(wǎng)關(guān)的Actuator 功能,使其主動暴露與API 網(wǎng)關(guān)運(yùn)行有關(guān)的度量指標(biāo)數(shù)據(jù)。
(2)在Prometheus 服務(wù)器(Server)中配置好需要監(jiān)控的API 網(wǎng)關(guān)的IP 地址和端口號,利用服務(wù)發(fā)現(xiàn)機(jī)制檢測已上線的API 網(wǎng)關(guān),并通過Pull 方式拉取運(yùn)行度量指標(biāo)數(shù)據(jù)。
(3)在可視化監(jiān)控頁面中使用Grafana 創(chuàng)建儀表盤,選擇查詢Prometheus 數(shù)據(jù)源中運(yùn)行度量指標(biāo)數(shù)據(jù),設(shè)置自定義圖標(biāo)顯示方式和樣式,實(shí)現(xiàn) API網(wǎng)關(guān)虛擬機(jī)及服務(wù)調(diào)用請求可視化監(jiān)控圖表。
(4)在Grafana 中配置好預(yù)警規(guī)則,當(dāng)單位時(shí)間內(nèi)服務(wù)接口異常、請求時(shí)長、并發(fā)數(shù)等超過一定閾值時(shí),通過短信提醒服務(wù)提供者予以關(guān)注。
為適應(yīng)云計(jì)算時(shí)代的發(fā)展要求,本文設(shè)計(jì)了基于無服務(wù)架構(gòu)的鐵路應(yīng)用開發(fā)資源共享與集成平臺;在建立鐵路應(yīng)用開發(fā)資源公用服務(wù)庫的基礎(chǔ)上,以API 網(wǎng)關(guān)作為應(yīng)用集成總線,為開發(fā)人員提供了一種基于服務(wù)共享與集成的鐵路應(yīng)用開發(fā)新模式。該平臺通過流量控制、合法請求認(rèn)證、傳輸安全控制等服務(wù)訪問控制,支持高并發(fā)服務(wù)調(diào)用;提供API 網(wǎng)關(guān)監(jiān)控、日志查詢、數(shù)據(jù)庫性能監(jiān)控等運(yùn)維工具及異常處置機(jī)制,有效保證平臺的穩(wěn)定性和高可用性。該平臺的應(yīng)用將有助于提升鐵路應(yīng)用開發(fā)的資源復(fù)用水平、交付能力和研發(fā)質(zhì)量。
目前,該平臺僅可支持服務(wù)調(diào)用者向服務(wù)提供者主動請求獲取響應(yīng)結(jié)果的單向通信,尚未實(shí)現(xiàn)服務(wù)提供者與服務(wù)調(diào)用者的雙向通信模式。后續(xù)將研究雙向通信的服務(wù)集成模式,擴(kuò)大平臺的適用范圍。此外,為進(jìn)一步增強(qiáng)該平臺應(yīng)對單點(diǎn)瓶頸和網(wǎng)絡(luò)安全風(fēng)險(xiǎn)的能力,將繼續(xù)深化平臺安全防護(hù)、API 網(wǎng)關(guān)集群部署、系統(tǒng)運(yùn)維保障技術(shù)研究,不斷提高平臺的安全性和可靠性。