呂亞聰 , 劉子辰 ,張玉成
(1.重慶郵電大學通信與信息工程學院,重慶 400065;2.移動計算與新型終端北京市重點實驗室(中國科學院計算
技術研究所),北京 100190)
我國是農業(yè)大國,實現農業(yè)現代化是我國的一項長期奮斗目標[1]。農機車輛是現代農業(yè)的物質基礎,農機車輛的智能化對發(fā)展現代化農業(yè)有極大的推動作用。近年來,伴隨著互聯網技術的持續(xù)發(fā)展,農機車輛的智能化水平不斷提高。在此基礎上,引入針對智能農機車輛的監(jiān)控系統建設將很大程度上提高農機車輛的運行效率和管理水平。而傳統的企業(yè)級系統開發(fā)的典型架構是單體式架構,系統特點是所有代碼在一個項目中完成所有的工作,包括功能代碼模塊和非功能代碼模塊[2]。隨著物聯網、大數據技術的高速發(fā)展和業(yè)務應用范圍的不斷擴展,不同的業(yè)務需要快速部署,相互之間需要不斷調用,業(yè)務擴展能力需要敏捷且高效,這都將給系統的開發(fā)和運維帶來了挑戰(zhàn)[3-5]。如果繼續(xù)沿用傳統的系統開發(fā)架構,將無法滿足農機監(jiān)控系統未來發(fā)展的需要。
微服務架構的出現和在世界范圍內的一些成功應用,使其越來越受到人們的關注,成為開發(fā)者在搭建系統架構時的新選擇。微服務架構的主要特點是把單塊的應用軟件系統按照面向服務化的原則拆分為一組具備一定功能的微小的服務應用,通過與平臺無關的通信協議,完成不同服務彼此之間的互相調用與配合,從而實現復雜的系統整體功能[6]。相較于傳統的單體式系統架構,微服務架構系統模塊間耦合度較低,單個服務便于開發(fā)、調試與維護,且復雜度可控。此外,不同服務能夠獨立部署,按需獨立擴展[7]。
綜上所述,本文提出將微服務架構應用于智能農機監(jiān)控系統的架構設計,系統組件全部采用微服務化架構,各個服務能夠做到服務自主注冊與發(fā)現,良好地降低了系統耦合度,實現了資源的充分利用。此外,它滿足了服務的快速部署、相互調用、業(yè)務按需擴展、并發(fā)響應低時延等要求。
微服務架構是近年來出現的一種新的軟件架構設計模式,具備穩(wěn)定性更好、擴展性更強、并發(fā)響應更優(yōu)的特點[8]。它的實質是將一個大型的、單體的、復雜的應用系統,按照業(yè)務功能或者獨立性原則進行組件化、服務化分離,將其拆分成一系列微小的應用服務。每個應用服務依據其具體的業(yè)務功能進行邊界劃定,職責相對單一,同時能夠對每個應用服務做到獨立部署,服務間更加靈活和易于調配。每個應用程序服務都在自己獨立的進程中運行,服務之間是松耦合的,使用輕量級通信機制(通常是基于HTTP協議的Restful API)相互通信,再加上消息隊列等技術實現進一步解耦,能夠方便地進行服務拆分和業(yè)務擴展[2,7]。在平臺無關的通信協議支持下,各個微服務可以依據團隊開發(fā)語言的掌握程度和具體業(yè)務的需要選擇最適合的技術方案,因此業(yè)務的開發(fā)、部署和擴展變得更加靈活[9]。
在微服務技術的發(fā)展演變過程中,逐漸形成了阿里巴巴的開源框架dubbo體系和以Spring框架為基礎的SpringCloud體系兩種不同的技術架構體系[10]。與dubbo技術體系相比,SpringCloud技術體系具備更加完整的服務熔斷機制,服務設施組件化更加有利于業(yè)務的擴展與開發(fā),服務間的交互性更強。因此,本文采用SpringCloud微服務架構設計農機監(jiān)控系統。
SpringCloud具有豐富的開箱即用的開發(fā)組件,是一系列框架與組件的集合。以SpringBoot開發(fā)框架為基礎實現快捷開發(fā),它大幅簡化了微服務架構應用的基礎設施組件的開發(fā)工作,提供了一套易使用、易部署、易維護的開發(fā)工具。核心組件包括Eureka服務注冊發(fā)現中心、Spring Zuul API服務網關、Spring Config統一配置中心、Ribbon負載均衡、Hystrix服務容錯與熔斷等。應用上述微服務基礎設施組件,結合SpringBoot可快速開發(fā)、部署,實現微服務架構體系的應用,技術架構如圖1所示。
圖1 SpringCloud微服務技術架構體系
(1)服務注冊與發(fā)現組件主要用于服務注冊,以實現多個服務間的發(fā)現與調用。
(2)網關組件主要用于提供動態(tài)路由、監(jiān)控、鑒權、調度、負載均衡等邊緣服務[11]。
(3)統一配置中心組件主要提供統一的、集中的、動態(tài)的配置管理。配置文件一般放在遠端Git倉庫中,服務通過Git倉庫的URL地址動態(tài)加載所需的配置文件。當倉庫中的配置文件發(fā)生改變時,配合著SpringCloud Bus可以實現服務不需要重新啟動便能夠感知到配置的變化并應用新的配置[12]。
(4)負載均衡組件是一種基于客戶端的負載均衡機制,主要是利用多種負載均衡策略,如隨機、輪詢、權重等,將請求分發(fā)到不同的服務器,提高網絡的吞吐量,增強網絡對數據的處理能力,提高網絡的可用性[13]。
(5)服務容錯組件主要用于通過熔斷機制控制服務,對延遲和異常提供基于熔斷策略的處理方式,保證系統中如果出現某些服務異常時系統能夠依然保證最低的可用度,而不會導致系統整體崩潰[14]。
當服務處于被調用狀態(tài)或者客戶端發(fā)起訪問請求時,請求首先經過Zuul API服務網關對其進行控制管理,根據所請求服務在注冊中心注冊的路由信息進行請求轉發(fā);由負載均衡器Ribbon提供對請求負載的均衡分配服務;Eureka服務注冊與發(fā)現中心根據請求從已注冊的服務列表中尋找對應的服務;由Spring Config統一配置中心對應用服務所需要的相關配置項進行統一配置,實現配置與服務的解耦;當服務出現異常時,由Hystrix熔斷器進行異常捕捉和熔斷等必要處理[15-16]。
智能農機車輛監(jiān)控系統架構設計以SpringCloud微服務技術架構體系為基礎,對應圖1中的服務部分,分別是數據采集微服務、數據處理微服務、應用微服務、前端展示微服務和調度監(jiān)控微服務五大核心微服務。其中,應用微服務又包括農機車輛管理服務、農機車輛定位監(jiān)控服務、用戶管理服務、農機運行軌跡監(jiān)控服務、農機計畝統計服務、農機運行狀態(tài)監(jiān)控服務、農機維修保養(yǎng)記錄服務、日志查詢服務和故障報警服務等。
相較于傳統單體式應用系統,目的在于實現智能農機監(jiān)控系統業(yè)務模塊的服務化,將復雜應用按照業(yè)務功能邊界拆分成若干獨立運行的單個服務,降低服務之間的耦合度,從而達到快速開發(fā)和部署的要求,并對通用配置項進行統一管理,降低系統開發(fā)和維護成本,以便進行系統整體的擴展和調試[17-18]。
基于微服務架構模式強調分散和獨立可運行的松耦合設計思想,在進行微服務設計時,本系統架構采用微服務應用集群和微服務基礎設施相結合的處理方式,技術架構如圖2所示。
通過觀察架構圖能夠看到,系統中每個服務的功能和數據獨立于其他服務,不同服務之間借助統一的JSON格式的API進行通信,保證了服務間的解耦,同時單獨服務的職責相對單一,便于快速開發(fā)、部署和擴展。
系統主要微服務群組包括以下內容。
(1)數據采集微服務群組由若干采集解析微服務組成的分布式微服務群組,采用Netty NIO技術和多線程技術,負責與農機車輛上裝載的DRC終端模塊通信,包括數據采集、協議解析、數據校驗、數據加密/解密、數據上報等功能,提供Restful服務接口供其他微服務調用。
(2)數據處理微服務群組包含數據存儲服務、數據分析服務和數據緩存服務。數據存儲服務使用MySQL關系型數據庫,同時使用Redis非關系型數據庫存儲一些由數據采集服務上報的實時數據,提供給其他微服務作調用。數據分析服務提供對系統中的農機車輛定位數據、發(fā)動機扭矩百分比、冷卻液溫度、燃油率、轉速等運行數據的分析功能,提供前端展示服務所需要的數據源。數據緩存服務解決對系統中高并發(fā)大數據場景下熱點數據的訪問性能問題,將熱點數據、靜態(tài)資源等作緩存處理,以提供高性能的數據快速訪問。
(3)展示微服務群組主要針對面向用戶的圖形展示畫界面,提供手機APP端和PC Web瀏覽器端兩種訪問渠道的支持。其中,手機APP端分為iOS和Android兩種系統版本,用于向農機車輛終端個人用戶提供農機信息的相關操作;PC Web瀏覽器端主要作為農機廠商、經銷商或其他組織機構的后臺管理平臺,主要用于查看農機車輛信息、車主信息、監(jiān)測所屬的農機車輛運行狀況,以及配置農機相關參數等。該微服務僅提供向用戶作前端數據展示的頁面,數據源由數據微服務提供。
(4)業(yè)務應用微服務群組為該系統業(yè)務應用功能實現的核心部分,由Web應用接口服務、APP接口服務、農機車輛信息管理服務、農機定位查詢服務、農機發(fā)動機實時監(jiān)控服務、農機行駛軌跡服務、農機維修記錄服務和農機故障服務等微服務組成。智能農機車輛監(jiān)控系統中,大部分的業(yè)務功能與其他群組中的微服務通過Restful通信協議實現數據交互。
圖2 農機監(jiān)控系統技術架構設計
智能農機監(jiān)控系統主要實現以下目的:
(1)農機車輛地理位置的監(jiān)控和顯示,便于統計農機分布趨勢,調配農機資源;
(2)農機車輛運行軌跡的監(jiān)控和查詢,提高農機運行的準確性;
(3)農機發(fā)動機運行監(jiān)控,實時監(jiān)控發(fā)動機運行各項指標,及時掌握農機車輛健康狀況,以便及時發(fā)現農機運行故障并上報提醒;
(4)農機計畝統計,用于計算收割機收割的耕地面積;
(5)建立信息完整的農機車輛與用戶資料,便于掌握農機的售出情況、用戶群分布等信息,支持廠商科學管理決策。
業(yè)務應用微服務群組作為智能農機監(jiān)控系統中的核心服務,應該建立統一的信息標準化處理方式,建立統一的信息流轉機制,以滿足上下級之間、同級之間數據信息流轉的需求,功能架構劃分如圖3所示。
圖3 業(yè)務應用模塊設計
核心功能模塊說明:
(1)農機車輛管理模塊主要負責各種農機車輛的編號、型號、機型、歸屬等與農機有關的信息統計和管理。
(2)農機發(fā)動機實時監(jiān)控模塊主要對采集上報的各類農機發(fā)動機運行數據進行統計和分析,如發(fā)動機燃油率、冷卻液溫度、轉速、油壓等,且可以通過對農機車輛發(fā)送控制指令對農機進行相關操作。
(3)農機位置監(jiān)控模塊主要負責實時匯報農機當前的地理位置坐標、位置信息等,以供數據統計服務等其他服務調用。
(4)故障報警模塊負責實時監(jiān)控農機車輛各項運行指標有無故障報警,如有故障,及時上報故障報警信息。
(5)計畝統計模塊負責統計一段時間內農機耕作或者收割的輪廓面積,用于統計每臺農機車輛的收獲成果。
系統拆分成微服務架構后,服務的數量增多,不再是以往的單個服務。無論是采用單個部署還是集群部署,不僅效率低下,且部署維護和硬件成本高,不能達到服務高可用和高容錯的要求。容器化技術能夠很好地解決系統微服務化后帶來的服務部署問題,簡化部署的流程,充分利用硬件資源,提高系統部署的效率[19]。Docker容器是目前使用較廣泛的開源容器引擎,使用它可以將項目快速打包構建成系統鏡像,且可以上傳到鏡像倉庫,使得項目啟動部署更加快速便捷。因此,本系統即所有微服務通過Docker容器部署在阿里云服務器上。
根據系統設計,本系統采用SpringBoot構建每個微服務。每個微服務作為一個子模塊存在于父項目。父項目采用POM打包方式,所有依賴版本信息在父項目中規(guī)定。項目結構如圖4所示。
3.2.1 Dockerfile
項目編寫完成需要打包成Docker鏡像,才可以在Docker中運行。打包鏡像需要在項目中添加Dokerfile作為構建鏡像的指令腳本,如下:
FROM openjdk∶8-jdk-alpine
VOLUME/tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT [“java”,”-jar”,”/app.jar”]
圖4 項目結構
在需要構建鏡像的項目pom.xml中添加對應的maven-docker插件依賴:
(1)添加屬性配置,規(guī)定docker鏡像的前 綴名
3.2.3 構建Docker鏡像
在服務器中使用命令mvn install dockerfile∶build, 就可以對項目進行鏡像構建。構建成功會有如圖5鏡像構建示例所示。
將所有的項目進行鏡像構建后,用命令docker images查看鏡像列表,部分鏡像列表如圖6所示。
之后可以用docker run在服務器上啟動服務。啟動服務需要指定對應的端口,如eureka服務啟動在8761端口:
docker run-d-p 8761∶8761 imageId;
按照上述過程依次啟動每個微服務,可以使用docker ps查看所有服務的啟動情況。
本系統使用阿里云服務器部署,服務器為2CPU 8 GB內存配置,服務器上已部署cenos7、docker、redis、rabbitmq、maven、jdk等基礎環(huán)境,部分微服務實例如圖7所示。系統部分測試用例和測試結果如表1所示。
圖5 鏡像構建示例
圖 6 docker容器中部分鏡像
圖7 Eureka中部分微服務實例
測試結果驗證了系統微服務化后服務間發(fā)現與注冊機制、系統的響應速度較快、位置監(jiān)控這類需要多個微服務配合的訪問需求,系統的響應速度有所降低,但平均鏈路響應時間控制在300 ms以內,滿足系統的響應時間需求。模擬測試部分服務異常不可用后服務的熔斷機制,服務可以捕獲異常且及時采取熔斷回滾機制,返回對應熔斷降級的處理措施,熔斷降級響應時間在1 s以內,保證了系統整體的可用性和良好的用戶體驗。
表1 系統功能測試
本文對目前主流的微服務架構進行介紹,分析了微服務架構的優(yōu)勢,闡述了智能農機監(jiān)控系統微服務實現時的需求要素,并針對其特點設計了微服務實現的總體架構、技術實現架構,重點論述了業(yè)務應用模塊的設計劃分?;谠撐⒎占軜嬤M行智能農機監(jiān)控系統開發(fā),能夠快速建立一個高內聚、低耦合的智能農機車輛監(jiān)控系統,提高了系統的擴展和響應能力,具有較高的應用價值。