Spring Cloud Alibaba之服務容錯組件 - Sentinel [基礎篇]

[TOC]


常見容錯方案

在微服務等分布式架構中袁铐,服務容錯是老生常談的問題了揭蜒,我們都知道在微服務架構中會存在多個微服務,而絕大部分微服務之間都會存在調用關系剔桨,若由于某個底層服務不可用從而產生連鎖反應屉更,導致一系列的上層服務崩潰、故障洒缀,這種現象被稱為雪崩效應或級聯故障瑰谜。如下圖所示:


image.png

所以在微服務等分布式架構中,能夠防御服務雪崩效應的容錯方案是必不可少的树绩,常見的容錯方案如下:

1萨脑、超時:

設置請求超時時間,讓請求線程在等待超過一定的時間后就判定為請求失敗從而釋放請求線程饺饭,在某些場景下線程釋放得夠快的話渤早,就不會因為不斷創(chuàng)建線程而導致資源耗盡引起的服務崩潰

2、限流:

例如砰奕,上圖中的服務A只能承受1k左右的QPS蛛芥,那么就設置一個最大請求數量閾值提鸟,當QPS達到1k時就拒絕在這之后的請求军援。就像是我只能吃一碗飯,就算給我三碗我也只吃一碗

3称勋、艙壁模式:

艙壁模式實際上就是借鑒于現實生活中的船艙結構而設計胸哥,一艘船想要不那么容易沉也需要具備有一定的”容錯“能力,而早期的船由于設計上的欠缺赡鲜,只要一個地方進水了空厌,那么水就會逐漸漫進整個船艙,這種結構的船幾乎沒有“容錯”能力银酬,所以就比較容易沉嘲更。于是此時就有人想到將原本一體的船艙分隔成一個個獨立的船艙,船艙之間都使用鋼板焊死隔開揩瞪,這些鋼板就是所謂的艙壁了赋朦。采用這種設計后,就算當其中一個兩個船艙進水了,也不會影響到其他船艙宠哄,這艘船依舊能夠正常行駛壹将。

在軟件層面上借鑒這種思想,我們可以讓每個服務都運行在自己獨立的線程池中毛嫉,線程池之間是互不干擾的诽俯,服務A的線程池資源耗盡也不會影響到服務B。此時線程池就像船艙的艙壁一樣將不同的服務資源隔離開來承粤,這樣某個服務掛掉也不會影響其他服務的運行

4暴区、斷路器模式:

斷路器模式的思想實際上和家里的斷路器一樣,在軟件層面大致就是對某個服務的API進行監(jiān)控密任,若在一定時間內調用的失敗率或失敗次數達到指定的閾值就認為該API是不可用的從而觸發(fā)“跳閘”颜启,即此時斷路器就處于打開狀態(tài)。過了一段時間后斷路器會處于一個半開狀態(tài)浪讳,若在半開狀態(tài)時嘗試調用該API成功后就會關閉斷路器缰盏,否則依舊認為不可用讓斷路器繼續(xù)處于打開狀態(tài)

斷路器三態(tài)轉換如下圖:


image.png

斷路器模式原文:CircuitBreaker

而Spring Cloud已經提供了相關的服務容錯組件,組件里已經整合了這些常用的方案淹遵,不需要我們手動去實現口猜。在此之前Spring Cloud提供的唯一服務容錯組件是Hystrix,不過現在多了一個選擇透揣,那就是Spring Cloud Alibaba的Sentinel組件济炎。關于Hystrix可以參考如下文章,本文主要介紹Sentinel:


Sentinel簡介及整合

Sentinel 是什么辐真,官方描述如下:

隨著微服務的流行须尚,服務和服務之間的穩(wěn)定性變得越來越重要。Sentinel 是面向分布式服務架構的輕量級流量控制侍咱、熔斷降級框架耐床,主要以流量為切入點,從流量控制楔脯、熔斷降級撩轰、系統(tǒng)負載保護等多個維度來幫助您保護服務的穩(wěn)定性。

