Spring Cloud Gray微服務(wù)灰度中間件
Spring Cloud Gray 是一套開(kāi)源的微服務(wù)灰度路由解決方案,它由 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-client-netflix 在 spring-cloud-gray-client 的基礎(chǔ)上集成了微服務(wù)注冊(cè)中心 eureka,擴(kuò)展ribbon 的負(fù)載均衡規(guī)則,提供了對(duì) zuul、feign、RestTemplate 的灰度路由能力,并且無(wú)縫支持 hystrix 線(xiàn)程池隔離。
spring-cloud-gray-server 負(fù)責(zé)灰度決策、灰度追蹤等信息的管理以及持久化。
spring-cloud-gray-webui 提供操作界面。
SpringCloudGray 能做什么
1. 金絲雀測(cè)試
先發(fā)布1臺(tái)實(shí)例,用于測(cè)試驗(yàn)證,指定測(cè)試的流量進(jìn)入這臺(tái)實(shí)例,其它流量依然進(jìn)入其它正常的實(shí)例。優(yōu)勢(shì)在于發(fā)布成本小,快速測(cè)試,并且不影響正常用戶(hù)體驗(yàn)影響,即使測(cè)試不通過(guò),也只需回滾這一臺(tái)實(shí)例,用戶(hù)無(wú)感知。
2. 灰度放量
通過(guò)金絲雀測(cè)試后,可以逐漸放量到新的版本上。例如,根據(jù)userId或者ip放5%的流量到其中一臺(tái)灰度實(shí)例上,觀察一段時(shí)間沒(méi)異常,可調(diào)整放入20%的流量,如果一臺(tái)實(shí)例扛不住,可再發(fā)一臺(tái)或多臺(tái)實(shí)例。將發(fā)布產(chǎn)生的風(fēng)險(xiǎn)保持在可控范圍內(nèi)。
3. 切斷實(shí)例流量
當(dāng)線(xiàn)上出現(xiàn)問(wèn)題,可將某臺(tái)實(shí)例的流量切斷,保留現(xiàn)場(chǎng),設(shè)置指定的請(qǐng)求進(jìn)入實(shí)例,在線(xiàn)調(diào)試并且不影響其它用戶(hù)。
4. 數(shù)據(jù)透?jìng)?/p>
借助灰度追蹤的能力,在網(wǎng)關(guān)處記錄用戶(hù)請(qǐng)求的最初的數(shù)據(jù),可以將之透?jìng)鞯秸?qǐng)求完整的調(diào)用鏈中。
5. 借助“破窗”能力,實(shí)例藍(lán)綠發(fā)布
首次上灰度時(shí),會(huì)存在兩種環(huán)境,一種是已經(jīng)依賴(lài)了灰度客戶(hù)端的環(huán)境,另一種是正常運(yùn)行的當(dāng)前環(huán)境。假如微服務(wù)的負(fù)載均衡是由 ribbon 實(shí)現(xiàn),那么當(dāng)前環(huán)境會(huì)請(qǐng)求路由到實(shí)例狀態(tài)為 UP 的實(shí)例上,而依賴(lài)了灰度客戶(hù)端的環(huán)境,則可以通過(guò)"破窗"能力,跟灰度路由結(jié)合,可以將匹配灰度策略的請(qǐng)求路由到實(shí)例狀態(tài)為 STARTING 的實(shí)例上,不匹配灰度策略的請(qǐng)求路由到實(shí)例狀態(tài)為 UP 的實(shí)例上。
設(shè)計(jì)思想
在微服務(wù)架構(gòu)中,接口的調(diào)用通常是服務(wù)消費(fèi)方按照某種負(fù)載均衡策略去選擇服務(wù)實(shí)例;但這無(wú)法滿(mǎn)足線(xiàn)上更特殊化的一些路由邏輯,比如根據(jù)一次請(qǐng)求攜帶的請(qǐng)求頭中的信息路由到某一個(gè)服務(wù)實(shí)例上。Spring Cloud Gray 正是為此而創(chuàng)建。
在Spring Cloud Gray 中定義了幾個(gè)角色灰度客戶(hù)端(gray-client)、灰度管控端(gray-server)、注冊(cè)中心。
注冊(cè)中心 負(fù)責(zé)服務(wù)的注冊(cè)和發(fā)現(xiàn)。
灰度客戶(hù)端 灰度的客戶(hù)端是指依賴(lài)了spring-cloud-gray-client的服務(wù),一般是指服務(wù)消費(fèi)方。
灰度管控端 負(fù)責(zé)灰度信息的管理、持久化等維護(hù)工作。
灰度客戶(hù)端會(huì)從灰度管控端拉取一份灰度信息的清單,并在內(nèi)存中維護(hù)這份清單信息,清單中包含服務(wù),服務(wù)實(shí)例,灰度策略,灰度追蹤字段等。當(dāng)請(qǐng)求達(dá)到網(wǎng)關(guān)時(shí),網(wǎng)關(guān)就會(huì)在灰度追蹤中將需要透?jìng)鞯男畔⒂涗浵聛?lái),并將傳遞給轉(zhuǎn)發(fā)的服務(wù)實(shí)例,后面的接口調(diào)用也會(huì)按照同樣的邏輯將追蹤信息透?jìng)飨氯?,從而保證所有一個(gè)請(qǐng)求在微服務(wù)調(diào)用鏈中的灰度路由。
如下圖所示:
項(xiàng)目擴(kuò)展
項(xiàng)目已經(jīng)實(shí)現(xiàn)了灰度的內(nèi)核,如果要與其它的注冊(cè)中心或者負(fù)載均衡中間件集成,只需實(shí)現(xiàn)相應(yīng)的 plugin 即可,spring cloud gray 已經(jīng)提供了 eureka、ribbon、feign、zuul 以及 spring cloud gateway 和 spring cloud stream 的 plugin,添加相應(yīng)的 plugin 依賴(lài)即可。
版本支持
目前有三個(gè)分支,對(duì) spring cloud 的支持分別如下
| 項(xiàng)目版本 | srpingcloud版本 | springboot版本 |
|---|---|---|
| A.1.1.0 | Edgware.SR6 | 1.5.22.RELEASE |
| B.0.0.1 | Finchley.SR4 | 2.0.9.RELEASE |
| C.0.0.1-SNAPHOST | Greenwich.SR2 | 2.1.7.RELEASE |
