国产精品免费久久久久电影院_亚洲日韩蜜桃av无码一二三区_AV在线无码免费特黄毛片_亚洲欧美日韩电影在线专区_福利小视频午夜福利一区二区中文字幕_在线免费观看黄黄色视频_欧美菊爆视频在线观看免费_婷婷六月丁香五月_久久伊人精品中文字幕有码_强奸国产无码激情

淺析 Istio 實(shí)現(xiàn)熔斷原理

2022-07-08

1049

應(yīng)用從單體架構(gòu)向微服務(wù)架構(gòu)演進(jìn)的過程中,由于細(xì)粒度的微服務(wù)應(yīng)用數(shù)量大幅增長(zhǎng),微服務(wù)之間的服務(wù)發(fā)現(xiàn)、負(fù)載均衡、熔斷限流等服務(wù)治理需求顯著提高。


在微服務(wù)架構(gòu)下服務(wù)之間的調(diào)用鏈路相比單體應(yīng)用時(shí)代更長(zhǎng),微服務(wù)化拆分帶來系統(tǒng)整體能力提升的同時(shí),也增加了服務(wù)間級(jí)聯(lián)故障出現(xiàn)的概率。多個(gè)服務(wù)之間存在依賴調(diào)用,如果某個(gè)服務(wù)無法及時(shí)響應(yīng)請(qǐng)求,故障向調(diào)用源頭方向傳播,可能引發(fā)集群的大規(guī)模級(jí)聯(lián)故障,造成整個(gè)系統(tǒng)不可用。


為應(yīng)對(duì)這種情況,可以引入熔斷策略。為了防止故障范圍的擴(kuò)大,熔斷的基本邏輯就是隔離故障。通過不斷探測(cè)和周期性統(tǒng)計(jì)服務(wù)失敗調(diào)用次數(shù),如果服務(wù)的健康狀況低于設(shè)定閾值則啟動(dòng)熔斷,剔除錯(cuò)誤服務(wù)實(shí)例。熔斷機(jī)制雖然解決不了故障,但卻能在故障發(fā)生時(shí)盡量保全非故障鏈路上的服務(wù)接口能被正常訪問,將故障范圍控制在局部。被熔斷的服務(wù)也不會(huì)一直處于熔斷狀態(tài),在熔斷機(jī)制中還會(huì)執(zhí)行故障恢復(fù),探測(cè)到服務(wù)正常后關(guān)閉熔斷。Istio支持較全面的故障檢測(cè),熔斷開啟和熔斷恢復(fù)機(jī)制。


限流功能也是保護(hù)服務(wù)的重要手段,熔斷的主要目的是隔離故障,而引起故障的原因除了系統(tǒng)服務(wù)內(nèi)部的問題外,還有可能是請(qǐng)求量超過了系統(tǒng)處理能力的極限,后續(xù)新進(jìn)入的請(qǐng)求會(huì)持續(xù)加重服務(wù)負(fù)載,導(dǎo)致資源耗盡發(fā)生服務(wù)出錯(cuò)。限流的目的就是拒絕過多的請(qǐng)求流量,保證服務(wù)整體負(fù)載處于合理水平。系統(tǒng)的吞吐量一般是可以被測(cè)算的,為了保證系統(tǒng)的穩(wěn)定運(yùn)行,一旦達(dá)到需要限制的閾值,就需要采取措施限制流量,比如延遲處理、拒絕處理,或者部分拒絕處理等。Istio支持基于服務(wù)連接數(shù),請(qǐng)求排隊(duì)數(shù)等設(shè)置限流,還支持經(jīng)典的令牌限流模式,主動(dòng)保護(hù)上游服務(wù)。


微服務(wù)架構(gòu)帶來開發(fā)運(yùn)維模式巨大變革的同時(shí),也引入了服務(wù)治理的諸多問題:一個(gè)應(yīng)用由多個(gè)服務(wù)組成,每個(gè)服務(wù)有多個(gè)實(shí)例,每個(gè)實(shí)例的運(yùn)行狀態(tài)不斷變化,這對(duì)服務(wù)間流量管理和服務(wù)治理功能提出了巨大需求。以Istio為代表的服務(wù)網(wǎng)格,通過接管服務(wù)發(fā)送和接收的所有流量,可以輕松承載微服務(wù)應(yīng)用間的通信功能,通過控制平面下發(fā)服務(wù)治理配置,然后根據(jù)配置在各個(gè)服務(wù)之間的路由流量,提供熔斷限流等故障處理策略。