官方GitHub倉庫地址如下:

https://github.com/alibaba/Sentinel

現在我們來為項目整合Sentinel昧廷,第一步添加如下依賴:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- actuator堪嫂,用于暴露監(jiān)控端點 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Tips:該項目使用的Spring Cloud版本為Greenwich.SR1,Spring Cloud Alibaba版本為0.9.0.RELEASE

第二步配置actuator:

# 暴露所有端點
management:
  endpoints:
    web:
      exposure:
        include: '*'

完成以上兩步后木柬,啟動項目皆串,使用瀏覽器訪問http://localhost:8080/actuator/sentinel,返回如下結果代表整合成功:

image.png


搭建Sentinel Dashboard控制臺

在上一小節(jié)中眉枕,我們已經為項目成功整合了Sentinel恶复,但這也只不過是完成了第一步娇唯。因為此時沒有一個可視化的界面能讓我們看到Sentinel具體的監(jiān)控信息,所以還需要搭建官方提供的可視化Sentinel控制臺寂玲,然后在控制臺中整合項目的監(jiān)控信息塔插。

Sentinel控制臺的下載地址如下:

https://github.com/alibaba/Sentinel/releases

Sentinel Dashboard有多個release版本,應該選擇哪個呢拓哟?如果你是用在生產環(huán)境則選擇與項目中sentinel-core版本對應的即可想许,如下:


image.png

若只是學習或測試使用那就可以隨便選擇了,只要能用就行断序,所以我這里選擇最新版本1.6.3流纹,注意這里選擇jar包進行下載:


image.png

下載完成后,存放到一個你覺得ok的目錄下违诗,然后打開cmd漱凝,通過命令運行該jar包。如下:

E:\Spring Cloud Alibaba\Sentinel>java -jar sentinel-dashboard-1.6.3.jar

啟動成功诸迟,監(jiān)聽的端口是8080:


image.png

使用瀏覽器訪問http://localhost:8080進入到登錄頁面茸炒,默認的賬戶密碼都是sentinel:

image.png

登錄成功,此時控制臺上是空白的阵苇,因為還沒有監(jiān)控任何的項目:


image.png

所以接著到項目中整合一下Sentinel Dashboard的請求地址壁公,在配置文件中添加如下配置:

spring:
  cloud:
    sentinel:
      transport:
        # 配置sentinel控制臺的地址
        dashboard: 127.0.0.1:8080

配置完成啟動項目后需要先訪問一下該項目的接口,因為Sentinel Dashboard是懶加載的绅项,只有監(jiān)控的項目被訪問后才會收集監(jiān)控信息紊册。這樣才能看到下圖的實時監(jiān)控信息,我這里的服務名是content-center:


image.png

Sentinel 相關配置項小結

客戶端(微服務)連接控制臺相關配置項:

spring:
  cloud:
    sentinel:
      transport:
        #指定控制臺的地址
        dashboard: localhost:8080
        #指定和控制臺通信的IP
        #如不配置快耿,會自動選擇一個IP注冊
        client-ip:  127.0.0.1
        #指定和控制臺通信的端口囊陡,默認值8719
        #如不設置,會自動從8719開始掃描掀亥,依次+1撞反,直到找到未被占用的端口
        port: 8719
        #心跳發(fā)送周期,默認值null
        #但在S impleHttpHeartbeatSender會用默認值10秒
        heartbeat- interval-ms :  10000

控制臺相關配置項:

配置項 默認值 最小值 描述
sentinel.dashboard.app.hideAppNoMachineMillis 0 60000 是否隱藏無健康節(jié)點的應用铺浇,距離最近一次主機心跳時間的毫秒數痢畜,默認關閉
sentinel.dashboard.removeAppNoMachineMillis 0 120000 是否自動刪除無健康節(jié)點的應用垛膝,距離最近一次其下節(jié)點的心跳時間毫秒數鳍侣,默認關閉
sentinel.dashboard.unhealthyMachineMillis 60000 30000 主機失聯判定,不可關閉
sentinel.dashboard.autoRemoveMachineMillis 0 300000 距離最近心跳時間超過指定時間是否自動刪除失聯節(jié)點吼拥,默認關閉
server.port 8080 - 指定端口
csp.sentinel.dashboard.server localhost:8080 - 指定地址
project.name - - 指定程序的名稱
sentinel.dashboard.auth.username [1.6版本支持] sentinel - Sentinel Dashboard登錄賬號
sentinel.dashboard.auth.password [1.6版本支持] sentinel - Sentinel Dashboard登錄密碼
server.servlet.session.timeout [1.6版本支持] 30分鐘 - 登錄Session過期時間倚聚。配置為7200表示7200秒;配置為60m表示60分鐘

控制臺配置項需在啟動命令中指定凿可,例如指定賬戶密碼惑折,如下:

java -jar -Dsentinel.dashboard.auth.username=admin -Dsentinel.dashboard.auth.password=123456 sentinel-dashboard-1.6.3.jar

流控規(guī)則

我們可以在Sentinel控制臺中給某個接口添加流控規(guī)則授账,點擊簇點鏈路,可以看到該服務曾經被訪問過的路徑:


image.png

然后點擊接口右邊的流控按鈕就可以添加流控規(guī)則:


image.png

添加成功:


image.png

此時訪問該服務的接口惨驶,QPS超過設定的閾值1白热,就會返回如下信息:


image.png

關于流控規(guī)則中的流控模式:

  • 直接:當前資源的QPS達到設定的閾值,就觸發(fā)限流
  • 關聯:當關聯的資源的QPS達到設定的閾值粗卜,就觸發(fā)限流屋确。例如,/shares/1關聯了/query续扔,那么/query達到閾值攻臀,就會對/shares/1限流
  • 鏈路:只記錄指定鏈路上的流量,這種模式是針對接口級別的來源進行限流

鏈路模式稍微有些抽象纱昧,這里舉個簡單的例子說明一下刨啸。下圖中有兩個調用鏈路,圖中的/test-b/test-a實際就是兩個接口识脆,它們都調用了同一個common資源设联,所以/test-b/test-a就稱為common的入口資源:

image.png

此時我為common添加一個限流規(guī)則如下:

image.png

可以看到流控模式選擇鏈路后,需要填寫一個入口資源灼捂,我這里填的是/test-a仑荐,那么這意味著什么呢?意味著當/test-a的QPS達到該規(guī)則的閾值后纵东,就會對/test-a限流粘招,同時/test-b不會受到任何影響。說明這種流控模式可以針對接口級別的來源進行限流偎球,而“針對來源”則是對微服務級別的來源進行限流洒扎。

關于流控規(guī)則中的監(jiān)控效果:

  • 快速失敗:直接失敗衰絮,拋出異常袍冷,不做任何額外的處理,是最簡單的效果
    • 相關源碼:com.alibaba.csp.sentinel.slots.block.flow.controller.DefaultController
  • Warm Up(預熱):會根據codeFactor(默認3)的值猫牡,從閾值除以codeFactor胡诗,經過預熱時長,才到達設置的QPS閾值淌友。適用于將突然增大的流量轉換為緩步增長的場景
    • 相關的官方文檔:限流 - 冷啟動
    • 相關源碼:com.alibaba.csp.sentinel.slots.block.flow.controller.WarmUpController
  • 排隊等待:勻速排隊葵腹,讓請求以均勻的速度通過需曾,若請求等待時間超過設置的超時時間則拋棄該請求,閾值類型必須設置成QPS,否則無效乔煞。適用于突發(fā)流量的場景
    • 相關的官方文檔:限流 - 勻速器
    • 相關源碼:com.alibaba.csp.sentinel.slots.block.flow.controller.RateLimiterController

關于流控的官方文檔:


降級規(guī)則

