javascript
gateway sentinel 熔断 不起作用_Spring Cloud Alibaba集训营第五天(服务熔断和限流)
前言:為什么需要流控降級
我們的生產(chǎn)環(huán)境經(jīng)常會出現(xiàn)一些不穩(wěn)定的情況,如:
- 大促時瞬間洪峰流量導致系統(tǒng)超出最大負載,load 飆高,系統(tǒng)崩潰導致用戶無法下單
- “黑馬”熱點商品擊穿緩存,DB 被打垮,擠占正常流量
- 調(diào)用端被不穩(wěn)定服務拖垮,線程池被占滿,導致整個調(diào)用鏈路卡死
這些不穩(wěn)定的場景可能會導致嚴重后果。大家可能想問:如何做到均勻平滑的用戶訪問?如何預防流量過大或服務不穩(wěn)定帶來的影響?這時候我們就要請出微服務穩(wěn)定性的法寶 —— 高可用流量防護,其中重要的手段就是流量控制和熔斷降級,它們是保障微服務穩(wěn)定性重要的一環(huán)。
為什么需要流量控制?
流量是非常隨機性的、不可預測的。前一秒可能還風平浪靜,后一秒可能就出現(xiàn)流量洪峰了(例如雙十一零點的場景)。然而我們系統(tǒng)的容量總是有限的,如果突然而來的流量超過了系統(tǒng)的承受能力,就可能會導致請求處理不過來,堆積的請求處理緩慢,CPU/Load 飆高,最后導致系統(tǒng)崩潰。因此,我們需要針對這種突發(fā)的流量來進行限制,在盡可能處理請求的同時來保障服務不被打垮,這就是流量控制。
為什么需要熔斷降級?
一個服務常常會調(diào)用別的模塊,可能是另外的一個遠程服務、數(shù)據(jù)庫,或者第三方 API 等。例如,支付的時候,可能需要遠程調(diào)用銀聯(lián)提供的 API;查詢某個商品的價格,可能需要進行數(shù)據(jù)庫查詢。然而,這個被依賴服務的穩(wěn)定性是不能保證的。如果依賴的服務出現(xiàn)了不穩(wěn)定的情況,請求的響應時間變長,那么調(diào)用服務的方法的響應時間也會變長,線程會產(chǎn)生堆積,最終可能耗盡業(yè)務自身的線程池,服務本身也變得不可用。
現(xiàn)代微服務架構(gòu)都是分布式的,由非常多的服務組成。不同服務之間相互調(diào)用,組成復雜的調(diào)用鏈路。以上的問題在鏈路調(diào)用中會產(chǎn)生放大的效果。復雜鏈路上的某一環(huán)不穩(wěn)定,就可能會層層級聯(lián),最終導致整個鏈路都不可用。因此我們需要對不穩(wěn)定的弱依賴服務進行熔斷降級,暫時切斷不穩(wěn)定調(diào)用,避免局部不穩(wěn)定因素導致整體的雪崩。
Sentinel: 高可用護航的利器
Sentinel 是阿里巴巴開源的,面向分布式服務架構(gòu)的高可用防護組件,主要以流量為切入點,從流量控制、流量整形、熔斷降級、系統(tǒng)自適應保護、熱點防護等多個維度來幫助開發(fā)者保障微服務的穩(wěn)定性。Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺、冷啟動、消息削峰填谷、自適應流量控制、實時熔斷下游不可用服務等,是保障微服務高可用的利器,原生支持 Java/Go/C++ 等多種語言,并且提供 Istio/Envoy 全局流控支持來為 Service Mesh 提供高可用防護的能力。
Sentinel 的技術(shù)亮點:
- 高度可擴展能力:基礎核心 + SPI 接口擴展能力,用戶可以方便地擴展流控、通信、監(jiān)控等功能
- 多樣化的流量控制策略(資源粒度、調(diào)用關系、流控指標、流控效果等多個維度),提供分布式集群流控的能力
- 熱點流量探測和防護
- 對不穩(wěn)定服務進行熔斷降級和隔離
- 全局維度的系統(tǒng)負載自適應保護,根據(jù)系統(tǒng)水位實時調(diào)節(jié)流量
- 覆蓋 API Gateway 場景,為 Spring Cloud Gateway、Zuul 提供網(wǎng)關流量控制的能力
- 實時監(jiān)控和規(guī)則動態(tài)配置管理能力
一些普遍的使用場景:
- 在服務提供方(Service Provider)的場景下,我們需要保護服務提供方自身不被流量洪峰打垮。這時候通常根據(jù)服務提供方的服務能力進行流量控制,或針對特定的服務調(diào)用方進行限制。我們可以結(jié)合前期壓測評估核心接口的承受能力,配置 QPS 模式的限流,當每秒的請求量超過設定的閾值時,會自動拒絕多余的請求。
- 為了避免調(diào)用其他服務時被不穩(wěn)定的服務拖垮自身,我們需要在服務調(diào)用端(Service Consumer)對不穩(wěn)定服務依賴進行隔離和熔斷。手段包括信號量隔離、異常比例降級、RT 降級等多種手段。
- 當系統(tǒng)長期處于低水位的情況下,流量突然增加時,直接把系統(tǒng)拉升到高水位可能瞬間把系統(tǒng)壓垮。這時候我們可以借助 Sentinel 的 WarmUp 流控模式控制通過的流量緩慢增加,在一定時間內(nèi)逐漸增加到閾值上限,而不是在一瞬間全部放行。這樣可以給冷系統(tǒng)一個預熱的時間,避免冷系統(tǒng)被壓垮。
- 利用 Sentinel 的勻速排隊模式進行“削峰填谷”,把請求突刺均攤到一段時間內(nèi),讓系統(tǒng)負載保持在請求處理水位之內(nèi),同時盡可能地處理更多請求。
- 利用 Sentinel 的網(wǎng)關流控特性,在網(wǎng)關入口處進行流量防護,或限制 API 的調(diào)用頻率。
Sentinel 有著豐富的開源生態(tài)。Sentinel 開源不久就被納入 CNCF Landscape 版圖,并且也成為 Spring Cloud 官方推薦的流控降級組件之一。社區(qū)提供 Spring Cloud、Dubbo、gRPC、Quarkus 等常用微服務框架的適配,開箱即用;同時支持 Reactive 生態(tài),支持 Reactor、Spring WebFlux 異步響應式架構(gòu)。Sentinel 也在逐漸覆蓋 API Gateway 和 Service Mesh 場景,在云原生架構(gòu)中發(fā)揮更大的作用。
在原來的 Spring Cloud Netflix 系列中,有自帶的熔斷組件 Hystrix ,是 Netflix 公司提供的一個開源的組件,提供了熔斷、隔離的這些特性,不過 Hystrix 在 2018 年 11 月份開始,就不再迭代開發(fā),進入維護的模式。同年開源的 Spring Cloud Alibaba(SCA) 提供了一站式的解決方案,默認為 Sentinel 整合了 Spring Web、RestTemplate、FeignClient 和 Spring WebFlux。Sentinel 在 Spring Cloud 生態(tài)中,不僅補全了 Hystrix 在 Servlet、RestTemplate 和 API Gateway 這一塊的空白,而且還完全兼容了 Hystrix 在 FeignClient 中限流降級的用法,并且支持運行時靈活地配置和調(diào)整限流降級規(guī)則。同時 SCA 還集成了 Sentinel 提供的 API gateway 流控模塊,可以無縫支持 Spring Cloud Gateway 和 Zuul 網(wǎng)關的流控降級。
Spring Cloud Alibaba Sentinel 服務限流/熔斷實戰(zhàn)
下面到了動手時間了!
我們已經(jīng)將案例代碼集成在沙箱中,通過點擊鏈接直接訪問。
我們結(jié)合一個實例來對 Spring Cloud 服務限流/熔斷進行實戰(zhàn)。我們的實例項目由四個模塊構(gòu)成:
- service-api: 服務接口定義,供 consumer/provider 引用
- dubbo-provider: Dubbo 服務端,對外提供一些服務
- web-api-demo: Spring Boot Web 應用,其中的一些 API 會作為 consumer 來調(diào)用 dubbo-provider 獲取結(jié)果。里面一共定義了三個 API path:
- /demo/hello: 接受一個 name 參數(shù),會 RPC 調(diào)用后端的 FooService:sayHello(name) 方法。
- /demo/time:調(diào)用后端的 FooService:getCurrentTime 方法獲取當前時間;里面可以通過 slow 請求參數(shù)模擬慢調(diào)用。
- /demo/bonjour/{name}: 直接調(diào)用本地 DemoService 服務。
- demo-gateway: Spring Cloud Gateway 網(wǎng)關,作為整個項目的訪問入口,將流量轉(zhuǎn)發(fā)至后端服務或第三方服務。我們的入口 URL 訪問都會經(jīng)過該 API gateway。demo-gateway 的路由配置如下:
這個路由配置包含兩個路由:
- foo-service-route: 會將 /demo/ 開頭的訪問路由到 localhost:9669 后端服務上面,即對應我們的 Web 服務。我們訪問示例中的 API 都會經(jīng)過這個路由,比如 localhost:8090/demo/time。
- httpbin-route: 這是一個示例路由,它會將 /httpbin/ 開頭的訪問路由到 https://httpbin.org 這個示例網(wǎng)站上,比如 localhost:8090/httpbin/json 實際會映射到 https://httpbin.org/json 上面。
同時我們的環(huán)境也包含啟動好的 Sentinel 控制臺,可以直接訪問并供各個服務接入。對應的地址:http://139.196.203.133:8080
下面我們來一步一步操作接入 SCA Sentinel 并通過控制臺/Nacos 動態(tài)數(shù)據(jù)源配置流控降級規(guī)則來驗證效果。
spring-cloud-alibaba-dependencies 配置
首先第一步我們在項目的父 pom 里面導入最新版本的 spring-cloud-alibaba-dependencies,這樣我們在實際引入 SCA 相關依賴的時候就不需要指定版本號了:
<dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.2.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies> </dependencyManagement>服務接入 SCA Sentinel
首先我們分別為三個服務模塊引入 Spring Cloud Alibaba Sentinel 依賴:
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>starter 會自動對 Sentinel 的適配模塊進行配置,只需要簡單的配置即可快速接入 Sentinel 并連接到 Sentinel 控制臺。
對于 Dubbo 服務,我們還需要額外引入 Dubbo 的適配模塊。Sentinel 為 Apache Dubbo 提供開箱即用的整合模塊,僅需引入 sentinel-apache-dubbo-adapter 依賴即可接入 Dubbo 自動埋點統(tǒng)計(支持 provider 和 consumer):
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-apache-dubbo-adapter</artifactId><version>1.8.0</version> </dependency>我們在 web-api-demo 和 dubbo-provider 兩個應用的 pom 文件添加 adapter 依賴,這樣兩個應用的 Dubbo consumer/provider 接口就可以自動被 Sentinel 統(tǒng)計。
對于 Spring Cloud Gateway、Zuul 1.x 等網(wǎng)關,我們還需要在上面 SCA 依賴的基礎上額外引入 spring-cloud-alibaba-sentinel-gateway 依賴:
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId> </dependency>這個依賴會自動為網(wǎng)關添加 Sentinel 相關的配置,從而可以讓 API gateway 自動接入 Sentinel。我們在 demo-gateway 應用的 pom 文件里面添加這個依賴,這樣我們的 gateway 應用就可以接入 Sentinel 了。
引入依賴之后,我們只需要進行簡單的配置即可快速接入 Sentinel 控制臺。我們可以在 application.properties 文件里面配置應用名和連接控制臺的地址,以 web-api-demo 為例:
spring.application.name=foo-web spring.cloud.sentinel.transport.dashboard=localhost:8080其中 spring.application.name 相信大家都比較熟悉了,這里 Spring Cloud Alibaba Sentinel 會自動提取這個值作為接入應用的 appName。同時我們通過 spring.cloud.sentinel.transport.dashboard 來配置要連接的控制臺地址和端口。
完成以上的配置后,我們可以依次啟動 dubbo-provider、web-api-demo 和 demo-gateway 應用,并通過網(wǎng)關入口訪問 localhost:8090/demo/time 獲取當前時間。觸發(fā)服務后,我們稍后可以在 Sentinel 控制臺看到我們的三個應用,可以在監(jiān)控頁面看到訪問信息,代表接入成功。
我們可以在每個應用的簇點鏈路頁面看到當前應用的一些埋點調(diào)用,比如 Web 應用可以看到 Web URL 和 Dubbo consumer 調(diào)用:
流控規(guī)則
下面我們來配一條最簡單的流控規(guī)則。在 Dubbo provider 端,我們進入簇點鏈路頁面,針對 com.alibaba.csp.sentinel.demo.dubbo.FooService:getCurrentTime(boolean) 這個服務調(diào)用配置限流規(guī)則(需要有過訪問量才能看到)。我們配一條 QPS 為 1 的流控規(guī)則,這代表針對該服務方法的調(diào)用每秒鐘不能超過 1 次,超出會直接拒絕。
點擊“新增”按鈕,成功添加規(guī)則。我們可以在瀏覽器反復請求 localhost:8090/demo/time(頻率不要太慢),可以看到會出現(xiàn)限流異常信息(Dubbo provider 默認的限流處理邏輯是拋出異常,該異常信息由 Dubbo 直接返回,并由 Spring 展示為默認 error 頁面):
同時我們也可以在“實時監(jiān)控”頁面看到實時的訪問量和拒絕量:
我們同樣也可以在 Web API 處配置限流規(guī)則,觀察效果。Spring Web 默認的限流處理邏輯是返回默認的提示信息(Blocked by Sentinel),狀態(tài)碼為 429。在后面的章節(jié)我們會介紹如何自定義流控處理邏輯。
了解了限流的基本用法,大家可能想問:生產(chǎn)環(huán)境我需要針對每個接口都去配置流控規(guī)則嗎?閾值不會配怎么辦?其實,限流降級的配置是需要結(jié)合容量規(guī)劃、依賴梳理來做的。我們可以借助 JMeter 或 阿里云 PTS 等壓測工具對我們的服務進行全鏈路壓測,了解每個服務的最大承受能力,來確定核心接口的最大容量并作為 QPS 閾值。
網(wǎng)關流控規(guī)則
Sentinel 對 API Gateway 流控的場景進行了定制,支持針對網(wǎng)關的路由(如上面 gateway 定義的 foo-service-route)或自定義的 API 分組進行流控,支持針對請求屬性(如某個 header)進行流控。用戶可以在 Sentinel 控制臺 自定義 API 分組,可以看做是一些 URL 匹配的組合。比如我們可以定義一個 API 叫 my_api,請求 path 模式為 /foo/** 和 /baz/** 的都歸到 my_api 這個 API 分組下面。限流的時候可以針對這個自定義的 API 分組維度進行限流。
下面我們在控制臺針對 gateway 配置一條網(wǎng)關流控規(guī)則。我們可以看到 API Gateway 的控制臺頁面與普通應用的頁面有一些差異,這些就是針對網(wǎng)關場景的定制。Sentinel 網(wǎng)關流控規(guī)則支持提取某個 route 的請求屬性,包括 remote IP、header、URL 參數(shù)、cookie 等,支持自動統(tǒng)計其中的熱點值并分別進行限制,也支持針對某個具體值進行限制(比如給某個 uid 限量)。
我們給 foo-service-route 這個路由配一條針對請求屬性的網(wǎng)關流控規(guī)則。這條規(guī)則會針對 URL 參數(shù)中提取出來的每個熱點 uid 參數(shù)分別進行限制,每分鐘的請求量最多允許 2 次。
保存規(guī)則后,我們可以構(gòu)造一些向后端服務的請求,攜帶上不同的 uid 參數(shù)(即使沒有用到),比如 localhost:8090/demo/time?uid=xxx。我們可以觀察到,每個 uid 的訪問每分鐘超出兩次后會出現(xiàn)限流頁面。
關于 Sentinel 網(wǎng)關流控的詳細配置指南和實現(xiàn)原理請參考 網(wǎng)關流控文檔。
熔斷降級規(guī)則
熔斷降級通常用于自動切斷不穩(wěn)定的服務,防止調(diào)用方被拖垮導致級聯(lián)故障。熔斷降級規(guī)則通常在調(diào)用端,針對弱依賴調(diào)用進行配置,在熔斷時返回預定義好的 fallback 值,這樣可以保證核心鏈路不被不穩(wěn)定的旁路影響。
Sentinel 提供以下幾種熔斷策略:
- 慢調(diào)用比例 (SLOW_REQUEST_RATIO):選擇以慢調(diào)用比例作為閾值,需要設置允許的慢調(diào)用 RT(即最大的響應時間),請求的響應時間大于該值則統(tǒng)計為慢調(diào)用。當單位統(tǒng)計時長(statIntervalMs,默認為 1s)內(nèi)請求數(shù)目大于設置的最小請求數(shù)目,并且慢調(diào)用的比例大于閾值,則接下來的熔斷時長內(nèi)請求會自動被熔斷。經(jīng)過熔斷時長后熔斷器會進入探測恢復狀態(tài)(HALF-OPEN 狀態(tài)),若接下來的一個請求響應時間小于設置的慢調(diào)用 RT 則結(jié)束熔斷,若大于設置的慢調(diào)用 RT 則會再次被熔斷。
- 異常比例 (ERROR_RATIO):當單位統(tǒng)計時長內(nèi)請求數(shù)目大于設置的最小請求數(shù)目,并且異常的比例大于閾值,則接下來的熔斷時長內(nèi)請求會自動被熔斷。經(jīng)過熔斷時長后熔斷器會進入探測恢復狀態(tài)(HALF-OPEN 狀態(tài)),若接下來的一個請求成功完成(沒有錯誤)則結(jié)束熔斷,否則會再次被熔斷。異常比率的閾值范圍是 [0.0, 1.0],代表 0% - 100%。
- 異常數(shù) (ERROR_COUNT):當單位統(tǒng)計時長內(nèi)的異常數(shù)目超過閾值之后會自動進行熔斷。經(jīng)過熔斷時長后熔斷器會進入探測恢復狀態(tài)(HALF-OPEN 狀態(tài)),若接下來的一個請求成功完成(沒有錯誤)則結(jié)束熔斷,否則會再次被熔斷。
下面我們來在 Web 應用中針對 Dubbo consumer 來配置慢調(diào)用熔斷規(guī)則,并模擬慢調(diào)用來觀察效果。我們在 web-api-demo 中針對 com.alibaba.csp.sentinel.demo.dubbo.FooService 服務調(diào)用配置熔斷降級規(guī)則。
控制臺配置的統(tǒng)計時長默認為 1s。在上面的這條規(guī)則中,我們設定慢調(diào)用臨界值為 50ms,響應時間超出 50ms 即記為慢調(diào)用。當統(tǒng)計時長內(nèi)的請求數(shù) >=5 且慢調(diào)用的比例超出我們配置的閾值(80%)就會觸發(fā)熔斷,熔斷時長為 5s,經(jīng)過熔斷時長后會允許一個請求探測通過,若請求正常則恢復,否則繼續(xù)熔斷。
我們的實例中 /demo/time API 可以通過 slow 請求參數(shù)模擬慢調(diào)用,當 slow=true 時該請求耗時會超過 100ms。我們可以用 ab 等壓測工具或腳本,批量請求 localhost:8090/demo/time?slow=true,可以觀察到熔斷的返回
如果我們一直模擬慢調(diào)用,我們可以觀察到熔斷后每 5s 會允許通過一個請求,但該請求仍然是慢調(diào)用,會重新打回熔斷,無法恢復。我們可以在觸發(fā)熔斷后,等待一段時間后手動發(fā)一個不帶 slow=true 的正常請求,然后再進行請求,可以觀察到熔斷恢復。
需要注意的是,即使服務調(diào)用方引入了熔斷降級機制,我們還是需要在 HTTP 或 RPC 客戶端配置請求超時時間,來做一個兜底的防護。
注解方式自定義埋點
剛才我們看到的埋點都是 Sentinel 適配模塊提供的自動埋點。有的時候自動埋點可能沒法滿足我們的需求,我們希望在某個業(yè)務邏輯的位置進行限流,能不能做到呢?當然可以!Sentinel 提供兩種方式進行自定義埋點:SphU API 和 @SentinelResource 注解,前者最為通用但是代碼比較繁雜,耦合度較高;注解方式侵入性較低,但有使用場景的限制。這里我們來動手在 Web 應用的 DemoService 上添加注解,來達到針對本地服務埋點的目標。
在 DemoService 中我們實現(xiàn)了一個簡單的打招呼的服務:
@Service public class DemoService {public String bonjour(String name) {return "Bonjour, " + name;} }下面我們給 bonjour 這個函數(shù)添加 @SentinelResource 注解,注解的 value 代表這個埋點的名稱(resourceName),會顯示在簇點鏈路/監(jiān)控頁面。
@SentinelResource(value = "DemoService#bonjour") public String bonjour(String name)加上該注解后,再通過網(wǎng)關訪問 /demo/bonjour/{name} 這個 API 的時候,我們就可以在簇點鏈路頁面看到我們自定義的 DemoService#bonjour 埋點了。
添加注解埋點只是第一步。一般在生產(chǎn)環(huán)境中,我們希望在這些自定義埋點發(fā)生限流的時候,有一些 fallback 邏輯,而不是直接對外拋出異常。這里我們可以寫一個 fallback 函數(shù):
public String bonjourFallback(Throwable t) {if (BlockException.isBlockException(t)) {return "Blocked by Sentinel: " + t.getClass().getSimpleName();}return "Oops, failed: " + t.getClass().getCanonicalName(); }我們的 fallback 函數(shù)接受一個 Throwable 參數(shù),可以從中獲取異常信息。Sentinel 注解的 fallback 會捕獲業(yè)務異常和流控異常(即 BlockException 及其子類),我們可以在 fallback 邏輯里面進行相應的處理(如日志記錄),并返回 fallback 的值。
注意:Sentinel 注解對 fallback 和 blockHandler 函數(shù)的方法簽名有要求,具體請參考此處文檔。寫好 fallback 函數(shù)的實現(xiàn)后,我們在 @SentinelResource 注解里面指定一下:
@SentinelResource(value = "DemoService#bonjour", defaultFallback = "bonjourFallback") public String bonjour(String name)這樣當我們自定義的 DemoService#bonjour 資源被限流或熔斷的時候,請求會走到 fallback 的邏輯中,返回 fallback 結(jié)果,而不會直接拋出異常。我們可以配一個 QPS=1 的限流規(guī)則,然后快速請求后觀察返回值:
? ~ curl http://localhost:8090/demo/bonjour/Sentinel Bonjour, Sentinel ? ~ curl http://localhost:8090/demo/bonjour/Sentinel Blocked by Sentinel: FlowException注意:使用 @SentinelResource 注解要求對應的類必須由 Spring 托管(即為 Spring bean),并且不能是內(nèi)部調(diào)用(沒法走到代理),不能是 private 方法。Sentinel 注解生效依賴 Spring AOP 動態(tài)代理機制。配置自定義的流控處理邏輯
Sentinel 的各種適配方式均支持自定義的流控處理邏輯。以 Spring Web 適配為例,我們只需要提供自定義的 BlockExceptionHandler 實現(xiàn)并注冊為 bean 即可為 Web 埋點提供自定義處理邏輯。其中 BlockExceptionHandler 的定義如下:
public interface BlockExceptionHandler {// 在此處處理限流異常,可以跳轉(zhuǎn)到指定頁面或返回指定的內(nèi)容void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception; }我們的 Web 應用中提供了 Web 埋點自定義流控處理邏輯的示例:
@Configuration public class SentinelWebConfig {@Beanpublic BlockExceptionHandler sentinelBlockExceptionHandler() {return (request, response, e) -> {// 429 Too Many Requestsresponse.setStatus(429);PrintWriter out = response.getWriter();out.print("Oops, blocked by Sentinel: " + e.getClass().getSimpleName());out.flush();out.close();};} }該 handler 會獲取流控類型并打印返回信息,返回狀態(tài)碼為 429。我們可以根據(jù)實際的業(yè)務需求,配置跳轉(zhuǎn)或自定義的返回信息。
對于注解方式,我們上一節(jié)已經(jīng)提到,可以指定 fallback 函數(shù)來處理流控異常和業(yè)務異常,這里不再展開講解;對于 Dubbo 適配,我們可以通過 DubboAdapterGlobalConfig 注冊 provider/consumer fallback 來提供自定義的流控處理邏輯;對于 Spring Cloud Gateway 適配,我們可以注冊自定義的 BlockRequestHandler 實現(xiàn)類來為網(wǎng)關流控注冊自定義的處理邏輯。
對 Spring Cloud 其他組件的支持
Spring Cloud Alibaba Sentinel 還提供對 Spring Cloud 其它常用組件的支持,包括 RestTemplate、Feign 等。篇幅所限,我們不展開實踐。大家可以參考 Spring Cloud Alibaba 文檔 來進行接入和配置。
如何選擇流控降級組件
講到這里,大家可能會有疑問:Sentinel 和其它同類產(chǎn)品(如 Hystrix)相比有什么優(yōu)缺點?是否有必要遷移到 Sentinel?如何快速遷移?以下是 Sentinel 與其它 fault-tolerance 組件的對比:
總結(jié)
通過本教程,我們了解了流控降級作為高可用防護手段的重要性,了解了 Sentinel 的核心特性和原理,并通過動手實踐學習了如何快速接入 SCA Sentinel 來為微服務進行流控降級。Sentinel 還有著非常多的高級特性等著大家去發(fā)掘,如熱點防護、集群流控等,大家可以參考 Sentinel 官方文檔來了解更多的特性和場景。
那么是不是服務的量級很小就不用進行限流防護了呢?是不是微服務的架構(gòu)比較簡單就不用引入熔斷保護機制了呢?其實,這與請求的量級、架構(gòu)的復雜程度無關。很多時候,可能正是一個非常邊緣的服務出現(xiàn)故障而導致整體業(yè)務受影響,造成巨大損失。我們需要具有面向失敗設計的意識,在平時就做好容量規(guī)劃和強弱依賴的梳理,合理地配置流控降級規(guī)則,做好事前防護,而不是在線上出現(xiàn)問題以后再進行補救。
同時,我們也在阿里云上提供了 Sentinel 的企業(yè)版本 AHAS Sentinel,提供開箱即用的企業(yè)級高可用防護能力。與開源版本相比,AHAS 還提供以下的專業(yè)能力:
- 可靠的實時監(jiān)控和歷史秒級監(jiān)控數(shù)據(jù)查詢,包含接口維度的 QPS、響應時間及系統(tǒng) load、CPU 使用率等指標,支持按照調(diào)用類型分類,支持同比/環(huán)比展示
- Top K 接口監(jiān)控統(tǒng)計,快速了解系統(tǒng)的慢調(diào)用和大流量接口;熱力圖概覽,快速定位不穩(wěn)定的機器
- Java Agent 方式/K8s Java 應用零侵入快速接入,支持近 20 種主流框架和 API Gateway
- 全自動托管、高可用的集群流量控制
- Nginx 流量控制,支持規(guī)則動態(tài)配置、集群流控
總結(jié)
以上是生活随笔為你收集整理的gateway sentinel 熔断 不起作用_Spring Cloud Alibaba集训营第五天(服务熔断和限流)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 区块链技术的主要特征是什么
- 下一篇: luci L大_“大众”果然没失望,空间