熔斷限流原理


如何將服務(wù)聯(lián)通起來,是服務(wù)治理首先要解決的問題。通常的做法是將通訊層基礎(chǔ)功能以SDK的形式嵌入業(yè)務(wù)代碼中,但是這種強(qiáng)耦合的方案會(huì)增加開發(fā)的難度,增加維護(hù)成本,增加質(zhì)量風(fēng)險(xiǎn)。另外對(duì)于SDK調(diào)用的代碼多處冗余出現(xiàn),從服務(wù)治理的角度來看,這樣的方式侵入了業(yè)務(wù),并且分散于應(yīng)用,不利于微服務(wù)體系的整體管控。


通過將原來在SDK中的邏輯轉(zhuǎn)移到Sidecar中,提供了另一種可行方案。Sidecar就是在應(yīng)用節(jié)點(diǎn)上部署的代理進(jìn)程,應(yīng)用將請(qǐng)求發(fā)給代理,由代理完成路由轉(zhuǎn)發(fā)。


從整體來看,代理間流量調(diào)用關(guān)系形成完整的網(wǎng)絡(luò),代表服務(wù)間復(fù)雜的調(diào)用關(guān)系,承載著系統(tǒng)內(nèi)的應(yīng)用通信。各個(gè)具體的微服務(wù)之間不再直接發(fā)生連接,而是轉(zhuǎn)由各自的Sidecar代理通信實(shí)現(xiàn),在應(yīng)用形態(tài)上形成了一組由代理所組成的網(wǎng)狀交互結(jié)構(gòu),這也是服務(wù)網(wǎng)格名稱的由來。



服務(wù)網(wǎng)格的本質(zhì)是將通用流量治理的功能沉淀至Sidecar中,由Sidecar接管服務(wù)流量并對(duì)其進(jìn)行治理。可以通過流量劫持的手段,做到無代碼侵入實(shí)現(xiàn)流量治理,讓開發(fā)者更聚焦業(yè)務(wù)功能,降低微服務(wù)的代碼復(fù)雜性,提高開發(fā)效率。通過將服務(wù)治理功能從應(yīng)用本身剝離出來,做到了控制與邏輯的分離。Sidecar模式允許我們向應(yīng)用無侵入添加多種功能,避免了為滿足功能擴(kuò)展需求而向應(yīng)用添加額外的代碼。


如下圖右側(cè)所示,當(dāng)外部請(qǐng)求調(diào)用服務(wù)實(shí)例接口時(shí),其發(fā)送的網(wǎng)絡(luò)請(qǐng)求會(huì)經(jīng)過它們各自的網(wǎng)絡(luò)代理,那么代理就可以為其提供服務(wù)熔斷相關(guān)的機(jī)制,當(dāng)調(diào)用服務(wù)實(shí)例持續(xù)出錯(cuò)時(shí),就不再將外部請(qǐng)求發(fā)送到服務(wù)實(shí)例,而是直接返回配置的錯(cuò)誤碼。同樣,Proxy代理可以為其提供限流功能,當(dāng)外部請(qǐng)求流量過大時(shí),代理會(huì)對(duì)其中一部分請(qǐng)求進(jìn)行限流,拒絕部分請(qǐng)求,只將部分請(qǐng)求轉(zhuǎn)發(fā)下游服務(wù)。



將微服務(wù)治理邏輯從原先具體的微服務(wù)進(jìn)程中抽離出來,實(shí)現(xiàn)由統(tǒng)一控制面管理和代理數(shù)據(jù)面執(zhí)行的體系結(jié)構(gòu),是Istio Service Mesh體系與Spring Cloude等傳統(tǒng)微服務(wù)體系在架構(gòu)上最大的區(qū)別。各種服務(wù)治理邏輯,也是在這樣的架構(gòu)模式下實(shí)現(xiàn)的。Service Mesh架構(gòu)總體上由控制面(Control Plane)和數(shù)據(jù)面(Data Plane)兩部分組成,其中控制面主要承擔(dān)整個(gè)微服務(wù)體系治理信息的集中管控分發(fā),而數(shù)據(jù)面的代理程序則負(fù)責(zé)具體執(zhí)行由控制面下發(fā)的各類服務(wù)治理信息及規(guī)則。對(duì)于代理程序的部署問題,Istio中通過開啟自動(dòng)注入,在部署應(yīng)用時(shí)可以把代理程序自動(dòng)部署到用戶應(yīng)用相同的Pod下,用戶無需擔(dān)心代理程序的部署問題。


