Spring Cloud Gray,微服務灰度中間件

Spring Cloud Gray 是一套開源的微服務灰度路由解決方案,它由spring-cloud-gray-client,spring-cloud-gray-client-netflix 和 spring-cloud-tray-server,spring-cloud-gray-webui組成。

spring-cloud-gray-client定義了一套灰度路由決策模型,灰度信息追蹤模型,以及和spring-cloud-gray-server的基本通信功能。

Spring Cloud Gray,微服務灰度中間件

spring-cloud-gray-client-netflix在spring-cloud-gray-client的基礎上集成了微服務註冊中心eureka,擴展ribbon的負載均衡規則,提供了對zuul,feign,RestTemplate的灰度路由能力,並且無縫支持hystrix線程池隔離。

spring-cloud-gray-server負責灰度決策、灰度追蹤等信息的管理以及持久化。

spring-cloud-gray-webui提供操作界面。

SpringCloudGray能做什麼

1. 金絲雀測試

先發布1臺實例,用於測試驗證,指定測試的流量進入這臺實例,其它流量依然進入其它正常的實例。優勢在於發佈成本小,快速測試,並且不影響正常用戶體驗影響,即使測試不通過,也只需回滾這一臺實例,用戶無感知。

Spring Cloud Gray,微服務灰度中間件

2. 灰度放量

通過金絲雀測試後,可以逐漸放量到新的版本上。例如,根據userId或者ip放5%的流量到其中一臺灰度實例上,觀察一段時間沒異常,可調整放入20%的流量,如果一臺實例扛不住,可再發一臺或多臺實例。將發佈產生的風險保持在可控範圍內。

Spring Cloud Gray,微服務灰度中間件

3. 切斷實例流量

當線上出現問題,可將某臺實例的流量切斷,保留現場,設置指定的請求進入實例,在線調試並且不影響其它用戶。

Spring Cloud Gray,微服務灰度中間件

4. 數據透傳

藉助灰度追蹤的能力,在網關處記錄用戶請求的最初的數據,可以將之透傳到請求完整的調用鏈中。

5. 藉助“破窗”能力,實例藍綠髮布

首次上灰度時,會存在兩種環境,一種是已經依賴了灰度客戶端的環境,另一種是正常運行的當前環境。假如微服務的負載均衡是由ribbon實現,那麼當前環境會請求路由到實例狀態為UP的實例上,而依賴了灰度客戶端的環境,則可以通過"破窗"能力,跟灰度路由結合,可以將匹配灰度策略的請求路由到實例狀態為STARTING的實例上,不匹配灰度策略的請求路由到實例狀態為UP的實例上。

Spring Cloud Gray,微服務灰度中間件

設計思想

在微服務架構中,接口的調用通常是服務消費方按照某種負載均衡策略去選擇服務實例;但這無法滿足線上更特殊化的一些路由邏輯,比如根據一次請求攜帶的請求頭中的信息路由到某一個服務實例上。Spring Cloud Gray正是為此而創建。

Spring Cloud Gray,微服務灰度中間件

在Spring Cloud Gray中定義了幾個角色灰度客戶端(gray-client)、灰度管控端(gray-server)、註冊中心。

Spring Cloud Gray,微服務灰度中間件

註冊中心負責服務的註冊和發現。

灰度客戶端灰度的客戶端是指依賴了spring-cloud-gray-client的服務,一般是指服務消費方。

灰度管控端負責灰度信息的管理、持久化等維護工作。

Spring Cloud Gray,微服務灰度中間件

灰度客戶端會從灰度管控端拉取一份灰度信息的清單,並在內存中維護這份清單信息,清單中包含服務,服務實例,灰度策略,灰度追蹤字段等。當請求達到網關時,網關就會在灰度追蹤中將需要透傳的信息記錄下來,並將傳遞給轉發的服務實例,後面的接口調用也會按照同樣的邏輯將追蹤信息透傳下去,從而保證所有一個請求在微服務調用鏈中的灰度路由。

如下圖所示:

Spring Cloud Gray,微服務灰度中間件

項目擴展

項目已經實現了灰度的內核,如果要與其它的註冊中心或者負載均衡中間件集成,只需實現相應的plugin即可,spring cloud gray已經提供了eureka、ribbon、feign、zuul以及spring cloud gateway和spring cloud stream的plugin,添加相應的plugin依賴即可。

end:如果你覺得本文對你有幫助的話,記得關注點贊轉發,你的支持就是我更新動力。


分享到:


相關文章: