微服務1:微服務及其演進史
微服務2:微服務全景架構
微服務3:微服務拆分策略
微服務4:服務註冊與發現
微服務5:服務註冊與發現(實踐篇)
微服務6:通訊之閘道器
微服務7:通訊之RPC
微服務8:通訊之RPC實踐篇(附原始碼)
微服務9:服務治理來保證高可用
微服務10:系統服務熔斷、限流
微服務11:熔斷、降級的Hystrix實現(附原始碼)
微服務提供了一些技術來實現對微服務的流量的管理,其中最典型的就是對流量進行拆分和轉發。
具體體現在金絲雀釋出(灰度釋出)、ABTesting 以及流量染色 等策略方案上,下面會進行詳細的介紹。
★ 價值驅動:
★ 業務視角:
這是流量排程中典型的金絲雀場景,可以先放行一部分流量轉發到一個新的服務範例中,這個新的服務範例只有你的研發和測試團隊可以接入。可以在上面嘗試使用或者測試,直到你確認你的服務是健康的,功能完整的,沒有bug的,再把流量逐漸的引流過去。
這個的好處是減少釋出新功能存在的風險,而且全程是無停服釋出,對使用者是透明無感知的,大大提高了可用性,提升服務SLA。
流量染色也是一種典型的場景。如果你想讓不同的使用者群體(比如這邊的Group A、Group B、Group C)使用的功能也是不同的,那流量染色是一個不可缺少的功能。
它可以把符合某些特徵的使用者流量調控到對應的服務版本中。比如GroupA是學生群體,對應到V1版本,GroupB是政企員工群體,對應到V2版本。需要注意的是,如果是一條完整的鏈路,那鏈路上的各個服務包括資料儲存層都應該有不同的版本,這樣才能一一對應。
Mesh如果想要實現流量染色,需要具備以下幾個條件:
Request Header:
UserId: 135648468
Dep: T204351
X-Request-Id: ee6637e816d7470bb2e90e13e1130733
labels:
app: traffic-test
appName: traffic-test
appType: java
istio.io/rev: default
pod-template-hash: 78ab8776a9
security.istio.io/tlsMode: istio
service.istio.io/canonical-revision: v1
version: v1 # 在具體的 pod 中 label 上 v1 的 version 標籤
spec:
exportTo:
- '*'
host: xxx.com
subsets:
- labels: # 這是v1 版本
version: v1
name: v1
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
- labels: # 這是default
version: default
name: default
所以,Mesh的染色本質上是通過在流量中攜帶一些特徵(如流量的請求的Header、Cookies、queryParams等),而Mesh會根據這些請求的特徵進行路由匹配,轉發到對應的帶有某些特徵的服務範例上。
未匹配成功的流量則走到預設版本中,從而實現多個版本和跟預設版本的業務隔離的目標。
上面的圖,當部門編號為 T204351的時候,流量會轉發到服務的v1版本中;當部門編號為 T204352的時候,流量會轉發到服務的v2版本中;剩餘的流量,預設轉發到服務的default版本中。
豐富的流量管理策略為我們系統的穩定性,以及流量的多樣化(金絲雀釋出、ABTesting、分級擴散流量、流量染色)使用提供了保證。