在Istio中,廣義的熔斷配置包括兩部分:首先是基于請(qǐng)求容量限制的熔斷,超過設(shè)定閾值的請(qǐng)求直接丟棄返回錯(cuò)誤,直觀更像限流配置。通過設(shè)置connectionPool連接線程池參數(shù)實(shí)現(xiàn),該參數(shù)可以對(duì)上游服務(wù)的并發(fā)連接數(shù)和請(qǐng)求數(shù)進(jìn)行限制(適用于TCP和HTTP),從而實(shí)現(xiàn)限流功能。其次是基于服務(wù)實(shí)例質(zhì)量檢測(cè)的服務(wù)熔斷,這是通過隔離故障服務(wù)實(shí)例來減少整體服務(wù)異常率、降低服務(wù)延遲而采用的一種措施。具體來說,Istio引入了異常檢測(cè)來完成熔斷功能,如果在一定時(shí)間內(nèi)服務(wù)實(shí)例累計(jì)發(fā)生錯(cuò)誤的次數(shù)超過了預(yù)定義閥值,Istio就會(huì)將該錯(cuò)誤的服務(wù)實(shí)例從負(fù)載均衡池移除。


異常檢測(cè)原理:檢測(cè)到了某個(gè)主機(jī)異常時(shí),如果到目前為止負(fù)載均衡池中還沒有主機(jī)被隔離出去,將會(huì)立即隔離該異常主機(jī);如果已經(jīng)有主機(jī)被隔離出去,就會(huì)檢查當(dāng)前隔離的主機(jī)數(shù)是否低于設(shè)定的閾值(通過Envoy中的 outlier_detection.max_ejection_percent 指定),如果當(dāng)前被隔離的主機(jī)數(shù)量不超過該閾值,就將該主機(jī)隔離出去,否則不隔離。通常異常檢測(cè)會(huì)與主動(dòng)健康檢查一起用于全面的健康檢查解決方案,異常檢測(cè)的類型主要包括連續(xù)的5XX響應(yīng),包括內(nèi)部業(yè)務(wù)錯(cuò)誤或連續(xù)網(wǎng)關(guān)故障。


隔離不是永久的,會(huì)有一個(gè)時(shí)間限制。當(dāng)主機(jī)被隔離后,該主機(jī)就會(huì)被標(biāo)記為不健康,除非負(fù)載均衡處于恐慌模式。隔離時(shí)間等于Envoy中的outlier_detection.base_ejection_time_ms的值乘以主機(jī)被隔離的次數(shù)。某個(gè)主機(jī)連續(xù)出現(xiàn)故障,會(huì)導(dǎo)致它被隔離的時(shí)間越來越長(zhǎng)。經(jīng)過了規(guī)定的隔離時(shí)間之后,被隔離的主機(jī)將會(huì)自動(dòng)恢復(fù)過來,重新接受調(diào)用方的遠(yuǎn)程調(diào)用。被移除的實(shí)例在一段時(shí)間之后,還會(huì)被加回去進(jìn)行再一次的嘗試,成功的話實(shí)例被認(rèn)為成功,否則實(shí)例會(huì)被重新逐出,這里的驅(qū)逐時(shí)間是一個(gè)基礎(chǔ)時(shí)間乘以驅(qū)逐的次數(shù)。Istio中還可以控制驅(qū)逐比例,也就是說有多少比例的服務(wù)實(shí)例在不滿足要求時(shí)被驅(qū)逐。當(dāng)有太多實(shí)例被驅(qū)逐的時(shí)候,會(huì)進(jìn)入恐慌模式,這時(shí)Istio會(huì)忽略負(fù)載均衡池上實(shí)例的健康標(biāo)記,仍然向所有實(shí)例發(fā)送請(qǐng)求,從而保證一個(gè)服務(wù)的整體可用性。


Istio中熔斷在DestinationRule的CRD資源的TrafficPolicy中設(shè)置,通過設(shè)置連接池connectionPool實(shí)現(xiàn)限流熔斷,設(shè)置異常檢測(cè)outlierDetection實(shí)現(xiàn)服務(wù)實(shí)例隔離熔斷。