服務降級實際就是斷路器模式的應用止吐,相對于流控規(guī)則蕉世,降級規(guī)則要簡單一些。降級規(guī)則可以在“簇點鏈路”或“降級規(guī)則”中添加:


image.png

例如婿崭,這里給/shares/1添加降級規(guī)則,降級策略先以RT為例:

image.png

該降級規(guī)則的含義如下圖:


image.png

此時訪問/shares/1接口肴颊,秒級平均響應時間超出閾值1氓栈,并且在時間窗口內通過的請求大于等于5,就會返回如下信息:

image.png

關于RT這種降級策略需要注意的點:

  • RT默認最大為4900ms婿着,所以即便設置的值大于4900ms也依舊會按照4900ms計算
    • 可以通過參數修改:-Dcsp.sentinel.statistic.max.rt=xxx

若將降級策略改為異常比例颤绕,則含義如下:


image.png

若將降級策略改為異常數,則含義如下:


image.png

關于異常數這種降級策略需要注意的點:

  • 若將時間窗口的值設置小于60秒則可能會出問題祟身,因為異常數的統(tǒng)計是分鐘級別的奥务,時間窗口小于60秒就有可能不斷進入降級狀態(tài)

降級規(guī)則的相關源碼:

  • com.alibaba.csp.sentinel.slots.block.degradeDegradeRule#passCheck(對降級的判斷都在這個方法里完成)

在文章的開頭我們介紹過斷路器有三個狀態(tài),所以這里需要提及一下的是目前Sentinel的降級斷路器是不支持半開狀態(tài)的袜硫,只有打開和關閉兩個狀態(tài)氯葬,據官方人員描述說是會預計在未來添加半開的支持。

關于降級的官方文檔:


熱點規(guī)則

熱點規(guī)則全稱是熱點參數限流規(guī)則婉陷,從名稱可以得知帚称,需要有參數的接口才能夠使用熱點規(guī)則。例如秽澳,有一個接口的代碼如下:

@GetMapping("/test-hot")
@SentinelResource("hot")  // 該注解用于聲明是Sentinel需要監(jiān)控的資源
public String testHot(@RequestParam(required = false) String a,
                      @RequestParam(required = false) String b) {
    return a + " " + b;
}

在控制臺中為hot添加熱點規(guī)則闯睹,如下:


image.png

image.png
  • Tips:參數索引從0開始,對應到代碼中的話担神,則參數a的索引為0楼吃,參數b的索引為1,所以該規(guī)則是作用于參數a

添加完該規(guī)則后妄讯,此時訪問這個接口孩锡,兩個參數都傳值,當QPS達到閾值時亥贸,就會拋出如下異常信息:


image.png

如果不傳參數a躬窜,僅傳參數b的話,則不會受到該規(guī)則的限流炕置,如下:


image.png

說明該規(guī)則表達的含義是:在時間窗口內荣挨,一旦該規(guī)則指定的索引參數QPS達到了閾值,則會觸發(fā)限流

除此之外朴摊,還有高級選項默垄,在這里可以添加參數例外項,如下示例:


image.png

image.png

添加完成后仍劈,此時將參數a的值設置為5厕倍,然后頻繁發(fā)送請求寡壮,會發(fā)現即便QPS超過1也不會觸發(fā)限流:


image.png

這是因為參數a的值設置為5時贩疙,限流閾值是1000讹弯,設置為其他值時,限流閾值才是1这溅。這就是所謂的參數例外項了组民,即參數的為某個特定的值時,只受參數例外項里的限流閾值影響悲靴。

熱點規(guī)則適用的場景:

  • 適用于存在熱點參數并希望提升API可用性的場景臭胜,即某個特定請求參數QPS偏高于其他請求參數時,僅對該參數的請求限流癞尚,使用其他請求參數則可以正常響應耸三,這樣可以提高一定的可用性

使用熱點規(guī)則需要注意的點:

  • 參數必須是基本類型或者String類型,否則將不會生效

熱點規(guī)則相關源碼:

  • com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowChecker#passCheck(對熱點參數規(guī)則的判斷邏輯都在這個方法里)

系統(tǒng)規(guī)則

系統(tǒng)規(guī)則全稱為系統(tǒng)保護規(guī)則浇揩,從名稱可以得知該規(guī)則是用于保護系統(tǒng)仪壮、防止系統(tǒng)負載過高而崩潰的,所以觸發(fā)系統(tǒng)規(guī)則后會對整個系統(tǒng)限流胳徽。添加系統(tǒng)規(guī)則如下圖所示:


image.png

設置系統(tǒng)規(guī)則比較簡單积锅,選擇一個合適的閾值類型并填寫閾值即可:


image.png

關于閾值類型:

  • LOAD(負載):當系統(tǒng)load1(1分鐘的load)超過閾值,且并發(fā)線程數超過系統(tǒng)容量時觸發(fā)养盗,建議設置為CPU核心數 * 2.5(注意:僅對 Linux/Unit-like 機器生效)缚陷。例如CPU核心數為4,4 * 2.5 = 10
    • 系統(tǒng)容量 = maxQPS * minRT往核;(由Sentinel計算 )
      • maxQPS:秒級統(tǒng)計出來的最大QPS
      • minRT:秒級統(tǒng)計出來的最小響應時間
    • 相關源碼:com.alibaba.csp.sentinel.slots.system.SystemRuleManager#checkBbr
  • RT:所有入口流量的平均RT達到閾值時觸發(fā)
  • 線程數:所有入口流量的并發(fā)線程數達到閾值時觸發(fā)
  • 入口QPS:所有入口流量的QPS達到閾值時觸發(fā)
  • CPU使用率:系統(tǒng)CPU使用率達到閾值時觸發(fā)

系統(tǒng)規(guī)則的判斷邏輯所在的源碼如下:

  • com.alibaba.csp.sentinel.slots.system.SystemRuleManager#checkSystem

授權規(guī)則

授權規(guī)則用于限制某個資源僅允許哪個服務訪問箫爷,所以通常用于對服務消費者的訪問權進行控制。我們可以在簇點鏈路中為某個接口添加授權規(guī)則聂儒,這里以/shares/1接口為例蝶缀,如下:

image.png

新增授權規(guī)則:


image.png
  • 該授權規(guī)則的含義為:僅允許test服務訪問/shares/1接口,如果授權類型設置為黑名單則表示/shares/1接口不允許test服務訪問薄货。即白名單是授權某個服務訪問翁都,黑名單則是限制某個服務訪問,從而實現訪問控制的效果谅猾。

代碼配置規(guī)則

上面幾個關于規(guī)則的小節(jié)中已經介紹了如何在Sentinel控制臺中配置各種規(guī)則柄慰,除此之外,Sentinel還支持在代碼中配置這些規(guī)則税娜,所以本小節(jié)將簡單介紹一下如何在代碼中進行配置坐搔。

代碼如下(Tips:代碼基于sentinel-core 1.5.2版本):

package com.zj.node.contentcenter.controller.content;

import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRuleManager;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowItem;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRuleManager;
import com.alibaba.csp.sentinel.slots.system.SystemRule;
import com.alibaba.csp.sentinel.slots.system.SystemRuleManager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 添加Sentinel規(guī)則
 *
 * @author 01
 * @date 2019-07-31
 **/
@Slf4j
@RestController
public class SentinelRuleController {

    /**
     * 測試添加流控規(guī)則
     */
    @PostMapping("/test-add-flow-rule")
    public String testAddFlowRile(String resourceName) {
        log.info("add flow rule. resourceName is {}", resourceName);
        addFlowQpsRule(resourceName);

        return "add flow rule success!";
    }

