javascript
SpringCloud 应用在 Kubernetes 上的最佳实践 — 高可用(熔断)
作者 | 宿何
導讀:前幾篇我們主要站在應用發布的場景,描述在發布過程中會遇到的灰度、監控、回滾、優雅上下線等保障發布能順利進行的注意事項。作為一個程序員 GG,可灰度的發布順利上線往往意味著準點下班。而我們今天要分享的內容則關系到我們能否擁有一個高質量的休息時間,即線上的高可用保障。
前言
阿里巴巴十多年的 雙11,錘煉出來了一套業界領先的高可用技術,有一些已經商業化(云產品 PTS、AHAS),也有的開源了如:Sentinel、ChaosBlade。我們這一系列的高可用章節也主要介紹這方面的內容。今天介紹熔斷部分,即開源產品 Sentinel 的核心能力。
問題定義
在一個常見的分布式應用中,一個請求先通過終端到達 Gateway,再經過防火墻和網絡負載均衡,其中還包括調用下游的其它服務和第三方應用,才能到達前端網絡服務;如下圖所示:
和這樣一個架構一樣,大家可能也會遇到如下的一些熟悉的 Case :
- 瞬間洪峰流量導致系統超出最大負載,load 飆高,系統崩潰導致無法正常提供服務;
- “黑馬”熱點數據擊穿緩存,DB 被打垮,擠占正常流量;
- 調用端被不穩定服務拖垮,線程池被占滿,導致整個調用鏈路卡死甚至系統雪崩;
- …
這些不穩定的場景可能會導致嚴重后果。大家可能想問:如何做到均勻平滑的用戶訪問?如何預防流量過大或服務不穩定帶來的影響?這時候我們就要請出微服務穩定性的法寶 —— 高可用流量防護,其中重要的手段就是流量控制和熔斷降級,它們是保障整個系統穩定性重要的一環。
1. 流量控制
流量是非常隨機性的、不可預測的。前一秒可能還風平浪靜,后一秒可能就出現流量洪峰了(例如 雙11 零點的場景)。然而我們系統的容量總是有限的,如果突然而來的流量超過了系統的承受能力,就可能會導致請求處理不過來,堆積的請求處理緩慢,CPU/Load 飆高,最后導致系統崩潰。因此,我們需要針對這種突發的流量來進行限制,在盡可能處理請求的同時來保障服務不被打垮,這就是流量控制。
2. 熔斷降級
一個服務常常會調用別的模塊,可能是另外的一個遠程服務、數據庫,或者第三方 API 等。例如,支付的時候,可能需要遠程調用銀聯提供的 API;查詢某個商品的價格,可能需要進行數據庫查詢。然而,這個被依賴服務的穩定性是不能保證的。如果依賴的服務出現了不穩定的情況,請求的響應時間變長,那么調用服務的方法的響應時間也會變長,線程會產生堆積,最終可能耗盡業務自身的線程池,服務本身也變得不可用。
Spring Cloud 中如何做熔斷?
在原來的 Spring Cloud 產品族中,有自帶的熔斷組件 Hystrix ,是 Netflix 公司提供的一個開源的組件,提供了熔斷、隔離、降級的這些特性,不過 Hystrix 在 2018 年 11 月份開始,就不再迭代開發,進入維護的模式。不過好消息是也就是這一年開源了 Spring Cloud for Alibaba 產品族,其中的 Sentinel 完美的對 Hystrix 做了補充,下面針對 Sentinel 做一些基本介紹。
Sentinel 工作原理
Sentinel 以資源流量(URL、線程、本地函數、Dubbo 服務等)為切入點,根據用戶輸入的規則,自適應的做到流量控制、熔斷降級、系統負載保護等多個維度,全方位的保障系統的穩定性。并提供了一套具備豐富的應用場景、完備的實時監控、廣泛的開源生態、完善靈活的 SPI 擴展點的完美的高可用解決方案產品,一個基本的原理介紹圖如下,詳細介紹請參考官方文檔。
在使用上,針對主流框架默認提供自動適配的能力來定義需要保護的資源,并提供設施對資源進行實時統計和調用鏈路分析。同時,Sentinel 也提供開放的接口,方便您自定義并改變規則。
快速使用 Sentinel 的方式
除了在開源提供的方案之外,Sentinel 已經以多種形態進入到了各種云產品的組合解決方案中,列舉如下:
1. 在 AHAS 中使用
Sentinel 現在已經是阿里云云產品 AHAS 的重要能力,使用方式請參考官方文檔,相比開源的方式接入,云產品主要省去了繁瑣的配置,提供了更快的接入方式,以及更友好的產品管控界面,以及更強大的能力;當然除此之外,最重要的是在接入和運行的過程中,都可以獲得原廠同學的直接的支持。
2. 在容器服務 Kubernetes 集群中使用
在容器服務中我們目前做到了純白屏和云原生的方式進行安裝,使用方式請參考官方文檔來安裝所需的 pilot,在集群中安裝完 pilot 之后,會自動選擇集群中打上了相應 AHAS 注解的 POD 進行 Sentinel Agent 的掛載,配置如下:
annotations:# 是否開啟 AHAS 應用流控插件, on、true 表示開啟, off、false表示關閉ahasPilotAutoEnable: "on"# 服務名稱,會顯示在 AHAS 控制臺上ahasAppName: "<your-service-name>"3. 在 EDAS 中使用
在 EDAS 中,如果選擇的是部署在容器服務 K8s 集群或 Serverless K8s 集群中的應用支持通過重新部署來接入 AHAS,并可在 EDAS 內嵌的監控頁面中實時監控流量規則,所有的配置能力都能通過一個控制臺白屏化操作完成,全面可視化地保障您的應用可用性,使用方式可以參考文檔。
結尾
本文簡單介紹了高可用流量防護的背景和手段,在熔斷的場景下,我們理解十年的積累打磨了高可用產品 AHAS 來為 Kubernetes Spring Cloud 應用保駕護航。除此之外,AHAS 高可用防護還提供以下能力:
- 針對不穩定弱依賴的熔斷降級能力,支持慢調用比例/異常比例策略,支持漸進式恢復策略;
- 機器維度的系統自適應保護,智能化調配系統流量;
- 全自動托管、高可用的集群流量控制;
- 針對 Nginx 網關及 Spring Cloud Gateway、Zuul 等 API Gateway 的網關流控;
- 針對 Istio/Envoy 集群的 Mesh 高可用防護。
需要注意的是,流控降級的配置是需要結合容量規劃、依賴梳理來做的。我們可以借助阿里云 PTS 等壓測工具對我們的服務進行全鏈路壓測,了解每個服務的最大承受能力,來確定流控和熔斷降級的閾值。同時,業務系統需要具備實時監控的能力,以便實時地根據流量情況做出相應的限流降級策略調整,我們下面的章節中將介紹這一利器。
相關文章推薦:
- 《SpringCloud 應用在 Kubernetes 上的最佳實踐 —— 開發篇》
- 《SpringCloud 應用在 Kubernetes 上的最佳實踐 — 部署篇(開發部署)》
- 《SpringCloud 應用在 Kubernetes 上的最佳實踐 — 部署篇(工具部署)》
- 《SpringCloud 應用在 Kubernetes 上的最佳實踐 — 線上發布(可灰度)》
- 《SpringCloud 應用在 Kubernetes 上的最佳實踐 — 診斷(線上聯調)》
- 《SpringCloud 應用在 Kubernetes 上的最佳實踐 — 線上發布(可監控)》
- 《SpringCloud 應用在 Kubernetes 上的最佳實踐 — 線上發布(可回滾)》
- 《SpringCloud 應用在 Kubernetes 上的最佳實踐 — 線上發布(優雅上下線)》
“阿里巴巴云原生關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦云原生流行技術趨勢、云原生大規模的落地實踐,做最懂云原生開發者的公眾號。”
總結
以上是生活随笔為你收集整理的SpringCloud 应用在 Kubernetes 上的最佳实践 — 高可用(熔断)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里巴巴成立云原生技术委员会,云原生升级
- 下一篇: Spring Cloud 应用在 Kub