陳德權
(1.福建省基礎地理信息中心,福建 福州 350002)
隨著自然資源管理業務的不斷拓展和深入,自然資源外業現場核查已成為業務管理的核心工作之一。近年來,福建省自然資源廳開展的土地利用變更調查、土地整治項目管理[1-2]、移動執法監察[3-4]等自然資源管理業務均在各自業務系統的支持下,以手持GNSS移動設備為外業核查的技術手段,對相關業務進行監管。未來還將在地質災害點核查、違法用地督察、礦山生態治理等更多的全省自然資源管理業務上進行深入應用。為避免相同業務功能的重復建設,需在現有業務系統的基礎上構建統一的自然資源外業核查系統,為各類自然資源管理業務提供統一的外業核查數據來源,因此需要充分考慮跨平臺服務接口的兼容性、服務拓展與可擴充性以及全省多業務應用帶來的高并發問題。微服務架構[5-7]則可用來解決上述問題。本文設計了基于分布式微服務架構的自然資源外業核查系統,提升了系統的可靠性和穩定性。系統采用領域驅動設計方法將自然資源核查業務劃分為細粒度的微服務[6],以實現服務之間的高度解耦;核查終端還可根據實際業務需要,調用微服務進行功能組合,有效應對業務拓展的需要。
系統由支撐層、數據層、微服務層、服務網關和應用層組成,各部分按照一定的標準和協議緊密結合在一起,為自然資源核查業務提供信息化支撐,如圖1所示。支撐層依托數字福建云計算平臺提供的虛擬化計算資源,形成數據存儲集群、應用服務集群以及相關的安全設施服務。數據層根據數據類型分類存儲,其中核查業務數據庫存儲相關的業務數據;空間數據庫存儲與空間位置相關的數據,如圖斑數據、地名點數據、軌跡點數據等;圖片數據庫存儲外業核查的照片;業務系統交換數據存儲從第三方自然資源業務系統中生成的核查任務數據;Redis緩存數據庫存儲緩存數據,可提高微服務獲取數據的效率。微服務層由數據倉儲接口、微服務和服務注冊中心構成,其中數據倉儲接口向下與數據層中的各類數據完成數據讀寫操作,向上為微服務提供統一的數據操作接口;微服務利用領域驅動設計方法將外業核查業務劃分為細粒度的服務,并部署在多臺服務器的Nginx下,以實現服務的集群[7];服務注冊中心負責微服務的注冊、發現與管理,通過心跳包監測微服務的運行狀態。服務網關將服務注冊中心的微服務對外映射,并利用負載均衡調度算法實現前后端路由控制和轉發。應用層由核查終端和管理端共同實現對自然資源核查業務的管理,并通過服務接口為其他業務系統提供核查數據來源。