    /**
     * 添加流控規(guī)則
     *
     * @param resourceName 資源名稱
     */
    private void addFlowQpsRule(String resourceName) {
        // 規(guī)則列表
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule(resourceName);
        // 針對來源
        rule.setLimitApp("default");
        // 設置閾值類型為QPS
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        // 單機閾值
        rule.setCount(20);
        // 將規(guī)則添加到規(guī)則列表
        rules.add(rule);
        // 加載規(guī)則列表
        FlowRuleManager.loadRules(rules);
    }

    /**
     * 添加降級規(guī)則
     *
     * @param resourceName 資源名稱
     */
    private void addDegradeRule(String resourceName) {
        List<DegradeRule> rules = new ArrayList<>();
        DegradeRule rule = new DegradeRule(resourceName);
        // 設置降級策略為 RT
        rule.setGrade(RuleConstant.DEGRADE_GRADE_RT);
        // set threshold RT, 10 ms(設置RT時間閾值)
        rule.setCount(10);
        // 時間窗口
        rule.setTimeWindow(10);
        rules.add(rule);
        DegradeRuleManager.loadRules(rules);
    }

    /**
     * 添加熱點規(guī)則
     *
     * @param resourceName 資源名稱
     */
    private void addHotRule(String resourceName) {
        ParamFlowRule rule = new ParamFlowRule(resourceName);
        // 參數索引
        rule.setParamIdx(0);
        // 單機閾值
        rule.setCount(5);

        // 添加參數例外項
        ParamFlowItem item = new ParamFlowItem();
        // 參數類型
        item.setClassType(int.class.getName());
        // 參數值
        item.setObject("5");
        // 限流閾值
        item.setCount(10);
        rule.setParamFlowItemList(Collections.singletonList(item));

        ParamFlowRuleManager.loadRules(Collections.singletonList(rule));
    }

    /**
     * 添加系統(tǒng)規(guī)則
     */
    private void addSystemRule() {
        List<SystemRule> rules = new ArrayList<>();
        SystemRule rule = new SystemRule();
        // 設置系統(tǒng)最高負載閾值
        rule.setHighestSystemLoad(10);
        rules.add(rule);
        SystemRuleManager.loadRules(rules);
    }

    /**
     * 添加授權規(guī)則
     *
     * @param resourceName 資源名稱
     * @param limitApp     流控應用(指調用方,多個調用方名稱使用英文逗號分隔)
     */
    private void addAuthorityRule(String resourceName, String limitApp) {
        AuthorityRule rule = new AuthorityRule();
        // 資源名稱
        rule.setResource(resourceName);
        // 流控應用
        rule.setLimitApp(limitApp);
        // 設置授權類型為白名單
        rule.setStrategy(RuleConstant.AUTHORITY_WHITE);

        AuthorityRuleManager.loadRules(Collections.singletonList(rule));
    }
}

我們來測試添加流控規(guī)則敬矩,使用postman訪問測試接口概行,如下:


image.png

添加成功后,到Sentinel控制臺中弧岳,查看是否存在該規(guī)則:


image.png

從上圖中可以看到該流控規(guī)則已經成功添加到Sentinel中了凳忙,證明測試成功业踏。至于其他的規(guī)則也可以使用類似的方式添加,并且也都給出了代碼涧卵,這里就不一一去演示了勤家。


Sentinel規(guī)則參數總結

下面總結一下Alibaba Sentinel各種規(guī)則的參數,并且提供了官方文檔的鏈接柳恐,若未來本文不再適用伐脖,可以自行點擊鏈接前往官方文檔查看

1、流控規(guī)則:

Field 說明 默認值
resource 資源名乐设,資源名是限流規(guī)則的作用對象
count 限流閾值
grade 限流閾值類型讼庇,QPS 或線程數模式 QPS 模式
limitApp 流控針對的調用來源 default,代表不區(qū)分調用來源
strategy 判斷的根據是資源自身近尚,還是根據其它關聯資源 (refResource)巫俺,還是根據鏈路入口 根據資源本身
controlBehavior 流控效果(直接拒絕 / 排隊等待 / 慢啟動模式) 直接拒絕

官方文檔:


2、降級規(guī)則:

