十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
在微服務(wù)等分布式架構(gòu)中,服務(wù)容錯是老生常談的問題了,我們都知道在微服務(wù)架構(gòu)中會存在多個微服務(wù),而絕大部分微服務(wù)之間都會存在調(diào)用關(guān)系,若由于某個底層服務(wù)不可用從而產(chǎn)生連鎖反應(yīng),導(dǎo)致一系列的上層服務(wù)崩潰、故障,這種現(xiàn)象被稱為雪崩效應(yīng)或級聯(lián)故障。如下圖所示:
創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供峨邊彝族網(wǎng)站建設(shè)、峨邊彝族做網(wǎng)站、峨邊彝族網(wǎng)站設(shè)計、峨邊彝族網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、峨邊彝族企業(yè)網(wǎng)站模板建站服務(wù),十載峨邊彝族做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
所以在微服務(wù)等分布式架構(gòu)中,能夠防御服務(wù)雪崩效應(yīng)的容錯方案是必不可少的,常見的容錯方案如下:
1、超時:
設(shè)置請求超時時間,讓請求線程在等待超過一定的時間后就判定為請求失敗從而釋放請求線程,在某些場景下線程釋放得夠快的話,就不會因為不斷創(chuàng)建線程而導(dǎo)致資源耗盡引起的服務(wù)崩潰
2、限流:
例如,上圖中的服務(wù)A只能承受1k左右的QPS,那么就設(shè)置一個最大請求數(shù)量閾值,當(dāng)QPS達(dá)到1k時就拒絕在這之后的請求。就像是我只能吃一碗飯,就算給我三碗我也只吃一碗
3、艙壁模式:
艙壁模式實(shí)際上就是借鑒于現(xiàn)實(shí)生活中的船艙結(jié)構(gòu)而設(shè)計,一艘船想要不那么容易沉也需要具備有一定的”容錯“能力,而早期的船由于設(shè)計上的欠缺,只要一個地方進(jìn)水了,那么水就會逐漸漫進(jìn)整個船艙,這種結(jié)構(gòu)的船幾乎沒有“容錯”能力,所以就比較容易沉。于是此時就有人想到將原本一體的船艙分隔成一個個獨(dú)立的船艙,船艙之間都使用鋼板焊死隔開,這些鋼板就是所謂的艙壁了。采用這種設(shè)計后,就算當(dāng)其中一個兩個船艙進(jìn)水了,也不會影響到其他船艙,這艘船依舊能夠正常行駛。
在軟件層面上借鑒這種思想,我們可以讓每個服務(wù)都運(yùn)行在自己獨(dú)立的線程池中,線程池之間是互不干擾的,服務(wù)A的線程池資源耗盡也不會影響到服務(wù)B。此時線程池就像船艙的艙壁一樣將不同的服務(wù)資源隔離開來,這樣某個服務(wù)掛掉也不會影響其他服務(wù)的運(yùn)行
4、斷路器模式:
斷路器模式的思想實(shí)際上和家里的斷路器一樣,在軟件層面大致就是對某個服務(wù)的API進(jìn)行監(jiān)控,若在一定時間內(nèi)調(diào)用的失敗率或失敗次數(shù)達(dá)到指定的閾值就認(rèn)為該API是不可用的從而觸發(fā)“跳閘”,即此時斷路器就處于打開狀態(tài)。過了一段時間后斷路器會處于一個半開狀態(tài),若在半開狀態(tài)時嘗試調(diào)用該API成功后就會關(guān)閉斷路器,否則依舊認(rèn)為不可用讓斷路器繼續(xù)處于打開狀態(tài)
斷路器三態(tài)轉(zhuǎn)換如下圖:
斷路器模式原文:CircuitBreaker
而Spring Cloud已經(jīng)提供了相關(guān)的服務(wù)容錯組件,組件里已經(jīng)整合了這些常用的方案,不需要我們手動去實(shí)現(xiàn)。在此之前Spring Cloud提供的唯一服務(wù)容錯組件是Hystrix,不過現(xiàn)在多了一個選擇,那就是Spring Cloud Alibaba的Sentinel組件。關(guān)于Hystrix可以參考如下文章,本文主要介紹Sentinel:
Sentinel 是什么,官方描述如下:
隨著微服務(wù)的流行,服務(wù)和服務(wù)之間的穩(wěn)定性變得越來越重要。Sentinel 是面向分布式服務(wù)架構(gòu)的輕量級流量控制、熔斷降級框架,主要以流量為切入點(diǎn),從流量控制、熔斷降級、系統(tǒng)負(fù)載保護(hù)等多個維度來幫助您保護(hù)服務(wù)的穩(wěn)定性。
官方GitHub倉庫地址如下:
https://github.com/alibaba/Sentinel
現(xiàn)在我們來為項目整合Sentinel,第一步添加如下依賴:
org.springframework.cloud
spring-cloud-starter-alibaba-sentinel
org.springframework.boot
spring-boot-starter-actuator
Tips:該項目使用的Spring Cloud版本為Greenwich.SR1,Spring Cloud Alibaba版本為0.9.0.RELEASE
第二步配置actuator:
# 暴露所有端點(diǎn)
management:
endpoints:
web:
exposure:
include: '*'
完成以上兩步后,啟動項目,使用瀏覽器訪問http://localhost:8080/actuator/sentinel
,返回如下結(jié)果代表整合成功:
在上一小節(jié)中,我們已經(jīng)為項目成功整合了Sentinel,但這也只不過是完成了第一步。因為此時沒有一個可視化的界面能讓我們看到Sentinel具體的監(jiān)控信息,所以還需要搭建官方提供的可視化Sentinel控制臺,然后在控制臺中整合項目的監(jiān)控信息。
Sentinel控制臺的下載地址如下:
https://github.com/alibaba/Sentinel/releases
Sentinel Dashboard有多個release版本,應(yīng)該選擇哪個呢?如果你是用在生產(chǎn)環(huán)境則選擇與項目中sentinel-core版本對應(yīng)的即可,如下:
若只是學(xué)習(xí)或測試使用那就可以隨便選擇了,只要能用就行,所以我這里選擇最新版本1.6.3,注意這里選擇jar包進(jìn)行下載:
下載完成后,存放到一個你覺得ok的目錄下,然后打開cmd,通過命令運(yùn)行該jar包。如下:
E:\Spring Cloud Alibaba\Sentinel>java -jar sentinel-dashboard-1.6.3.jar
啟動成功,監(jiān)聽的端口是8080:
使用瀏覽器訪問http://localhost:8080
進(jìn)入到登錄頁面,默認(rèn)的賬戶密碼都是sentinel:
登錄成功,此時控制臺上是空白的,因為還沒有監(jiān)控任何的項目:
所以接著到項目中整合一下Sentinel Dashboard的請求地址,在配置文件中添加如下配置:
spring:
cloud:
sentinel:
transport:
# 配置sentinel控制臺的地址
dashboard: 127.0.0.1:8080
配置完成啟動項目后需要先訪問一下該項目的接口,因為Sentinel Dashboard是懶加載的,只有監(jiān)控的項目被訪問后才會收集監(jiān)控信息。這樣才能看到下圖的實(shí)時監(jiān)控信息,我這里的服務(wù)名是content-center:
客戶端(微服務(wù))連接控制臺相關(guān)配置項:
spring:
cloud:
sentinel:
transport:
#指定控制臺的地址
dashboard: localhost:8080
#指定和控制臺通信的IP
#如不配置,會自動選擇一個IP注冊
client-ip: 127.0.0.1
#指定和控制臺通信的端口,默認(rèn)值8719
#如不設(shè)置,會自動從8719開始掃描,依次+1,直到找到未被占用的端口
port: 8719
#心跳發(fā)送周期,默認(rèn)值null
#但在S impleHttpHeartbeatSender會用默認(rèn)值10秒
heartbeat- interval-ms : 10000
控制臺相關(guān)配置項:
配置項 | 默認(rèn)值 | 最小值 | 描述 |
---|---|---|---|
sentinel.dashboard.app.hideAppNoMachineMillis | 0 | 60000 | 是否隱藏?zé)o健康節(jié)點(diǎn)的應(yīng)用,距離最近一次主機(jī)心跳時間的毫秒數(shù),默認(rèn)關(guān)閉 |
sentinel.dashboard.removeAppNoMachineMillis | 0 | 120000 | 是否自動刪除無健康節(jié)點(diǎn)的應(yīng)用,距離最近一次其下節(jié)點(diǎn)的心跳時間毫秒數(shù),默認(rèn)關(guān)閉 |
sentinel.dashboard.unhealthyMachineMillis | 60000 | 30000 | 主機(jī)失聯(lián)判定,不可關(guān)閉 |
sentinel.dashboard.autoRemoveMachineMillis | 0 | 300000 | 距離最近心跳時間超過指定時間是否自動刪除失聯(lián)節(jié)點(diǎn),默認(rèn)關(guān)閉 |
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
我們可以在Sentinel控制臺中給某個接口添加流控規(guī)則,點(diǎn)擊簇點(diǎn)鏈路,可以看到該服務(wù)曾經(jīng)被訪問過的路徑:
然后點(diǎn)擊接口右邊的流控按鈕就可以添加流控規(guī)則:
添加成功:
此時訪問該服務(wù)的接口,QPS超過設(shè)定的閾值1,就會返回如下信息:
關(guān)于流控規(guī)則中的流控模式:
/shares/1
關(guān)聯(lián)了/query
,那么/query
達(dá)到閾值,就會對/shares/1
限流鏈路模式稍微有些抽象,這里舉個簡單的例子說明一下。下圖中有兩個調(diào)用鏈路,圖中的/test-b
和/test-a
實(shí)際就是兩個接口,它們都調(diào)用了同一個common
資源,所以/test-b
和/test-a
就稱為common
的入口資源:
此時我為common
添加一個限流規(guī)則如下:
可以看到流控模式選擇鏈路后,需要填寫一個入口資源,我這里填的是/test-a
,那么這意味著什么呢?意味著當(dāng)/test-a
的QPS達(dá)到該規(guī)則的閾值后,就會對/test-a
限流,同時/test-b
不會受到任何影響。說明這種流控模式可以針對接口級別的來源進(jìn)行限流,而“針對來源”則是對微服務(wù)級別的來源進(jìn)行限流。
關(guān)于流控規(guī)則中的監(jiān)控效果:
com.alibaba.csp.sentinel.slots.block.flow.controller.DefaultController
com.alibaba.csp.sentinel.slots.block.flow.controller.WarmUpController
com.alibaba.csp.sentinel.slots.block.flow.controller.RateLimiterController
關(guān)于流控的官方文檔:
服務(wù)降級實(shí)際就是斷路器模式的應(yīng)用,相對于流控規(guī)則,降級規(guī)則要簡單一些。降級規(guī)則可以在“簇點(diǎn)鏈路”或“降級規(guī)則”中添加:
例如,這里給/shares/1
添加降級規(guī)則,降級策略先以RT為例:
該降級規(guī)則的含義如下圖:
此時訪問/shares/1
接口,秒級平均響應(yīng)時間超出閾值1,并且在時間窗口內(nèi)通過的請求大于等于5,就會返回如下信息:
關(guān)于RT這種降級策略需要注意的點(diǎn):
-Dcsp.sentinel.statistic.max.rt=xxx
若將降級策略改為異常比例,則含義如下:
若將降級策略改為異常數(shù),則含義如下:
關(guān)于異常數(shù)這種降級策略需要注意的點(diǎn):
降級規(guī)則的相關(guān)源碼:
com.alibaba.csp.sentinel.slots.block.degradeDegradeRule#passCheck
(對降級的判斷都在這個方法里完成)在文章的開頭我們介紹過斷路器有三個狀態(tài),所以這里需要提及一下的是目前Sentinel的降級斷路器是不支持半開狀態(tài)的,只有打開和關(guān)閉兩個狀態(tài),據(jù)官方人員描述說是會預(yù)計在未來添加半開的支持。
關(guān)于降級的官方文檔:
熱點(diǎn)規(guī)則全稱是熱點(diǎn)參數(shù)限流規(guī)則,從名稱可以得知,需要有參數(shù)的接口才能夠使用熱點(diǎn)規(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添加熱點(diǎn)規(guī)則,如下:
添加完該規(guī)則后,此時訪問這個接口,兩個參數(shù)都傳值,當(dāng)QPS達(dá)到閾值時,就會拋出如下異常信息:
如果不傳參數(shù)a,僅傳參數(shù)b的話,則不會受到該規(guī)則的限流,如下:
說明該規(guī)則表達(dá)的含義是:在時間窗口內(nèi),一旦該規(guī)則指定的索引參數(shù)QPS達(dá)到了閾值,則會觸發(fā)限流
除此之外,還有高級選項,在這里可以添加參數(shù)例外項,如下示例:
添加完成后,此時將參數(shù)a的值設(shè)置為5,然后頻繁發(fā)送請求,會發(fā)現(xiàn)即便QPS超過1也不會觸發(fā)限流:
這是因為參數(shù)a的值設(shè)置為5時,限流閾值是1000,設(shè)置為其他值時,限流閾值才是1。這就是所謂的參數(shù)例外項了,即參數(shù)的為某個特定的值時,只受參數(shù)例外項里的限流閾值影響。
熱點(diǎn)規(guī)則適用的場景:
使用熱點(diǎn)規(guī)則需要注意的點(diǎn):
熱點(diǎn)規(guī)則相關(guān)源碼:
com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowChecker#passCheck
(對熱點(diǎn)參數(shù)規(guī)則的判斷邏輯都在這個方法里)系統(tǒng)規(guī)則全稱為系統(tǒng)保護(hù)規(guī)則,從名稱可以得知該規(guī)則是用于保護(hù)系統(tǒng)、防止系統(tǒng)負(fù)載過高而崩潰的,所以觸發(fā)系統(tǒng)規(guī)則后會對整個系統(tǒng)限流。添加系統(tǒng)規(guī)則如下圖所示:
設(shè)置系統(tǒng)規(guī)則比較簡單,選擇一個合適的閾值類型并填寫閾值即可:
關(guān)于閾值類型:
maxQPS * minRT
;(由Sentinel計算 )
com.alibaba.csp.sentinel.slots.system.SystemRuleManager#checkBbr
系統(tǒng)規(guī)則的判斷邏輯所在的源碼如下:
com.alibaba.csp.sentinel.slots.system.SystemRuleManager#checkSystem
授權(quán)規(guī)則用于限制某個資源僅允許哪個服務(wù)訪問,所以通常用于對服務(wù)消費(fèi)者的訪問權(quán)進(jìn)行控制。我們可以在簇點(diǎn)鏈路中為某個接口添加授權(quán)規(guī)則,這里以/shares/1
接口為例,如下:
新增授權(quán)規(guī)則:
/shares/1
接口,如果授權(quán)類型設(shè)置為黑名單則表示/shares/1
接口不允許test服務(wù)訪問。即白名單是授權(quán)某個服務(wù)訪問,黑名單則是限制某個服務(wù)訪問,從而實(shí)現(xiàn)訪問控制的效果。上面幾個關(guān)于規(guī)則的小節(jié)中已經(jīng)介紹了如何在Sentinel控制臺中配置各種規(guī)則,除此之外,Sentinel還支持在代碼中配置這些規(guī)則,所以本小節(jié)將簡單介紹一下如何在代碼中進(jìn)行配置。
代碼如下(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 rules = new ArrayList<>();
FlowRule rule = new FlowRule(resourceName);
// 針對來源
rule.setLimitApp("default");
// 設(shè)置閾值類型為QPS
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
// 單機(jī)閾值
rule.setCount(20);
// 將規(guī)則添加到規(guī)則列表
rules.add(rule);
// 加載規(guī)則列表
FlowRuleManager.loadRules(rules);
}
/**
* 添加降級規(guī)則
*
* @param resourceName 資源名稱
*/
private void addDegradeRule(String resourceName) {
List rules = new ArrayList<>();
DegradeRule rule = new DegradeRule(resourceName);
// 設(shè)置降級策略為 RT
rule.setGrade(RuleConstant.DEGRADE_GRADE_RT);
// set threshold RT, 10 ms(設(shè)置RT時間閾值)
rule.setCount(10);
// 時間窗口
rule.setTimeWindow(10);
rules.add(rule);
DegradeRuleManager.loadRules(rules);
}
/**
* 添加熱點(diǎn)規(guī)則
*
* @param resourceName 資源名稱
*/
private void addHotRule(String resourceName) {
ParamFlowRule rule = new ParamFlowRule(resourceName);
// 參數(shù)索引
rule.setParamIdx(0);
// 單機(jī)閾值
rule.setCount(5);
// 添加參數(shù)例外項
ParamFlowItem item = new ParamFlowItem();
// 參數(shù)類型
item.setClassType(int.class.getName());
// 參數(shù)值
item.setObject("5");
// 限流閾值
item.setCount(10);
rule.setParamFlowItemList(Collections.singletonList(item));
ParamFlowRuleManager.loadRules(Collections.singletonList(rule));
}
/**
* 添加系統(tǒng)規(guī)則
*/
private void addSystemRule() {
List rules = new ArrayList<>();
SystemRule rule = new SystemRule();
// 設(shè)置系統(tǒng)最高負(fù)載閾值
rule.setHighestSystemLoad(10);
rules.add(rule);
SystemRuleManager.loadRules(rules);
}
/**
* 添加授權(quán)規(guī)則
*
* @param resourceName 資源名稱
* @param limitApp 流控應(yīng)用(指調(diào)用方,多個調(diào)用方名稱使用英文逗號分隔)
*/
private void addAuthorityRule(String resourceName, String limitApp) {
AuthorityRule rule = new AuthorityRule();
// 資源名稱
rule.setResource(resourceName);
// 流控應(yīng)用
rule.setLimitApp(limitApp);
// 設(shè)置授權(quán)類型為白名單
rule.setStrategy(RuleConstant.AUTHORITY_WHITE);
AuthorityRuleManager.loadRules(Collections.singletonList(rule));
}
}
我們來測試添加流控規(guī)則,使用postman訪問測試接口,如下:
添加成功后,到Sentinel控制臺中,查看是否存在該規(guī)則:
從上圖中可以看到該流控規(guī)則已經(jīng)成功添加到Sentinel中了,證明測試成功。至于其他的規(guī)則也可以使用類似的方式添加,并且也都給出了代碼,這里就不一一去演示了。
下面總結(jié)一下Alibaba Sentinel各種規(guī)則的參數(shù),并且提供了官方文檔的鏈接,若未來本文不再適用,可以自行點(diǎn)擊鏈接前往官方文檔查看
1、流控規(guī)則:
Field | 說明 | 默認(rèn)值 |
---|---|---|
resource | 資源名,資源名是限流規(guī)則的作用對象 | 無 |
count | 限流閾值 | 無 |
grade | 限流閾值類型,QPS 或線程數(shù)模式 | QPS 模式 |
limitApp | 流控針對的調(diào)用來源 | default ,代表不區(qū)分調(diào)用來源 |
strategy | 判斷的根據(jù)是資源自身,還是根據(jù)其它關(guān)聯(lián)資源 (refResource ),還是根據(jù)鏈路入口 |
根據(jù)資源本身 |
controlBehavior | 流控效果(直接拒絕 / 排隊等待 / 慢啟動模式) | 直接拒絕 |
官方文檔:
2、降級規(guī)則:
Field | 說明 | 默認(rèn)值 |
---|---|---|
resource | 資源名,即限流規(guī)則的作用對象 | 無 |
count | 閾值 | 無 |
grade | 降級模式,根據(jù) RT 降級還是根據(jù)異常比例或異常數(shù)降級 | RT |
timeWindow | 降級的時間,單位為 s | 無 |
官方文檔:
3、熱點(diǎn)規(guī)則:
Field | 說明 | 默認(rèn)值 |
---|---|---|
resource | 資源名,即熱點(diǎn)規(guī)則的作用對象 | 無 |
count | 限流閾值,必填 | 無 |
grade | 限流模式 | QPS 模式 |
durationInSec | 統(tǒng)計窗口時間長度(單位為秒),1.6.0 版本開始支持 | 1s |
controlBehavior | 流控效果(支持快速失敗和勻速排隊模式),1.6.0 版本開始支持 | 快速失敗 |
maxQueueingTimeMs | 最大排隊等待時長(僅在勻速排隊模式生效),1.6.0 版本開始支持 | 0ms |
paramIdx | 熱點(diǎn)參數(shù)的索引,必填,對應(yīng) SphU.entry(xxx, args) 中的參數(shù)索引位置 | 無 |
paramFlowItemList | 參數(shù)例外項,可以針對指定的參數(shù)值單獨(dú)設(shè)置限流閾值,不受前面 count 閾值的限制。僅支持基本類型和字符串類型 | 無 |
clusterMode | 是否是集群參數(shù)流控規(guī)則 | false |
clusterConfig | 集群流控相關(guān)配置 | 無 |
官方文檔:
4、系統(tǒng)規(guī)則:
Field | 說明 | 默認(rèn)值 |
---|---|---|
highestSystemLoad | 最大的 load1 ,參考值 |
-1 (不生效) |
avgRt | 所有入口流量的平均響應(yīng)時間 | -1 (不生效) |
maxThread | 入口流量的最大并發(fā)數(shù) | -1 (不生效) |
qps | 所有入口資源的 QPS | -1 (不生效) |
官方文檔:
5、授權(quán)規(guī)則:
Field | 說明 | 默認(rèn)值 |
---|---|---|
resource | 資源名,即授權(quán)規(guī)則的作用對象 | 無 |
limitApp | 流控應(yīng)用(指調(diào)用方,即服務(wù)消費(fèi)者),對應(yīng)的黑名單/白名單,不同 origin 用英文逗號(, )分隔,如 appA,appB |
無 |
strategy | 限制模式,AUTHORITY_WHITE 為白名單模式,AUTHORITY_BLACK 為黑名單模式,默認(rèn)為白名單模式 |
AUTHORITY_WHITE |
官方文檔: