天天看點

《SpringCloud Alibaba 微服務架構》專題(十三)-Spring Cloud Alibaba之Sentinel服務降級

目錄

  • ​​1.引言​​
  • ​​2.熔斷政策​​
  • ​​3.熔斷降級政策之RT​​
  • ​​4.熔斷降級政策之異常比例​​
  • ​​5.熔斷降級政策之異常數​​

1.引言

除了流量控制以外,對調用鍊路中不穩定的資源進行熔斷降級也是保障高可用的重要措施之一。一個服務常常會調用别的子產品,可能是另外的一個遠端服務、資料庫,或者第三方 API 等。例如,支付的時候,可能需要遠端調用銀聯提供的 API;查詢某個商品的價格,可能需要進行資料庫查詢。然而,這個被依賴服務的穩定性是不能保證的。如果依賴的服務出現了不穩定的情況,請求的響應時間變長,那麼調用服務的方法的響應時間也會變長,線程會産生堆積,最終可能耗盡業務自身的線程池,服務本身也變得不可用。

《SpringCloud Alibaba 微服務架構》專題(十三)-Spring Cloud Alibaba之Sentinel服務降級

現代微服務架構都是分布式的,由非常多的服務組成。不同服務之間互相調用,組成複雜的調用鍊路。以上的問題在鍊路調用中會産生放大的效果。複雜鍊路上的某一環不穩定,就可能會層層級聯,最終導緻整個鍊路都不可用。

是以我們需要對不穩定的弱依賴服務調用進行熔斷降級,暫時切斷不穩定調用,避免局部不穩定因素導緻整體的雪崩。熔斷降級作為保護自身的手段,通常在用戶端(調用端)進行配置。

2.熔斷政策

  • 慢調用比例 (SLOW_REQUEST_RATIO):選擇以慢調用比例作為門檻值,需要設定允許的慢調用​

    ​RT​

    ​(即最大的響應時間),請求的響應時間大于該值則統計為慢調用。當機關統計時長(statIntervalMs)内請求數目大于設定的最小請求數目,并且慢調用的比例大于門檻值,則接下來的熔斷時長内請求會自動被熔斷。經過熔斷時長後熔斷器會進入探測恢複狀态(HALF-OPEN 狀态),若接下來的一個請求響應時間小于設定的慢調用 RT 則結束熔斷,若大于設定的慢調用 RT 則會再次被熔斷。
  • 異常比例 (ERROR_RATIO):當機關統計時長(statIntervalMs)内請求數目大于設定的最小請求數目,并且異常的比例大于門檻值,則接下來的熔斷時長内請求會自動被熔斷。經過熔斷時長後熔斷器會進入探測恢複狀态(HALF-OPEN 狀态),若接下來的一個請求成功完成(沒有錯誤)則結束熔斷,否則會再次被熔斷。異常比率的門檻值範圍是 [0.0, 1.0],代表 0% - 100%。
  • 異常數 (ERROR_COUNT):當機關統計時長内的異常數目超過門檻值之後會自動進行熔斷。經過熔斷時長後熔斷器會進入探測恢複狀态(HALF-OPEN 狀态),若接下來的一個請求成功完成(沒有錯誤)則結束熔斷,否則會再次被熔斷。

異常降級僅針對業務異常,對 Sentinel 限流降級本身的異常(BlockException)不生效。

注意:以上是針對 Sentinel 1.8.0 及以上版本。1.8.0 版本對熔斷降級特性進行了全新的改進更新,由于我們使用的是1.7.0版本,是以可能稍微有一點點差別,比如1.7.0版本RT政策最小請求數目不支援設定,預設為5個請求等,這些在新版本都可以進行設定,更加靈活。

Sentinel熔斷降級會在調用鍊路中某個資源出現不穩當狀态時(例如調用逾時或者異常比例升高),對這個資源的調用進行限制,讓請求快速失敗,避免影響到其他的資源而導緻級聯錯誤。

當資源被降級後, 在接下來的降級時間視窗之内,對該資源的調用都會自動熔斷(預設行為是抛出​

​DegradeException​

​)。

3.熔斷降級政策之RT

【a】業務層新增如下方法

package com.bruce.controller;

import com.bruce.service.SentinelService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;

@RestController
@Slf4j
public class SentinelController1 {

    @GetMapping("/testRt")
    public String testRt() {
        System.out.println("請求....");
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "testRt..";
    }
}      

【b】新增Sentinel降級規則,具體配置如下圖:

