方 圓,鄭衛勝
(中國電子科技集團公司第二十七研究所,河南 鄭州 450047)
微服務架構是一種將單個應用程序開發為一組小型服務的方法,每個小服務運行在自己的進程中,并且以輕量級機制通信。這些服務是圍繞業務能力建立的,在最理想的情況下,每個服務都可獨立地開發、測試、發布、部署、擴展、集成和維護。
隨著微服務架構的發展,出現了許多開源的微服務框架。在Java生態環境中出現了Spring Boot、Eclipse MicroPro fi le、Dropwizard等集成開源框架[1],這些開源框架大大促進了微服務架構在Java生態環境中的推廣。
.Net因其生態環境的封閉性,流行的微服務統一開源的框架很少,軟件開發者大部分選擇微軟自身的產品來構建微服務架構的軟件應用,極大地增加了軟件開發的經濟成本,也降低了新開發系統與異構系統集成的能力。因此,提出了一種以集成HAProxy、KeepAlived、MassTransit以及RabbitMQ中間件構建微服務框架的設計方法,以支持.Net框架下微服務架構軟件應用的運行。
微服務框架整體系統架構圖見圖1。

圖1 微服務框架結構
使用HAProxy和KeepAlived相互組合實現基于微服務訪問的高可用性,負載均衡和故障遷移,通過MassTransit和RabbitMQ集群保障系統的服務可靠通信、服務注冊與發現和數據最終一致性。
微服務框架中中采用MassTransit框架來完成微服務之間的通信。MassTransit框架是一個自由、開源、輕量級的消息總線,實現在.Net框架下創建分布式應用程序。MassTransit框架保證了整個系統消息的可靠傳遞和通信消息數據最終一致性。
1.2.1 通信消息可靠傳遞
MassTransit默認使用RabbitMQ消息中間件作為服務通信的基礎設施[2]。通信消息在分布式系統中傳遞不可靠,為了保證消息的可靠傳遞可采用如下方法。
第一,通過MassTransit框架提供的API接口設置RabbitMQ交換機,隊列和消息為持久化和消息確認機制。解決消息中間件服務器的異常崩潰而導致的消息丟失問題。第二,通過配置RabbitMQ集群,保證不會因為任何一臺RabbitMQ節點故障而造成系統故障的情況。
1.2.2 通信消息數據最終一致性
微服務系統的數據最終一致性是指數據對象在沒有更新前,最終所有獲取數據的請求都將返回最后更新值。本文采用MassTransit提供的Saga組件,可保證分布式系統的數據一致性[3-4]。
MassTransit中提供了Automatonymous狀態機組件定義狀態機Saga實例,并通過 fl uent語法定義對應狀態機實例。Saga實例中通過CorrelationId字段將消息串聯起來,維護消息的狀態,同時MassTransit還可與NHibernate等框架集成,完成Saga實例的持久化工作。
定義狀態機Saga實例的例子見圖2,對應狀態機實例定義見圖3。最后通過IRabbitMqBusFactory Con fi gurator類的LoadStateMachine-Sagas()方法將狀態機實例注冊到ReceiveEndpoint上,完成通信消息數據最終一致性的配置。
本文采用RabbitMQ作為通信機制,服務的調用者和微服務的實例之間完全進行了解耦,服務的調用者無需知道微服務實例的存在。只要服務調用者能將服務調用消息發送至RabbitMQ節點,RabbitMQ節點就能將服務調用消息轉發到可用的微服務實例上,這一切對服務調用者是完成透明的。
微服務架構軟件中的網絡通信需要多個物理組件和邏輯組件共同協作,這些組件都有可能出現故障。為了最小化局部故障帶來的影響,本文采用了HAProxy和KeepAlived實現整個微服務框架的高可用性訪問。
如圖1所示,HAProxy服務器1和HAProxy服務器2提供對RabbitMQ集群訪問,通過設置KeepAlived,在兩臺服務器上不斷進行故障檢測,保證RabbitMQ集群能被正常訪問。在接入交換機后配置兩臺HAProxy服務器用于實現對RabbitMQ集群的負載均衡,當用戶訪問量急劇增長時,能有效解決RabbitMQ集群中的單臺服務器成為訪問瓶頸的問題。KeepAlived不斷檢測兩臺HAProxy服務器的狀態,若其中一臺宕機或工作出現故障,自動完成故障遷移另一臺為用戶提供訪問服務,待故障服務器恢復正常,KeepAlived自動將其重新加入到檢測集群中,保證整體系統的高可用性。

圖2 Saga實例定義

圖3 狀態機定義
文本給出了一種.Net框架下微服務框架設計,重點分析了服務通信、高可用性等問題,并給出了關鍵程序和中間件配置代碼。使用該框架開發降低了開發難度,提高了開發效率。目前本方案已在多個實際工程項目中成功應用,第三方評價和用戶驗收效果良好。