灰度發佈(又名金絲雀發佈)是指在黑與白之間,可以平滑過渡的一種發佈方式。在其上能夠進行A/B testing,即讓一部分用戶繼續用產品特性A,一部分用戶開始用產品特性B,若是用戶對B沒有什麼反對意見,那麼逐步擴大範圍,把全部用戶都遷移到B上面來。灰度發佈能夠保證總體系統的穩定,在初始灰度的時候就能夠發現、調整問題,以保證其影響度。web
在開發或者測試的時候,或者線上發佈,線上服務多版本控制的時候,須要對服務提供權重路由,最多見的使用就是,一個服務有兩個版本,舊版本V1,新版本v2。在線上灰度的時候,須要經過網關動態實時推送,路由權重信息。好比95%的流量走服務v1版本,5%的流量走服務v2版本。spring
如何使用SpringCloud進行灰度發佈呢?將分一下四步:後端
第一,設置網關權重路由設置app
Spring Cloud Gateway中提供了org.springframework.cloud.gateway.handler.predicate.WeightRoutePredicateFactory去實現根據分組設置權重進行路由,所以使用起來相對比較簡單,有興趣的能夠debug閱讀源碼。測試
咱們經過在Spring Cloud Gateway中會配置不一樣的權重信息到不一樣URL上,Spring Cloud Gateway會根據咱們配置的路由權重信息,將請求分發到不一樣的源服務組,權重信息如ch4/ch4-gateway中的application.yml所示,主要配置信息以下。ui
spring: debug
cloud: 版本控制
gateway:ip
discovery: 路由
locator:
enabled: true
routes:
- id: order-service1
uri: lb://order/order/create1
order: 8000
predicates:
- Path=/order/create
filters:
- StripPrefix=1
- Weight=order-service, 95
- id: order-service2
uri: lb://order/create2
order: 8000
predicates:
- Path=/order/create
filters:
- StripPrefix=1
- Weight=order-service, 5
Weight=order-service1, 95,Weight=service1, 5就是路由的權重信息。
第2、源服務配置
源服務在本案例中爲order模塊源服務,主要提提供Gateway Server權重路由對應的後端源服務。由於比較簡單所以不作詳細說明,主要代碼以下所示。
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class OrderController {
@RequestMapping("/create1")
public String orderCreateV1() {
//此處寫業務邏輯代碼
return "success";
}
@RequestMapping( "/ceate2")
public String v2() {
//此處寫業務邏輯代碼
return 「success」;
}
}
第3、進行測試
分別啓動gateway,order進行訪問:http://localhost:5001/order/create 測試,發現會根據所設權重進行路由。
第四,使用zookeeper config實現動態權重路由
到第三步完成之後,如今能夠經過修改配置的如何根據現有的服務在線動態更新權重呢?使用zookeeper做爲spring cloud的註冊和配置中心,gateway模塊和order模塊配置監控配置的變化,若是想作動態灰度發佈,增長後臺在線配置管理界面,並在線修改gateway的配置,實現動態的灰度發佈,而不用每次修改都要從新啓動gateway。
spring:
cloud:
zookeeper:
enabled: true
connect-string: localhost:2181
config:
root: /config
enabled: true
watcher:
enabled: true
第五,使用zkui進行配置修改
使用ZKUI來可視化管理Zookeeper,登陸ZKUI->import 選擇對應文件導入便可。ZKUI安裝使用請自行百度。
以上就是我使用spring cloud進行灰度發佈的過程記錄。