圖1 系統總體架構
自然資源外業核查系統的主要數據為核查業務數據、與業務緊密結合的空間數據以及外業核查采集的圖片數據。為了提高系統查詢效率,本文以Redis數據庫為系統的緩存數據庫,存儲系統中被頻繁調用的業務數據和統計分析數據。此外,系統需通過服務層的數據接口實現與自然資源管理信息化系統核查業務的數據對接,存儲相關數據到業務系統交換數據庫中,通過標準化的數據清洗規則,實現各類業務數據向標準核查業務數據的轉換。
基于微服務架構的系統需要把業務拆分為多個服務,合理的微服務劃分能使系統具備良好的靈活性和擴展性,在演進過程中仍然保持敏捷。領域驅動設計是一種圍繞具體業務進行領域建模與分析的方法。首先通過調研收集自然資源外業核查的業務需求,分析得到業務領域事件;再尋找完成該事件所涉及的角色和命令;然后圍繞領域事件確定系統的聚合和限界上下文;最后確定系統的領域模型,領域上下文之間的低耦合,便于未來的業務擴展。
在自然資源外業核查業務中,下發核查任務和上報核查任務就是典型的領域事件。任務管理員通過下發指令將任務下發到外業核查員;外業核查員通過上報指令將經過采集的任務信息發送給任務管理員,由此可確定系統的一個聚合是“任務”,由這個聚合來發布領域事件,包括創建、修改、刪除、下發、上報等。限界上下文可根據系統的聚合來確定,并建立上下文的映射關系,如任務上下文與圖片上下文、地圖圖斑上下文產生上下游協作關系,限界上下文之間通過系統事件來協作。通過對業務的不斷迭代分析,即可形成系統的領域模型。
通過領域驅動設計,明確了系統微服務的邊界,每個服務可獨立開發、測試、部署與維護,各服務之間高度解耦。微服務的設計充分考慮了移動終端和第三方應用系統跨平臺調用的需要,采用基于REST風格的服務接口,消息通信協議支持JSON和Protobuf兩種輕量級格式,服務請求者可根據自己的需要靈活設置。一般來說,移動終端的應用適合采用比JSON更輕便更高效的Protobuf數據格式[8]。
為了更好地滿足業務擴展需要,系統采用業務邏輯與數據操作解耦的方式來實現微服務。在服務接口內部不直接與數據層交互,而是通過開發統一的數據倉儲接口來完成相關數據的讀寫操作。數據倉儲接口可根據業務需要不斷擴展豐富,服務內部只需根據領域事件發送相關命令,調取對應倉儲接口中的信息即可完成業務操作。
微服務的架構決定了整個系統的業務功能是由大量的服務接口支撐的,若采用手動管理和維護服務目錄的方式則無法保證系統的穩定運行,因此需要引入服務注冊中心。面向服務發布者提供服務注冊接口,微服務運行時通過注冊接口向服務注冊中心登記該服務,并將服務健康檢查的入口寫入注冊中心,在注冊中心運行過程中自動將心跳包發送至健康檢查的入口,以檢測服務的運行狀態。
系統采用Consul開源的服務注冊中心,提供了服務注冊與發現、服務配置、服務監測等一體化的解決方案,并有配套的開源二次開發工具包,可方便地實現服務的注冊與監聽。Consul采用去中心化的部署方式,可在多臺服務器上安裝部署,形成服務注冊中心的集群。單個服務注冊中心的故障不會影響整個系統的運行。自然資源外業核查系統的微服務在服務注冊中心的注冊情況如圖2所示。

圖2 服務注冊中心
一個完整的業務被拆分為多個微服務集,每個微服務均會配置相應的接口說明,而這些服務直接對外向應用層提供接口則顯得雜亂無章,且無法實現服務的訪問控制,服務的鑒權也無法集中統一控制,每個服務都要單獨進行身份驗證,因此需要設計一個服務網關,自動從服務注冊中心中獲取所有注冊的微服務,集成在線接口說明文檔,實現服務的負載均衡和路由控制,并在此基礎上構建微服務鑒權,實現服務的統一身份認證。
系統采用Ocelot開源的API網關,支持從Consul服務注冊中心自動獲取已注冊的服務。網關設計如圖3所示。在服務網關內部采用IdentityServer實現服務的身份驗證,通過驗證后,網關根據所發起的HTTP請求去Consul服務注冊中心匹配相應的微服務的完整地址;再通過Ocelot組件提供的動態路由機制轉發到下游的微服務中,并得到相應的數據。在進行路由轉發時,網關會根據配置的負載均衡策略選擇從負載相對較低的服務器上請求微服務。當請求的微服務出現異常時,Ocelot會根據配置的QoS信息做相應的處理;若異常次數超出設置,則自動熔斷該服務,直接在網關生成異常信息并返回請求終端,避免反復調用服務出錯而占用系統資源和網絡資源。

圖3 服務網關架構
在高并發的微服務架構中,通過服務的負載均衡技術可實現系統的高可用性和服務集群。本文通過Ocelot網關提供的負載均衡組件來實現微服務的軟負載。Ocelot框架內置RoundRobin(輪詢)、LeastConnection(最少連接數)等多種負載均衡策略。當網關收到服務請求時,將先調用內部的負載均衡組件,負載均衡組件根據負載均衡算法從可用的微服務列表中選擇一個負載相對較低的服務進行轉發,從而降低系統的壓力。系統利用Consul配合Ocelot能較好地滿足微服務的負載均衡需求。
微服務采用分布式集群部署,在微服務調度策略的支撐下能有效降低系統的響應時間。由于每個微服務接口均需與數據庫進行交互,因此數據庫的I/O操作也是影響系統性能的主要因素之一,在高并發情況下將引起數據庫的I/O堵塞,增加客戶端請求時間,嚴重時可能直接導致數據庫宕機。為了有效降低數據庫的讀寫操作,系統采用分布式多級緩存技術,將頻繁使用的業務數據建立動態緩存,下次訪問時即可直接從緩存中獲取數據,減少數據庫的I/O操作,從而提高系統的性能。
本文采用Redis分布式緩存和內存緩存相結合的多級緩存技術來提高數據訪問速度,以分布式緩存為緩存數據的藍本,在此基礎上建立服務器的內存緩存,服務接口直接從內存中讀取使用頻率高的數據。分布式多級緩存的技術架構如圖4所示。由于內存緩存設置在各服務器內部,使用緩存時可能出現數據不一致的情況,如一個微服務接口在服務器A中更新了一個緩存數據,但在服務器B的內存緩存中仍為舊的緩存數據。因此,在分布式緩存和服務器內存緩存之間需建立緩存控制總線,用于同步分布式緩存與各服務器內存緩存的數據,時刻保持系統緩存數據的一致性。