ConnectionPool下有TCP和HTTP兩個(gè)類別的配置,二者相互協(xié)作,為服務(wù)提供有關(guān)限流的配置。TCP相關(guān)的基礎(chǔ)配置有maxConnections和connectTimeout。maxConnections表示到目標(biāo)服務(wù)最大的HTTP1/TCP連接數(shù)量,它只會(huì)限制基于HTTP1.1協(xié)議的連接,不會(huì)影響基于HTTP2的連接,因?yàn)镠TTP2協(xié)議只建立一次連接。connectTimeout表示建立TCP連接時(shí)的超時(shí)時(shí)間,默認(rèn)單位是秒,超出該時(shí)間,則連接會(huì)被自動(dòng)斷開。HTTP下的配置包括http1MaxPendingRequests、http2MaxRequests和maxRequestsPerConnection三種。http1MaxPendingRequests 表示HTTP請(qǐng)求處于pending狀態(tài)下的最大請(qǐng)求數(shù),也就是目標(biāo)服務(wù)最多可以同時(shí)處理多少個(gè)HTTP請(qǐng)求,默認(rèn)是1024個(gè)。http2MaxRequests表示目標(biāo)服務(wù)最大的HTTP2請(qǐng)求數(shù)量,默認(rèn)是1024。maxRequestsPerConnection表示每個(gè)TCP連接可以被多少個(gè)請(qǐng)求復(fù)用,如果將這一參數(shù)設(shè)置為 1,則會(huì)禁止keepalive特性。


OutlierDetection下相關(guān)的配置項(xiàng)涉及服務(wù)的熔斷機(jī)制,具體有如下幾個(gè)基礎(chǔ)配置。consecutiveErrors表示如果目標(biāo)服務(wù)連續(xù)返回多少次錯(cuò)誤碼后,會(huì)將目標(biāo)服務(wù)從可用服務(wù)實(shí)例列表中剔除,也就是說進(jìn)行熔斷,不再請(qǐng)求目標(biāo)服務(wù)。當(dāng)通過HTTP請(qǐng)求訪問服務(wù),返回碼為502、503或504時(shí),Istio會(huì)將本次網(wǎng)絡(luò)請(qǐng)求判斷為發(fā)生錯(cuò)誤。該屬性配置的默認(rèn)值是5,也就是說如果目標(biāo)實(shí)例連續(xù)5個(gè)http請(qǐng)求都返回了5xx的錯(cuò)誤碼,則該服務(wù)實(shí)例會(huì)被剔除,不再接受客戶端的網(wǎng)絡(luò)請(qǐng)求。


Interval表示服務(wù)剔除的時(shí)間間隔,即在interval時(shí)間周期內(nèi)發(fā)生1個(gè)consecutiveErrors錯(cuò)誤,則觸發(fā)服務(wù)熔斷。其單位包括小時(shí)、分鐘、秒和毫秒,默認(rèn)值是10秒。baseEjectionTime表示目標(biāo)服務(wù)被剔除后,至少要維持剔除狀態(tài)多長(zhǎng)時(shí)間。這段時(shí)間內(nèi),目標(biāo)服務(wù)將保持拒絕訪問狀態(tài)。該時(shí)間會(huì)隨著被剔除次數(shù)的增加而自動(dòng)增加,時(shí)間為baseEjectionTime和驅(qū)逐次數(shù)的乘積。其單位包括小時(shí)、分鐘、秒和毫秒,默認(rèn)是30秒。maxEjectionPercent表示可用服務(wù)實(shí)例列表中實(shí)例被移除的最大百分比,默認(rèn)是10%。當(dāng)超出這個(gè)比率時(shí),即使再次發(fā)生熔斷,也不會(huì)將服務(wù)剔除,這樣就避免了因?yàn)樗矔r(shí)錯(cuò)誤導(dǎo)致大多數(shù)服務(wù)實(shí)例都被剔除的問題。


minHealthPercent表示健康模式的最小百分比,也就是所有服務(wù)實(shí)例中健康(未被剔除)的比率。當(dāng)?shù)陀谶@一比率時(shí),整個(gè)集群被認(rèn)為處于非健康狀態(tài),outlierDetection配置相關(guān)的服務(wù)剔除熔斷機(jī)制將被關(guān)閉,不再進(jìn)行服務(wù)健康檢查,所有服務(wù)實(shí)例都可以被請(qǐng)求訪問,包含健康和不健康的主機(jī)。該屬性的默認(rèn)值是50%,并且minHealthPercent和maxEjectionPercent的和一般都不超過100%。


