日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

大流量场景下如何云淡风轻地进行线上发布?

發(fā)布時(shí)間:2024/8/23 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大流量场景下如何云淡风轻地进行线上发布? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡(jiǎn)介:?本文介紹了微服務(wù)治理下金絲雀發(fā)布的能力,解決了發(fā)布期間少量流量驗(yàn)證新功能的問(wèn)題。

前言

本文,我們繼續(xù)聊聊《揭秘大流量場(chǎng)景下發(fā)布如絲般順滑背后的原因》中的另外一環(huán),灰度發(fā)布,也叫金絲雀發(fā)布。
?
很多互聯(lián)網(wǎng)公司在半夜發(fā)布的另外一個(gè)重要原因是不具備可灰度能力,新版本存在 bug 或者其它原因會(huì)影響線(xiàn)上的客戶(hù),無(wú)奈之下只能選擇在半夜進(jìn)行發(fā)布來(lái)減少影響面。

我們知道默認(rèn)情況下,無(wú)論是 Kubernetes 還是 ECS,新老版本都存在的情況下會(huì)根據(jù)特定的負(fù)載均衡算法隨機(jī)地路由到不同的實(shí)例上,隨機(jī)意味著出問(wèn)題也會(huì)隨機(jī)出現(xiàn)。我們需要一套動(dòng)態(tài)路由來(lái)完成灰度發(fā)布的解決方案。

在 RPC 領(lǐng)域,我們稱(chēng)灰度發(fā)布為動(dòng)態(tài)路由,動(dòng)態(tài)路由的意思是指流量可以動(dòng)態(tài)地路由到指定的實(shí)例上。

動(dòng)態(tài)路由場(chǎng)景

動(dòng)態(tài)路由是微服務(wù)里非常核心的功能,流量動(dòng)態(tài)路由意味著可以做非常多的事情。由此衍生出各個(gè)場(chǎng)景:

  • 金絲雀發(fā)布:只有滿(mǎn)足特定規(guī)則(比如 Query Parameter、HEADER、COOKIE 中某些 KEY 滿(mǎn)足一些條件)或者是固定流量比例的流量才會(huì)進(jìn)入新版本,其它流量都路由到老版本上。

?

  • 同機(jī)房?jī)?yōu)先路由:當(dāng)公司規(guī)模擴(kuò)大之后,應(yīng)用會(huì)跨機(jī)房部署來(lái)達(dá)到高可用的目的。由于異地跨機(jī)房調(diào)用出現(xiàn)的網(wǎng)絡(luò)延遲問(wèn)題,需要確保服務(wù)消費(fèi)方能優(yōu)先調(diào)用相同機(jī)房的服務(wù)消費(fèi)方,這就需要同機(jī)房?jī)?yōu)先路由的能力。

?

  • 標(biāo)簽路由:金絲雀發(fā)布的新場(chǎng)景。金絲雀發(fā)布一般只有新和老兩個(gè)版本,標(biāo)簽路由可以在線(xiàn)上部署多個(gè)版本,每個(gè)版本都對(duì)于一個(gè)標(biāo)簽。

  • 全鏈路灰度:在業(yè)務(wù)比較復(fù)雜,服務(wù)調(diào)用鏈路較長(zhǎng)的場(chǎng)景下,每個(gè)應(yīng)用都需要設(shè)置路由規(guī)則會(huì)顯得非常繁瑣,全鏈路灰度在金絲雀/標(biāo)簽路由的基礎(chǔ)上加上了 "標(biāo)簽透?jìng)?#34; 的能力,讓灰度流量只在灰度版本之間路由。

?

接下來(lái)我會(huì)分幾篇文章詳細(xì)講一下這幾個(gè)場(chǎng)景,今天我們先來(lái)聊聊金絲雀發(fā)布。金絲雀發(fā)布可以讓我們?cè)诎滋炝髁扛叻搴戎璩灾献舆M(jìn)行線(xiàn)上發(fā)布,不需要在半夜為發(fā)布的事情而苦惱。

大流量下的應(yīng)用部署現(xiàn)狀

