趙磊 王運成 王娟
(聊城大學東昌學院 山東省聊城市 252000)
在早期的軟件開發中,一般采用一個功能涵蓋整個應用場景的單體系統架構,各個業務模塊之間耦合緊密,軟件發布也是整體進行發布。這種軟件開發模式一般能適應業務的發展,軟件應用也可以正常運行。但是隨著業務的發展,客戶需求越來越多,軟件功能也越來越多,代碼量也會變得越來越大。軟件的功能越多,代碼越復雜,屆時整個軟件就會變成一個非常龐大且復雜的單體應用。隨之便產生很多問題,比如:
(1)打包編譯非常耗時;
(2)代碼可維護性變差,修改BUG和增加新功能可能牽一發而動全身,產生一些不可預期的新BUG;
(3)軟件擴展性非常差,可用性風險加大,可能一個BUG導致整個軟件無法正常工作。
為解決上面的問題,產生了一種將整個軟件拆分成多個小軟件的解決方案,比如一個電商系統,可以拆分成商品應用,訂單應用,用戶應用,商鋪應用等比較小的應用,各個應用各司其職相互結合形成一個完整的電商系統。甚至可以將這些應用再往小拆分,形成更小的應用,以服務的形式對外提供應用,這種比較小的應用便是微服務,這種軟件架構方案也被越來越多的開發者采納。
微服務與傳統的單體架構方案不同,將整個應用拆分成多個相互獨立的小應用,每個應用都是一個獨立服務,可以單獨進行開發、編譯、部署、運行和維護。這些功能單一的小應用克服了傳統單體式架構系統的缺點,系統部署靈活、可拓展性好、使用穩定,具有一定的實用價值。
微服務在設計上需要解決一些架構特有的問題,比如:服務數據的來源,服務注冊和發現、路由設置、安全性和可靠性。因此一個完整的微服務架構主要分為3層:數據層,服務層,表現層。

圖1:微服務架構

圖2:系統用例

圖3:數據流程
數據層:為系統管理數據來源和數據,與服務層進行數據交互。
服務層:實現核心應用,資源上傳,統計分析等多種微型服務,各微型服務之間通過協作以一致的形式對外提供特定的功能服務。
表現層:管理系統業務,確保各層面的功能可以共同協作,并為用戶(客戶端)提供與系統進行交互的直觀、可視化的服務界面。
微服務架構還需要解決服務之間的相互依賴關系,以及服務注冊等問題。提供一個基于微服務的基礎平臺,保障各服務之間的相互協作,應包含幾個部分:注冊中心、服務網關、服務容錯、安全認證。微服務架構如圖1。
注冊中心,架構中新添加一個微服務實例時,微服務會將自己的IP和PORT發送到注冊中心進行注冊,當API網關需要訪問該微服務時,就會去注冊中心取得相應微服務的信息,從而實現自動化操作。
服務網關,解決路由轉發、過濾和公共處理,做到統一接入,流量管控,安全防護,業務隔離等功能。
服務容錯,實現故障隔離和修復機制,當某個微服務不可用時,阻止故障蔓延到整個平臺,避免造成平臺不可用。
安全認證,用于調用應用的身份驗證、授權和訪問控制。通過內部的安全策略機制對來自客戶端的服務請求進行認證授權,只允許合法的請求通過,阻止非法或越權的請求。
本案例所設計的基于人臉識別設備的考勤信息中轉系統分為前臺服務和后臺系統兩部分,前臺面向分布于各地的400余臺考勤終端設備的,后臺面向系統管理員的,系統用例如圖2所示。
考勤終端每10秒向系統發送一次心跳包和一次照片下發請求。系統根據心跳請求,標記設備在線狀態;同時檢查該設備是否有未下發照片,如有未下發照片會向終端下發照片信息;終端設備收到照片信息后,更新本地照片記錄,完成后再向系統發送照片更新完成的反饋信息,系統將該照片在該設備上的下發標記修改為已下發。當終端設備有考勤記錄時上傳考勤記錄及考勤照片(后期可根據需求采集體溫數據),系統首先根據考勤信息進行判重,如果為有效的考勤記錄首先將考勤照片存儲到服務器,然后向數據庫中插入該考勤記錄。同時開啟新線程通過POST請求方式向第三方平臺轉發該考勤記錄;然后系統根據平臺反饋信息維護考勤記錄上傳狀態,轉發成功將該記錄標記為已上傳,失敗則標記為未上傳。未上傳的考勤記錄通過定時任務集中進行上傳,確保每條記錄都成功上傳。為保障系統的可靠性、可擴展性以及高可用性,使某個服務的故障不影響其他服務的運行。系統采用微服務形式向終端提高獨立的心跳服務、記錄服務和照片下發等服務。
數據端采用基于NoSQL的MongoDB,性能高,靈活性強,可按月份對考勤記錄進行分表,從而極大提升數據端性能。
服務端基于Flask框架進行開發,Flask是一款基于Python語言的微框架,核心簡單而又具有可擴展性,可根據需要添加各種擴展功能,用于開發微服務具有非常高的靈活性。
考勤記錄中轉功能涉及到第三方平臺,由于第三方平臺的不可控因素,在第三方平臺不可訪問時,整個考勤記錄服務會處于堵塞狀態,無法為客戶端提供記錄上傳服務。因此考勤記錄服務采用多線程方式對考勤記錄進行上傳。從而保證設備端上傳記錄服務的穩定性。數據流程見圖3。
系統在部署在Ubuntu 18.04下,前端通過Nginx進行反向代理,通過動靜分離技術,將靜態請求和動態請求服務區分,已達到系統的高負載要求。
設計了一種基于微服務的考勤系統平臺,將平臺拆分為面向終端設備的心跳服務、記錄服務和照片服務以及面向管理員的后臺服務等多個相互獨立功能專一的微型服務。這些微服務可本別部署于多臺服務器或容器中,克服了單體應用的缺點,部署靈活,開發迭代快速,具有很好的拓展性和穩定性。當前系統功能較少不是很完善,后期將繼續完善系統功能,如加入體溫數據的采集和預警等。
雖然采用微服務架構有很多好處,但是也帶來了其他的問題,如:
(1)增加系統復雜性,提升運維成本;
(2)提高了開發門檻,對技術團隊要求更高;
(3)造成一些誤區,開發中一些人為微服務而微服務。其實微服務只是軟件開發一中架構方式,不是萬能方案,某些應用場景下傳統的單體架構反而更有優勢。