陳德權(quán)
(1.福建省基礎地理信息中心,福建 福州 350002)
隨著自然資源管理業(yè)務的不斷拓展和深入,自然資源外業(yè)現(xiàn)場核查已成為業(yè)務管理的核心工作之一。近年來,福建省自然資源廳開展的土地利用變更調(diào)查、土地整治項目管理[1-2]、移動執(zhí)法監(jiān)察[3-4]等自然資源管理業(yè)務均在各自業(yè)務系統(tǒng)的支持下,以手持GNSS移動設備為外業(yè)核查的技術手段,對相關業(yè)務進行監(jiān)管。未來還將在地質(zhì)災害點核查、違法用地督察、礦山生態(tài)治理等更多的全省自然資源管理業(yè)務上進行深入應用。為避免相同業(yè)務功能的重復建設,需在現(xiàn)有業(yè)務系統(tǒng)的基礎上構(gòu)建統(tǒng)一的自然資源外業(yè)核查系統(tǒng),為各類自然資源管理業(yè)務提供統(tǒng)一的外業(yè)核查數(shù)據(jù)來源,因此需要充分考慮跨平臺服務接口的兼容性、服務拓展與可擴充性以及全省多業(yè)務應用帶來的高并發(fā)問題。微服務架構(gòu)[5-7]則可用來解決上述問題。本文設計了基于分布式微服務架構(gòu)的自然資源外業(yè)核查系統(tǒng),提升了系統(tǒng)的可靠性和穩(wěn)定性。系統(tǒng)采用領域驅(qū)動設計方法將自然資源核查業(yè)務劃分為細粒度的微服務[6],以實現(xiàn)服務之間的高度解耦;核查終端還可根據(jù)實際業(yè)務需要,調(diào)用微服務進行功能組合,有效應對業(yè)務拓展的需要。
系統(tǒng)由支撐層、數(shù)據(jù)層、微服務層、服務網(wǎng)關和應用層組成,各部分按照一定的標準和協(xié)議緊密結(jié)合在一起,為自然資源核查業(yè)務提供信息化支撐,如圖1所示。支撐層依托數(shù)字福建云計算平臺提供的虛擬化計算資源,形成數(shù)據(jù)存儲集群、應用服務集群以及相關的安全設施服務。數(shù)據(jù)層根據(jù)數(shù)據(jù)類型分類存儲,其中核查業(yè)務數(shù)據(jù)庫存儲相關的業(yè)務數(shù)據(jù);空間數(shù)據(jù)庫存儲與空間位置相關的數(shù)據(jù),如圖斑數(shù)據(jù)、地名點數(shù)據(jù)、軌跡點數(shù)據(jù)等;圖片數(shù)據(jù)庫存儲外業(yè)核查的照片;業(yè)務系統(tǒng)交換數(shù)據(jù)存儲從第三方自然資源業(yè)務系統(tǒng)中生成的核查任務數(shù)據(jù);Redis緩存數(shù)據(jù)庫存儲緩存數(shù)據(jù),可提高微服務獲取數(shù)據(jù)的效率。微服務層由數(shù)據(jù)倉儲接口、微服務和服務注冊中心構(gòu)成,其中數(shù)據(jù)倉儲接口向下與數(shù)據(jù)層中的各類數(shù)據(jù)完成數(shù)據(jù)讀寫操作,向上為微服務提供統(tǒng)一的數(shù)據(jù)操作接口;微服務利用領域驅(qū)動設計方法將外業(yè)核查業(yè)務劃分為細粒度的服務,并部署在多臺服務器的Nginx下,以實現(xiàn)服務的集群[7];服務注冊中心負責微服務的注冊、發(fā)現(xiàn)與管理,通過心跳包監(jiān)測微服務的運行狀態(tài)。服務網(wǎng)關將服務注冊中心的微服務對外映射,并利用負載均衡調(diào)度算法實現(xiàn)前后端路由控制和轉(zhuǎn)發(fā)。應用層由核查終端和管理端共同實現(xiàn)對自然資源核查業(yè)務的管理,并通過服務接口為其他業(yè)務系統(tǒng)提供核查數(shù)據(jù)來源。
圖1 系統(tǒng)總體架構(gòu)
自然資源外業(yè)核查系統(tǒng)的主要數(shù)據(jù)為核查業(yè)務數(shù)據(jù)、與業(yè)務緊密結(jié)合的空間數(shù)據(jù)以及外業(yè)核查采集的圖片數(shù)據(jù)。為了提高系統(tǒng)查詢效率,本文以Redis數(shù)據(jù)庫為系統(tǒng)的緩存數(shù)據(jù)庫,存儲系統(tǒng)中被頻繁調(diào)用的業(yè)務數(shù)據(jù)和統(tǒng)計分析數(shù)據(jù)。此外,系統(tǒng)需通過服務層的數(shù)據(jù)接口實現(xiàn)與自然資源管理信息化系統(tǒng)核查業(yè)務的數(shù)據(jù)對接,存儲相關數(shù)據(jù)到業(yè)務系統(tǒng)交換數(shù)據(jù)庫中,通過標準化的數(shù)據(jù)清洗規(guī)則,實現(xiàn)各類業(yè)務數(shù)據(jù)向標準核查業(yè)務數(shù)據(jù)的轉(zhuǎn)換。
基于微服務架構(gòu)的系統(tǒng)需要把業(yè)務拆分為多個服務,合理的微服務劃分能使系統(tǒng)具備良好的靈活性和擴展性,在演進過程中仍然保持敏捷。領域驅(qū)動設計是一種圍繞具體業(yè)務進行領域建模與分析的方法。首先通過調(diào)研收集自然資源外業(yè)核查的業(yè)務需求,分析得到業(yè)務領域事件;再尋找完成該事件所涉及的角色和命令;然后圍繞領域事件確定系統(tǒng)的聚合和限界上下文;最后確定系統(tǒng)的領域模型,領域上下文之間的低耦合,便于未來的業(yè)務擴展。
在自然資源外業(yè)核查業(yè)務中,下發(fā)核查任務和上報核查任務就是典型的領域事件。任務管理員通過下發(fā)指令將任務下發(fā)到外業(yè)核查員;外業(yè)核查員通過上報指令將經(jīng)過采集的任務信息發(fā)送給任務管理員,由此可確定系統(tǒng)的一個聚合是“任務”,由這個聚合來發(fā)布領域事件,包括創(chuàng)建、修改、刪除、下發(fā)、上報等。限界上下文可根據(jù)系統(tǒng)的聚合來確定,并建立上下文的映射關系,如任務上下文與圖片上下文、地圖圖斑上下文產(chǎn)生上下游協(xié)作關系,限界上下文之間通過系統(tǒng)事件來協(xié)作。通過對業(yè)務的不斷迭代分析,即可形成系統(tǒng)的領域模型。
通過領域驅(qū)動設計,明確了系統(tǒng)微服務的邊界,每個服務可獨立開發(fā)、測試、部署與維護,各服務之間高度解耦。微服務的設計充分考慮了移動終端和第三方應用系統(tǒng)跨平臺調(diào)用的需要,采用基于REST風格的服務接口,消息通信協(xié)議支持JSON和Protobuf兩種輕量級格式,服務請求者可根據(jù)自己的需要靈活設置。一般來說,移動終端的應用適合采用比JSON更輕便更高效的Protobuf數(shù)據(jù)格式[8]。
為了更好地滿足業(yè)務擴展需要,系統(tǒng)采用業(yè)務邏輯與數(shù)據(jù)操作解耦的方式來實現(xiàn)微服務。在服務接口內(nèi)部不直接與數(shù)據(jù)層交互,而是通過開發(fā)統(tǒng)一的數(shù)據(jù)倉儲接口來完成相關數(shù)據(jù)的讀寫操作。數(shù)據(jù)倉儲接口可根據(jù)業(yè)務需要不斷擴展豐富,服務內(nèi)部只需根據(jù)領域事件發(fā)送相關命令,調(diào)取對應倉儲接口中的信息即可完成業(yè)務操作。
微服務的架構(gòu)決定了整個系統(tǒng)的業(yè)務功能是由大量的服務接口支撐的,若采用手動管理和維護服務目錄的方式則無法保證系統(tǒng)的穩(wěn)定運行,因此需要引入服務注冊中心。面向服務發(fā)布者提供服務注冊接口,微服務運行時通過注冊接口向服務注冊中心登記該服務,并將服務健康檢查的入口寫入注冊中心,在注冊中心運行過程中自動將心跳包發(fā)送至健康檢查的入口,以檢測服務的運行狀態(tài)。
系統(tǒng)采用Consul開源的服務注冊中心,提供了服務注冊與發(fā)現(xiàn)、服務配置、服務監(jiān)測等一體化的解決方案,并有配套的開源二次開發(fā)工具包,可方便地實現(xiàn)服務的注冊與監(jiān)聽。Consul采用去中心化的部署方式,可在多臺服務器上安裝部署,形成服務注冊中心的集群。單個服務注冊中心的故障不會影響整個系統(tǒng)的運行。自然資源外業(yè)核查系統(tǒng)的微服務在服務注冊中心的注冊情況如圖2所示。
圖2 服務注冊中心
一個完整的業(yè)務被拆分為多個微服務集,每個微服務均會配置相應的接口說明,而這些服務直接對外向應用層提供接口則顯得雜亂無章,且無法實現(xiàn)服務的訪問控制,服務的鑒權(quán)也無法集中統(tǒng)一控制,每個服務都要單獨進行身份驗證,因此需要設計一個服務網(wǎng)關,自動從服務注冊中心中獲取所有注冊的微服務,集成在線接口說明文檔,實現(xiàn)服務的負載均衡和路由控制,并在此基礎上構(gòu)建微服務鑒權(quán),實現(xiàn)服務的統(tǒng)一身份認證。
系統(tǒng)采用Ocelot開源的API網(wǎng)關,支持從Consul服務注冊中心自動獲取已注冊的服務。網(wǎng)關設計如圖3所示。在服務網(wǎng)關內(nèi)部采用IdentityServer實現(xiàn)服務的身份驗證,通過驗證后,網(wǎng)關根據(jù)所發(fā)起的HTTP請求去Consul服務注冊中心匹配相應的微服務的完整地址;再通過Ocelot組件提供的動態(tài)路由機制轉(zhuǎn)發(fā)到下游的微服務中,并得到相應的數(shù)據(jù)。在進行路由轉(zhuǎn)發(fā)時,網(wǎng)關會根據(jù)配置的負載均衡策略選擇從負載相對較低的服務器上請求微服務。當請求的微服務出現(xiàn)異常時,Ocelot會根據(jù)配置的QoS信息做相應的處理;若異常次數(shù)超出設置,則自動熔斷該服務,直接在網(wǎng)關生成異常信息并返回請求終端,避免反復調(diào)用服務出錯而占用系統(tǒng)資源和網(wǎng)絡資源。
圖3 服務網(wǎng)關架構(gòu)
在高并發(fā)的微服務架構(gòu)中,通過服務的負載均衡技術可實現(xiàn)系統(tǒng)的高可用性和服務集群。本文通過Ocelot網(wǎng)關提供的負載均衡組件來實現(xiàn)微服務的軟負載。Ocelot框架內(nèi)置RoundRobin(輪詢)、LeastConnection(最少連接數(shù))等多種負載均衡策略。當網(wǎng)關收到服務請求時,將先調(diào)用內(nèi)部的負載均衡組件,負載均衡組件根據(jù)負載均衡算法從可用的微服務列表中選擇一個負載相對較低的服務進行轉(zhuǎn)發(fā),從而降低系統(tǒng)的壓力。系統(tǒng)利用Consul配合Ocelot能較好地滿足微服務的負載均衡需求。
微服務采用分布式集群部署,在微服務調(diào)度策略的支撐下能有效降低系統(tǒng)的響應時間。由于每個微服務接口均需與數(shù)據(jù)庫進行交互,因此數(shù)據(jù)庫的I/O操作也是影響系統(tǒng)性能的主要因素之一,在高并發(fā)情況下將引起數(shù)據(jù)庫的I/O堵塞,增加客戶端請求時間,嚴重時可能直接導致數(shù)據(jù)庫宕機。為了有效降低數(shù)據(jù)庫的讀寫操作,系統(tǒng)采用分布式多級緩存技術,將頻繁使用的業(yè)務數(shù)據(jù)建立動態(tài)緩存,下次訪問時即可直接從緩存中獲取數(shù)據(jù),減少數(shù)據(jù)庫的I/O操作,從而提高系統(tǒng)的性能。
本文采用Redis分布式緩存和內(nèi)存緩存相結(jié)合的多級緩存技術來提高數(shù)據(jù)訪問速度,以分布式緩存為緩存數(shù)據(jù)的藍本,在此基礎上建立服務器的內(nèi)存緩存,服務接口直接從內(nèi)存中讀取使用頻率高的數(shù)據(jù)。分布式多級緩存的技術架構(gòu)如圖4所示。由于內(nèi)存緩存設置在各服務器內(nèi)部,使用緩存時可能出現(xiàn)數(shù)據(jù)不一致的情況,如一個微服務接口在服務器A中更新了一個緩存數(shù)據(jù),但在服務器B的內(nèi)存緩存中仍為舊的緩存數(shù)據(jù)。因此,在分布式緩存和服務器內(nèi)存緩存之間需建立緩存控制總線,用于同步分布式緩存與各服務器內(nèi)存緩存的數(shù)據(jù),時刻保持系統(tǒng)緩存數(shù)據(jù)的一致性。
圖4 分布式多級緩存架構(gòu)
微服務啟動時會向緩存控制總線發(fā)送訂閱命令,總線就會自動記錄該服務器的信息。當服務器中的內(nèi)存緩存更新時,首先向Redis分布式緩存寫入數(shù)據(jù),再向緩存控制總線發(fā)布緩存更新消息,總線通知其他服務器需要更新緩存數(shù)據(jù),服務器收到通知后從分布式緩存中獲取相應的數(shù)據(jù)并更新到本地的內(nèi)存緩存中,這樣就保證了所有服務器緩存數(shù)據(jù)的一致性。
微服務部署在服務網(wǎng)關的下游,專注于實現(xiàn)自然資源外業(yè)核查相關業(yè)務,若每個微服務在調(diào)用時均需進行身份認證,將會帶來資源的浪費,且服務內(nèi)部都要完成同一套認證邏輯也不利于后期的系統(tǒng)維護,因此需在微服務的上游網(wǎng)關層實現(xiàn)服務鑒權(quán),而各微服務實例只需專注各自的業(yè)務邏輯即可。
Ocelot為IdentityServer提供了很好的支持,在網(wǎng)關內(nèi)部統(tǒng)一實現(xiàn)基于IdentityServer的服務認證鑒權(quán),采用JWT[9]的無狀態(tài)驗證機制實現(xiàn)客戶端和服務端的身份認證與權(quán)限控制。用戶首次登錄系統(tǒng)時,網(wǎng)關的服務鑒權(quán)模塊將根據(jù)用戶名和密碼進行身份驗證,形成Token密鑰返回給服務請求方。在后續(xù)服務請求的Head中加入Token信息,網(wǎng)關的鑒權(quán)模塊首先驗證該Token的有效性,驗證通過后再判斷該用戶是否具備所請求的微服務的權(quán)限,通過后才將請求的信息轉(zhuǎn)發(fā)到下游對應的微服務接口中,處理完成后將結(jié)果返回給服務請求方。
系統(tǒng)利用分布式多級緩存技術提高微服務鑒權(quán)的效率,將用戶登錄信息進行多級緩存,同時設置過期時間,到期后自動刪除對應的緩存。在服務鑒權(quán)模塊進行身份驗證時,首先從緩存中查詢該用戶是否存在登錄信息,若存在則直接從緩存中獲取Token返回給服務請求方;若不存在則通過數(shù)據(jù)庫驗證用戶信息,通過后再生成Token返回給服務請求方,同時將登錄信息通過緩存總線緩存到Redis以及各集群服務器中以備下次驗證使用。
為了檢驗基于微服務架構(gòu)的自然資源外業(yè)核查系統(tǒng)是否能滿足全省自然資源管理的業(yè)務需要,本文采用開源的wrk性能測試工具對系統(tǒng)進行并發(fā)測試。wrk專門用于測試基于HTTP協(xié)議的服務端性能,可充分利用單機多核CPU性能,通過線程和事件的模式對服務端產(chǎn)生大量的負載。本次測試通過編寫lua腳本模擬客戶端發(fā)起的請求數(shù)據(jù),利用wrk調(diào)用腳本,并開啟8線程分別模擬100 個、200 個和500個并發(fā),每次持續(xù)測試30 s,測試結(jié)果如圖5所示。
由壓力測試結(jié)果可知,在同一個網(wǎng)絡環(huán)境下,系統(tǒng)的平均響應時間并沒有隨著并發(fā)數(shù)的增加而出現(xiàn)較大幅度的增長,平均響應時間約增長20 ms,總體響應時間約為120 ms,系統(tǒng)一直保持較平穩(wěn)的狀態(tài),說明基于微服務架構(gòu)的自然資源外業(yè)核查系統(tǒng)可解決全省大規(guī)模使用時帶來的性能問題。
本文基于微服務架構(gòu)設計并實現(xiàn)了面向全省應用的自然資源外業(yè)核查系統(tǒng),可為全省自然資源各業(yè)務系統(tǒng)提供統(tǒng)一的外業(yè)核查數(shù)據(jù)來源,解決了傳統(tǒng)單體應用開發(fā)模式帶來的負載不均衡和不易擴展等問題。微服務采用分布式集群部署方式,在服務網(wǎng)關和服務注冊中心的支持下實現(xiàn)了服務的負載均衡和性能優(yōu)化,能滿足一定的高并發(fā)和高可用的性能要求。
圖5 壓力測試結(jié)果