應(yīng)用 Demo

Demo 以 Spring Cloud 為例,服務(wù)調(diào)用鏈路如下圖所示:

?

流量從 Netflix Zuul 對(duì)應(yīng)的 Ingress 進(jìn)來(lái),會(huì)調(diào)用 SC-A 應(yīng)用對(duì)應(yīng)的服務(wù),SC-A 應(yīng)用內(nèi)部調(diào)用 SC-B 應(yīng)用的服務(wù),SC-B 應(yīng)用內(nèi)部調(diào)用 SC-C 應(yīng)用的服務(wù)。SC-A 有線(xiàn)上版本和灰度版本這兩個(gè)版本。

Helm 部署 Demo

Demo 為純開(kāi)源 Spring Cloud 架構(gòu),項(xiàng)目地址:https://github.com/aliyun/alibabacloud-microservice-demo/tree/master/microservice-doc-demo/traffic-management。

部署完畢后,阿里云容器服務(wù)上的工作負(fù)載情況如下:

?

我們通過(guò) "while true; do curl?http://{ip:port}/A/a;echo;done" shell 命令不斷地去訪問(wèn) Spring Cloud 服務(wù),各個(gè)服務(wù)的作用僅僅是打印當(dāng)前服務(wù)的IP,這樣我們可以看到整體調(diào)用鏈路:

while true; do curl http://{ip:port}/A/a;echo;done A[10.0.0.73] -> B[10.0.0.180] -> C[10.0.0.72] A1[10.0.0.20] -> B[10.0.0.180] -> C[10.0.0.72] A1[10.0.0.20] -> B[10.0.0.180] -> C[10.0.0.72] A[10.0.0.73] -> B[10.0.0.180] -> C[10.0.0.72] A[10.0.0.73] -> B[10.0.0.180] -> C[10.0.0.72] A1[10.0.0.20] -> B[10.0.0.180] -> C[10.0.0.72] A[10.0.0.73] -> B[10.0.0.180] -> C[10.0.0.72] A1[10.0.0.20] -> B[10.0.0.180] -> C[10.0.0.72] A[10.0.0.73] -> B[10.0.0.180] -> C[10.0.0.72] ...

從這個(gè)過(guò)程我們明顯可以看出 Netflix Zuul -> SC-A 這條鏈路是隨機(jī)訪問(wèn)的,由于 SC-A 的線(xiàn)上版本和灰度版本各只有 1 個(gè) Pod,所以隨機(jī)打印了這兩個(gè) POD 的 IP。

開(kāi)源金絲雀的實(shí)現(xiàn)

動(dòng)態(tài)路由的本質(zhì)就是尋址過(guò)程中去找符合條件的實(shí)例地址。

Apache Dubbo 提供了 RouterChain 的能力去過(guò)濾 Invoker 列表,RouterChain 內(nèi)部維護(hù)著 Router 列表,每個(gè) Router 都會(huì)做過(guò)濾 Invoker 的邏輯,最后將 Invoker 列表交付給 LoadBalance 做負(fù)載均衡獲取最后的 Invoker。

ScriptRouter,ConditionRouter 和 TagRouter 這些內(nèi)置的 Router 內(nèi)部都是 Dubbo 自帶的動(dòng)態(tài)路由能力。

Spring Cloud 的路由能力由 Ribbon 實(shí)現(xiàn)。Ribbon 設(shè)計(jì)了 ILoadBalancer 接口用于獲取 Server 列表,最后將這個(gè)列表交付給 IRule 做負(fù)載均衡策略獲取最后的 Server。這塊在設(shè)計(jì)上跟 Dubbo 相比是有缺陷的。

Spring Cloud Ribbon 里的 ILoadBalancer 相當(dāng)于是 Dubbo RouterChain 里的一個(gè) Router,IRule 相當(dāng)于是 Dubbo LoadBalance。

最新版本的 Spring Cloud 新增了 Spring Cloud LoadBalancer 組件代替 Ribbon 用于做負(fù)載均衡,Spring Cloud LoadBalancer 里的 ServiceInstanceListSupplier 用于獲取實(shí)例列表信息,ReactiveLoadBalancer 使用負(fù)載均衡策略獲取最后的實(shí)例。