Field 說明 默認值
resource 資源名肿男,即限流規(guī)則的作用對象
count 閾值
grade 降級模式介汹,根據 RT 降級還是根據異常比例或異常數降級 RT
timeWindow 降級的時間,單位為 s

官方文檔:


3舶沛、熱點規(guī)則:

Field 說明 默認值
resource 資源名嘹承,即熱點規(guī)則的作用對象
count 限流閾值,必填
grade 限流模式 QPS 模式
durationInSec 統(tǒng)計窗口時間長度(單位為秒)如庭,1.6.0 版本開始支持 1s
controlBehavior 流控效果(支持快速失敗和勻速排隊模式)叹卷,1.6.0 版本開始支持 快速失敗
maxQueueingTimeMs 最大排隊等待時長(僅在勻速排隊模式生效),1.6.0 版本開始支持 0ms
paramIdx 熱點參數的索引坪它,必填骤竹,對應 SphU.entry(xxx, args) 中的參數索引位置
paramFlowItemList 參數例外項,可以針對指定的參數值單獨設置限流閾值往毡,不受前面 count 閾值的限制蒙揣。僅支持基本類型和字符串類型
clusterMode 是否是集群參數流控規(guī)則 false
clusterConfig 集群流控相關配置

官方文檔:


4、系統(tǒng)規(guī)則:

Field 說明 默認值
highestSystemLoad 最大的 load1开瞭,參考值 -1 (不生效)
avgRt 所有入口流量的平均響應時間 -1 (不生效)
maxThread 入口流量的最大并發(fā)數 -1 (不生效)
qps 所有入口資源的 QPS -1 (不生效)

官方文檔:


5懒震、授權規(guī)則:

Field 說明 默認值
resource 資源名,即授權規(guī)則的作用對象
limitApp 流控應用(指調用方嗤详,即服務消費者)个扰,對應的黑名單/白名單,不同 origin 用英文逗號(,)分隔葱色,如 appA,appB
strategy 限制模式递宅,AUTHORITY_WHITE 為白名單模式,AUTHORITY_BLACK 為黑名單模式,默認為白名單模式 AUTHORITY_WHITE

官方文檔:

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末办龄,一起剝皮案震驚了整個濱河市烘绽,隨后出現的幾起案子,更是在濱河造成了極大的恐慌土榴,老刑警劉巖诀姚,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件响牛,死亡現場離奇詭異玷禽,居然都是意外死亡,警方通過查閱死者的電腦和手機呀打,發(fā)現死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門矢赁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贬丛,你說我怎么就攤上這事撩银。” “怎么了豺憔?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵额获,是天一觀的道長。 經常有香客問我恭应,道長抄邀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任昼榛,我火速辦了婚禮境肾,結果婚禮上,老公的妹妹穿的比我還像新娘胆屿。我一直安慰自己奥喻,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布非迹。 她就那樣靜靜地躺著环鲤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪憎兽。 梳的紋絲不亂的頭發(fā)上楔绞,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音唇兑,去河邊找鬼酒朵。 笑死,一個胖子當著我的面吹牛扎附,可吹牛的內容都是我干的蔫耽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼匙铡!你這毒婦竟也來了图甜?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤鳖眼,失蹤者是張志新(化名)和其女友劉穎黑毅,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體钦讳,經...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡矿瘦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了愿卒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缚去。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖琼开,靈堂內的尸體忽然破棺而出易结,到底是詐尸還是另有隱情,我是刑警寧澤柜候,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布搞动,位于F島的核電站,受9級特大地震影響渣刷,放射性物質發(fā)生泄漏鹦肿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一飞主、第九天 我趴在偏房一處隱蔽的房頂上張望狮惜。 院中可真熱鬧,春花似錦碌识、人聲如沸碾篡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽开泽。三九已至,卻和暖如春魁瞪,著一層夾襖步出監(jiān)牢的瞬間穆律,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工导俘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留峦耘,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓旅薄,卻偏偏與公主長得像辅髓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內容