圖4 分布式多級緩存架構
微服務啟動時會向緩存控制總線發送訂閱命令,總線就會自動記錄該服務器的信息。當服務器中的內存緩存更新時,首先向Redis分布式緩存寫入數據,再向緩存控制總線發布緩存更新消息,總線通知其他服務器需要更新緩存數據,服務器收到通知后從分布式緩存中獲取相應的數據并更新到本地的內存緩存中,這樣就保證了所有服務器緩存數據的一致性。
微服務部署在服務網關的下游,專注于實現自然資源外業核查相關業務,若每個微服務在調用時均需進行身份認證,將會帶來資源的浪費,且服務內部都要完成同一套認證邏輯也不利于后期的系統維護,因此需在微服務的上游網關層實現服務鑒權,而各微服務實例只需專注各自的業務邏輯即可。
Ocelot為IdentityServer提供了很好的支持,在網關內部統一實現基于IdentityServer的服務認證鑒權,采用JWT[9]的無狀態驗證機制實現客戶端和服務端的身份認證與權限控制。用戶首次登錄系統時,網關的服務鑒權模塊將根據用戶名和密碼進行身份驗證,形成Token密鑰返回給服務請求方。在后續服務請求的Head中加入Token信息,網關的鑒權模塊首先驗證該Token的有效性,驗證通過后再判斷該用戶是否具備所請求的微服務的權限,通過后才將請求的信息轉發到下游對應的微服務接口中,處理完成后將結果返回給服務請求方。
系統利用分布式多級緩存技術提高微服務鑒權的效率,將用戶登錄信息進行多級緩存,同時設置過期時間,到期后自動刪除對應的緩存。在服務鑒權模塊進行身份驗證時,首先從緩存中查詢該用戶是否存在登錄信息,若存在則直接從緩存中獲取Token返回給服務請求方;若不存在則通過數據庫驗證用戶信息,通過后再生成Token返回給服務請求方,同時將登錄信息通過緩存總線緩存到Redis以及各集群服務器中以備下次驗證使用。
為了檢驗基于微服務架構的自然資源外業核查系統是否能滿足全省自然資源管理的業務需要,本文采用開源的wrk性能測試工具對系統進行并發測試。wrk專門用于測試基于HTTP協議的服務端性能,可充分利用單機多核CPU性能,通過線程和事件的模式對服務端產生大量的負載。本次測試通過編寫lua腳本模擬客戶端發起的請求數據,利用wrk調用腳本,并開啟8線程分別模擬100 個、200 個和500個并發,每次持續測試30 s,測試結果如圖5所示。
由壓力測試結果可知,在同一個網絡環境下,系統的平均響應時間并沒有隨著并發數的增加而出現較大幅度的增長,平均響應時間約增長20 ms,總體響應時間約為120 ms,系統一直保持較平穩的狀態,說明基于微服務架構的自然資源外業核查系統可解決全省大規模使用時帶來的性能問題。
本文基于微服務架構設計并實現了面向全省應用的自然資源外業核查系統,可為全省自然資源各業務系統提供統一的外業核查數據來源,解決了傳統單體應用開發模式帶來的負載不均衡和不易擴展等問題。微服務采用分布式集群部署方式,在服務網關和服務注冊中心的支持下實現了服務的負載均衡和性能優化,能滿足一定的高并發和高可用的性能要求。

圖5 壓力測試結果