這是 3 者對(duì)應(yīng)組件的說(shuō)明:

?

Apache Dubbo 雖然內(nèi)置了各種 Router,但實(shí)際使用下來(lái)卻有非常多的問(wèn)題。比如 TagRouter 跟 IP 綁定,在 Kubernetes 下無(wú)法工作;ScriptRouter 用了 ScriptEngine 去做腳本的處理,會(huì)有性能問(wèn)題;Dubbo Admin 的使用體驗(yàn)非常糟糕等等。

Spring Cloud 官方并沒(méi)有提供動(dòng)態(tài)路由的能力,只有社區(qū)上的一些開(kāi)發(fā)者自己去擴(kuò)展了這個(gè)能力,社區(qū)上也沒(méi)有任何的 UI 交互界面。

這時(shí)候 MSE 告訴你,MSE 的微服務(wù)解決方案提供了動(dòng)態(tài)路由的能力,不需要做任何的代碼和配置的修改,就能使用 OPEN API 或者 UI 交互去完成金絲雀發(fā)布。只需將您的應(yīng)用接入 MSE 服務(wù)治理,您就能享受到金絲雀能力。

只要你的應(yīng)用是基于 Spring Cloud 或 Dubbo 最近五年內(nèi)的版本開(kāi)發(fā),就能直接使用完整的 MSE 微服務(wù)治理能力,不需要修改任何代碼和配置。

無(wú)需任何代碼修改就可以做到動(dòng)態(tài)路由的能力,這不香嗎?

MSE 金絲雀能力

應(yīng)用接入 MSE 即可享受 MSE 提供的動(dòng)態(tài)路由能力,無(wú)需任何代碼修改。

引入標(biāo)簽概念

MSE 引入了標(biāo)簽的概念,可以針對(duì)每個(gè)標(biāo)簽設(shè)置路由規(guī)則,滿(mǎn)足該路由規(guī)則的流量會(huì)路由到這個(gè)標(biāo)簽對(duì)應(yīng)的實(shí)例下。我們將 Spring Cloud Demo 進(jìn)行一點(diǎn)改造,給 SC-A 的灰度版本打上 "blue" 標(biāo)簽( Helm 已經(jīng)完成了這個(gè)步驟)。

?

接入 MSE 后,MSE 默認(rèn)會(huì)給應(yīng)用分配一個(gè) 100% 路由到未打標(biāo)實(shí)例的路由規(guī)則。此時(shí),我們繼續(xù)通過(guò) "while true; do curl?http://{ip:port}/A/a;echo;done" shell 命令去執(zhí)行,這個(gè)時(shí)候調(diào)用 SC-A 全部返回線(xiàn)上版本的 IP:

while true; do curl http://{ip:port}/A/a;echo;done A[10.0.0.73] -> B[10.0.0.180] -> C[10.0.0.72] A[10.0.0.73] -> B[10.0.0.180] -> C[10.0.0.72] A[10.0.0.73] -> B[10.0.0.180] -> C[10.0.0.72] A[10.0.0.73] -> B[10.0.0.180] -> C[10.0.0.72] A[10.0.0.73] -> B[10.0.0.180] -> C[10.0.0.72] ...

設(shè)置金絲雀路由規(guī)則

我們?cè)?MSE 上的應(yīng)用詳情頁(yè)里的金絲雀 Tab 頁(yè)里設(shè)置 HEADER 里 env 這個(gè) KEY 的值為 test 的金絲雀路由條件:

?

傳入 HEADER 繼續(xù)使用 shell 執(zhí)行:

