開發與維運

SpringCloud 應用在 Kubernetes 上的最佳實踐 — 高可用(熔斷)

前言

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

問題定義

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

1.png

和這樣一個架構一樣,大家可能也會遇到如下的一些熟悉的 Case :

  • 瞬間洪峰流量導致系統超出最大負載,load 飆高,系統崩潰導致無法正常提供服務。
  • “黑馬”熱點數據擊穿緩存,DB 被打垮,擠佔正常流量。
  • 調用端被不穩定服務拖垮,線程池被佔滿,導致整個調用鏈路卡死甚至系統雪崩
  • ......

這些不穩定的場景可能會導致嚴重後果。大家可能想問:如何做到均勻平滑的用戶訪問?如何預防流量過大或服務不穩定帶來的影響?這時候我們就要請出微服務穩定性的法寶 —— 高可用流量防護,其中重要的手段就是流量控制和熔斷降級,它們是保障整個系統穩定性重要的一環。

流量控制

流量是非常隨機性的、不可預測的。前一秒可能還風平浪靜,後一秒可能就出現流量洪峰了(例如雙十一零點的場景)。然而我們系統的容量總是有限的,如果突然而來的流量超過了系統的承受能力,就可能會導致請求處理不過來,堆積的請求處理緩慢,CPU/Load 飆高,最後導致系統崩潰。因此,我們需要針對這種突發的流量來進行限制,在儘可能處理請求的同時來保障服務不被打垮,這就是流量控制。

2.png

熔斷降級

一個服務常常會調用別的模塊,可能是另外的一個遠程服務、數據庫,或者第三方 API 等。例如,支付的時候,可能需要遠程調用銀聯提供的 API;查詢某個商品的價格,可能需要進行數據庫查詢。然而,這個被依賴服務的穩定性是不能保證的。如果依賴的服務出現了不穩定的情況,請求的響應時間變長,那麼調用服務的方法的響應時間也會變長,線程會產生堆積,最終可能耗盡業務自身的線程池,服務本身也變得不可用。

3.png

Spring Cloud 中如何做熔斷?

在原來的 Spring Cloud 產品族中,有自帶的熔斷組件 Hystrix ,是 Netflix 公司提供的一個開源的組件,提供了熔斷、隔離、降級的這些特性,不過 Hystrix 在 2018 年 11 月份開始,就不再迭代開發,進入維護的模式。不過好消息是也就是這一年開源了 Spring Cloud for Alibaba 產品族,其中的 Sentinel 完美的對 Hystrix 做了補充,下面針對 Sentinel 做一些基本介紹。

Sentinel 工作原理?

Sentinel 以資源流量(URL、線程、本地函數、Dubbo服務等)為切入點,根據用戶輸入的規則,自適應的做到流量控制、熔斷降級、系統負載保護等多個維度,全方位的保障系統的穩定性。並提供了一套具備豐富的應用場景、完備的實時監控、廣泛的開源生態、完善靈活的 SPI 擴展點的完美的高可用解決方案產品,一個基本的原理介紹圖如下,詳細介紹請參考官方文檔

4.png

在使用上,針對主流框架默認提供自動適配的能力來定義需要保護的資源,並提供設施對資源進行實時統計和調用鏈路分析。同時,Sentinel 也提供開放的接口,方便您自定義並改變規則。

快速使用 Sentinel 的方式

除了在開源提供的方案之外,Sentinel 已經以多種形態進入到了各種雲產品的組合解決方案中,列舉如下:

一、在 AHAS 中使用

Sentinel 現在已經是阿里云云產品 AHAS 的重要能力,使用方式請參考官方文檔,相比開源的方式接入,雲產品主要省去了繁瑣的配置,提供了更快的接入方式,以及更友好的產品管控界面,以及更強大的能力;當然除此之外,最重要的是在接入和運行的過程中,都可以獲得原廠同學的直接的支持。

二、在容器服務 Kubernetes 集群中使用

在容器服務中我們目前做到了純白屏和雲原生的方式進行安裝,使用方式請參考官方文檔來安裝所需的 pilot,在集群中安裝完 pilot 之後,會自動選擇集群中打上了相應 AHAS 註解的 POD 進行 Sentinel Agent 的掛載,配置如下:

annotations:
  # 是否開啟 AHAS 應用流控插件, on、true 表示開啟, off、false表示關閉
  ahasPilotAutoEnable: "on"
  # 服務名稱,會顯示在 AHAS 控制檯上
  ahasAppName: "<your-service-name>"

三、在 EDAS 中使用

在 EDAS 中,如果選擇的是部署在容器服務K8s集群或 Serverless K8s 集群中的應用支持通過重新部署來接入AHAS,並可在EDAS內嵌的監控頁面中實時監控流量規則,所有的配置能力都能通過一個控制檯白屏化操作完成,全面可視化地保障您的應用可用性,使用方式可以參考文檔

結尾

本文簡單介紹了高可用流量防護的背景和手段,在熔斷的場景下,我們理解十年的積累打磨了高可用產品 AHAS 來為 Kubernetes Spring Cloud 應用保駕護航。除此之外,AHAS 高可用防護還提供以下能力:

  • 針對不穩定弱依賴的熔斷降級能力,支持慢調用比例/異常比例策略,支持漸進式恢復策略。
  • 機器維度的系統自適應保護,智能化調配系統流量
  • 全自動託管、高可用的集群流量控制
  • 針對 Nginx 網關及 Spring Cloud Gateway、Zuul 等 API Gateway 的網關流控
  • 針對 Istio/Envoy 集群的 Mesh 高可用防護

    需要注意的是,流控降級的配置是需要結合容量規劃、依賴梳理來做的。我們可以藉助阿里雲 PTS 等壓測工具對我們的服務進行全鏈路壓測,瞭解每個服務的最大承受能力,來確定流控和熔斷降級的閾值。同時,業務系統需要具備實時監控的能力,以便實時地根據流量情況做出相應的限流降級策略調整,我們下面的章節中將介紹這一利器。

Leave a Reply

Your email address will not be published. Required fields are marked *