《SpringCloud Alibaba 微服務架構》專題(十三)-Spring Cloud Alibaba之Sentinel服務降級

如上配置表示:/testRt這個資源在200毫秒之内處理完成,說明沒問題,否則處理不完的話,在接下來的時間視窗(這裡是1秒鐘)之内該資源不允許通路,會被Sentinel限制。

【c】Jmeter壓力測試

《SpringCloud Alibaba 微服務架構》專題(十三)-Spring Cloud Alibaba之Sentinel服務降級
《SpringCloud Alibaba 微服務架構》專題(十三)-Spring Cloud Alibaba之Sentinel服務降級

當我們Jmeter點選開始後,一秒内将會發出100個/testRt請求,很明顯,已經達不到200毫秒之内處理完一次請求,此時我們浏覽器通路:​​​http://localhost:8401/testRt​​​

《SpringCloud Alibaba 微服務架構》專題(十三)-Spring Cloud Alibaba之Sentinel服務降級

可見,此時斷路器已經打開,微服務對外不可用了,當我們停止Jmeter後,再次通路:​​http://localhost:8401/testRt​​

《SpringCloud Alibaba 微服務架構》專題(十三)-Spring Cloud Alibaba之Sentinel服務降級

可以看到,斷路器開關關掉,保險絲恢複正常,我們的微服務也就恢複正常通路了。

【d】小總結

永遠一秒鐘打進來10個線程(大于官網要求的5個請求)調用/testRt,我們希望是200毫秒處理完本次請求任務,如果超過200毫秒還沒處理完,在未來一秒的時間視窗内,斷路器打開(保險絲跳閘),微服務不可用,保險絲跳閘斷電了。

後面我們停止Jmeter,沒有這麼大的通路量了,斷路器關閉(保險絲恢複),微服務恢複正常。

4.熔斷降級政策之異常比例

【a】業務層新增如下方法

@GetMapping("/testExceptionRate")
 public String testExceptionRate() {
     String string = null;
     logger.info(string.toString());
     return "testExceptionRate..";
 }      

【b】新增Sentinel降級規則,具體配置如下圖:

《SpringCloud Alibaba 微服務架構》專題(十三)-Spring Cloud Alibaba之Sentinel服務降級

如上配置表示:

【c】Jmeter壓力測試

《SpringCloud Alibaba 微服務架構》專題(十三)-Spring Cloud Alibaba之Sentinel服務降級

當我們啟動線程組運作的時候,這裡我們修改為一秒鐘發送十個請求:

《SpringCloud Alibaba 微服務架構》專題(十三)-Spring Cloud Alibaba之Sentinel服務降級

我們浏覽器通路:​​​http://localhost:8401/testExceptionRate​​​

《SpringCloud Alibaba 微服務架構》專題(十三)-Spring Cloud Alibaba之Sentinel服務降級

可以看到,當我們不斷請求/testExceptionRate資源時,因為我們背景每次運作都直接會抛出異常,是以異常率是100%,肯定大于我們配置的0.2(20%),是以此時斷路器是打開的,接口不可用。

但當我們停止Jmeter壓測時,繼續通路多次:​​http://localhost:8401/testExceptionRate​​​

《SpringCloud Alibaba 微服務架構》專題(十三)-Spring Cloud Alibaba之Sentinel服務降級

可以看到,當我們一秒鐘之内沒有發送超過5個請求時,不管異常率是多少,斷路器都不會自動打開,而是直接抛出異常資訊。

【d】小總結

熔斷降級政策設定為異常比例的話,如果在一秒内的請求數量大于等于5,并且業務出現異常的比例大于我們設定的門檻值時,那麼在我們設定的時間視窗期内,斷路器将會被打開,服務不可用。

5.熔斷降級政策之異常數

【a】業務層新增如下測試方法

@GetMapping("/testExceptionCount")
 public String testExceptionCount() {
     int i = 10 / 0;
     return "testExceptionRate..";
 }      

【b】Sentinel政策配置,具體配置如下圖:

《SpringCloud Alibaba 微服務架構》專題(十三)-Spring Cloud Alibaba之Sentinel服務降級

​​​http://localhost:8401/testExceptionCount​​,第一次通路絕對報錯,因為除數肯定不能為零,我們看到頁面直接展示報錯資訊,但是達到5次報錯後,服務進入熔斷後降級,斷路器被打開,微服務不可用。

【c】測試

繼續閱讀