天天看點

SpringCloud 應用在 Kubernetes 上的最佳實踐 — 高可用(熔斷)前言問題定義Spring Cloud 中如何做熔斷?快速使用 Sentinel 的方式結尾

SpringCloud 應用在 Kubernetes 上的最佳實踐 — 高可用(熔斷)前言問題定義Spring Cloud 中如何做熔斷?快速使用 Sentinel 的方式結尾

作者 | 宿何

導讀:前幾篇我們主要站在應用釋出的場景,描述在釋出過程中會遇到的灰階、監控、復原、優雅上下線等保障釋出能順利進行的注意事項。作為一個程式員 GG,可灰階的釋出順利上線往往意味着準點下班。而我們今天要分享的内容則關系到我們能否擁有一個高品質的休息時間,即線上的高可用保障。

前言

阿裡巴巴十多年的 雙11,錘煉出來了一套業界領先的高可用技術,有一些已經商業化(雲産品 PTS、AHAS),也有的開源了如:Sentinel、ChaosBlade。我們這一系列的高可用章節也主要介紹這方面的内容。今天介紹熔斷部分,即開源産品 Sentinel 的核心能力。

問題定義

在一個常見的分布式應用中,一個請求先通過終端到達 Gateway,再經過防火牆和網絡負載均衡,其中還包括調用下遊的其它服務和第三方應用,才能到達前端網絡服務;如下圖所示:

SpringCloud 應用在 Kubernetes 上的最佳實踐 — 高可用(熔斷)前言問題定義Spring Cloud 中如何做熔斷?快速使用 Sentinel 的方式結尾

和這樣一個架構一樣,大家可能也會遇到如下的一些熟悉的 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

等壓測工具對我們的服務進行全鍊路壓測,了解每個服務的最大承受能力,來确定流控和熔斷降級的門檻值。同時,業務系統需要具備實時監控的能力,以便實時地根據流量情況做出相應的限流降級政策調整,我們下面的章節中将介紹這一利器。

相關文章推薦:

阿裡巴巴雲原生 關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,做最懂雲原生開發者的公衆号。”