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