除了熔斷外,速率限制也是緩解級(jí)聯(lián)故障和防止耗盡共享資源的一種簡(jiǎn)單有效的方法。Envoy是一個(gè)功能豐富的代理,通過配置Envoy過濾器可以為服務(wù)輕松添加速率限制的功能。上面介紹的熔斷功能,有如下缺點(diǎn):精確到實(shí)例級(jí)別,無法針對(duì)某個(gè)api限流熔斷。在路由規(guī)則后起作用,服務(wù)端接收到超出配置的服務(wù)容量限制的請(qǐng)求后被動(dòng)限流,沒有做到流量分發(fā)之前主動(dòng)限流。在Istio體系下,可通過EnvoyFilter這個(gè)配置來實(shí)現(xiàn)高級(jí)的限流需求。EnvoyFilter提供了三種方式進(jìn)行擴(kuò)展:編寫C++擴(kuò)展代碼,Lua腳本擴(kuò)展,WebAssembly擴(kuò)展,實(shí)踐中,Lua腳本方式使用較多。通過自定義HTTP Filter來匹配限流熔斷條件,并將該熔斷插件放在router前面,每次處理請(qǐng)求時(shí),會(huì)先經(jīng)過該插件來判斷是否需要被限流。限流器還可引用外部的獨(dú)立限流服務(wù),EnvoyFilter支持兩種配置中心集中式限流和本地限流兩種限流方式,實(shí)現(xiàn)了基于經(jīng)典令牌原理的限流功能。


在大多數(shù)情況下,本地限流控制系統(tǒng)中的上下游之間服務(wù)調(diào)用吞吐量非常有效,但有時(shí)它的效果并不能保證,這時(shí)候便需要全局限流服務(wù)。最常見的情況是當(dāng)大量服務(wù)發(fā)送請(qǐng)求到少量服務(wù)(例如各應(yīng)用服務(wù)發(fā)送給數(shù)據(jù)庫(kù)服務(wù)的請(qǐng)求)。在這種情況下,很難對(duì)每個(gè)下游服務(wù)配置足夠有效的熔斷器,使得上游服務(wù)可以平穩(wěn)運(yùn)行,這種情況下為服務(wù)配置全局限速是一個(gè)很好的解決方案。


Envoy全局限流方案基于一個(gè)全局限速服務(wù)RLS(rate limit service)實(shí)現(xiàn),RLS 被設(shè)計(jì)為一種提供限速場(chǎng)景的gRPC服務(wù)。全局限速生效于被限速業(yè)務(wù)的網(wǎng)絡(luò)入口,這意味著無論請(qǐng)求來自集群內(nèi)部署的其他微服務(wù),還是來自網(wǎng)關(guān)以外的外部訪問,請(qǐng)求都會(huì)被限速,因此全局限速是一種在突發(fā)流量激增場(chǎng)景中保護(hù)關(guān)鍵業(yè)務(wù)的有效手段。


了解完 Istio 實(shí)現(xiàn)熔斷原理,快來上手體驗(yàn)一下具體的服務(wù)網(wǎng)格產(chǎn)品吧。


SolarMesh 是一款基于Istio和容器技術(shù)打造的高效可視化微服務(wù)治理平臺(tái),主打輕量、便捷、高效、可視化,讓服務(wù)網(wǎng)格不再難學(xué)難用,補(bǔ)齊企業(yè)落地Istio最后的一塊短板。


*Sidecar 模式,免去第三方組件配置或修改應(yīng)用程序

*適用所有語言

*豐富的流程控制策略



文章來源:房耘耘


技術(shù)交流
我們建立了多個(gè)云原生技術(shù)交流群,其中有來自O(shè)racle、Citrix、華為、騰訊等國(guó)內(nèi)外云計(jì)算專家,立即掃碼,拉你進(jìn)群。目前已有2000+開發(fā)者加入我們......
云原生廠商 云原生技術(shù)服務(wù)商
在云原生時(shí)代,kaiyun開云創(chuàng)新致力于通過賦能開發(fā)者,實(shí)現(xiàn)企業(yè)快速迭代與交付,大幅提升創(chuàng)新效率。
產(chǎn)品下載