while true; do curl -H "env:test" http://139.196.200.40/A/a;echo;done A1[10.0.0.20] -> B[10.0.0.180] -> C[10.0.0.72] A1[10.0.0.20] -> B[10.0.0.180] -> C[10.0.0.72] A1[10.0.0.20] -> B[10.0.0.180] -> C[10.0.0.72] A1[10.0.0.20] -> B[10.0.0.180] -> C[10.0.0.72] A1[10.0.0.20] -> B[10.0.0.180] -> C[10.0.0.72] A1[10.0.0.20] -> B[10.0.0.180] -> C[10.0.0.72] A1[10.0.0.20] -> B[10.0.0.180] -> C[10.0.0.72] A1[10.0.0.20] -> B[10.0.0.180] -> C[10.0.0.72] A1[10.0.0.20] -> B[10.0.0.180] -> C[10.0.0.72] ...

這個(gè)時(shí)候我們發(fā)現(xiàn)滿(mǎn)足金絲雀規(guī)則的流量都去了 SC-A 的灰度版本。

金絲雀路由規(guī)則解析

大家看到金絲雀路由規(guī)則界面上有兩種分別,分別是流量比例流量規(guī)則:

?

流量規(guī)則:表示滿(mǎn)足該規(guī)則的流量會(huì)路由到對(duì)應(yīng)標(biāo)簽(本文使用 blue 作為灰度標(biāo)簽)實(shí)例上。比如本文例子中 HEADER 里 env=test 的流量一定會(huì)去 blue 標(biāo)簽對(duì)應(yīng)的實(shí)例。

流量比例:不滿(mǎn)足任何流量規(guī)則的流量會(huì)按照流量百分比進(jìn)行路由。比如本文例子中不滿(mǎn)足 HEADER 里 env=test 的流量會(huì)以 100% 的規(guī)則路由到未打標(biāo)的實(shí)例上,由于是 100%,所以那些不滿(mǎn)足規(guī)則的流量全部都去了未打標(biāo)實(shí)例上(本文未打標(biāo)表示線(xiàn)上版本)。

MSE 提供的流量規(guī)則里的條件支持?HEADER、Query Parameter、COOKIE 以及 Request BODY

Query Parameter、HEADER、COOKIE 和 Request Body 除了支持常規(guī)的運(yùn)算符外,還支持 in(白名單),對(duì) 100 取模和百分比。這里的百分比并不是比例規(guī)則中的總流量百分比,而是指對(duì)應(yīng)參數(shù)的 hash 值取模,這樣就可以讓固定的值永遠(yuǎn)滿(mǎn)足路由條件(如果按照流量比例,用戶(hù) A 這次訪問(wèn)的是線(xiàn)上版本,下次可能會(huì)訪問(wèn)灰度版本)。舉個(gè)例子,如果 HEADER 中帶有用戶(hù) ID,我讓想部分用戶(hù)永遠(yuǎn)能夠訪問(wèn)灰度實(shí)例,這個(gè)時(shí)候可以對(duì)用戶(hù) ID 的 hash 值取模去完成(當(dāng)然,這個(gè)也可以通過(guò)白名單去操作,白名單的缺點(diǎn)并不隨機(jī),需要輸入各個(gè)名單)。

Request Body 目前支持解析 json 字符串,比如如下字符串:

{ "a": "aa","b": [1,2,3],"c": [{"d": "dd"}],"e": {"f": "ff"} }

JSON 訪問(wèn)表達(dá)式 .a 的值為 aa。
JSON 訪問(wèn)表達(dá)式 .b[0] 的值為 1。
JSON 訪問(wèn)表達(dá)式 .c[0].d 的值為 dd。
JSON 訪問(wèn)表達(dá)式 .e.f 的值為 ff。

總結(jié)

本文介紹了微服務(wù)治理下金絲雀發(fā)布的能力,解決了發(fā)布期間少量流量驗(yàn)證新功能的問(wèn)題。您的應(yīng)用只需接入 MSE 服務(wù)治理,無(wú)需任何操作即可享受到動(dòng)態(tài)路由的能力。除了 MSE(微服務(wù)引擎),金絲雀發(fā)布還被 EDAS、SAE 等云產(chǎn)品集成。

原文鏈接

本文為阿里云原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。

總結(jié)

以上是生活随笔為你收集整理的大流量场景下如何云淡风轻地进行线上发布?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。