天天看點

Spring Cloud Alibaba | Sentinel: 服務限流基礎篇

Spring Cloud Alibaba | Sentinel: 服務限流基礎篇

  1. 簡介

    資源:可以是任何東西,服務,服務裡的方法,甚至是一段代碼。使用 Sentinel 來進行資源保護,主要分為幾個步驟:

定義資源

定義規則

檢驗規則是否生效

先把可能需要保護的資源定義好,之後再配置規則。也可以了解為,隻要有了資源,我們就可以在任何時候靈活地定義各種流量控制規則。在編碼的時候,隻需要考慮這個代碼是否需要保護,如果需要保護,就将之定義為一個資源。

  1. 2.1 主流架構的預設适配

為了減少開發的複雜程度,Sentinel對大部分的主流架構,例如 Web Servlet、Dubbo、Spring Cloud、gRPC、Spring WebFlux、Reactor 等都做了适配。

2.1.1 Web Servlet

Sentinel 提供與 Servlet 的整合,可以對 Web 請求進行流量控制。使用時需引入以下子產品(以 Maven 為例):

<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-web-servlet</artifactId>
<version>x.y.z</version>           

僅需要在 Web 容器中的 web.xml 配置檔案中進行如下配置即可開啟 Sentinel 支援:

<filter-name>SentinelCommonFilter</filter-name>
<filter-class>com.alibaba.csp.sentinel.adapter.servlet.CommonFilter</filter-class>           
<filter-name>SentinelCommonFilter</filter-name>
<url-pattern>/*</url-pattern>           

若是 Spring 應用可以通過 Spring 進行配置,例如:

@Configuration

public class FilterConfig {

@Bean

public FilterRegistrationBean sentinelFilterRegistration() {

FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
registration.setFilter(new CommonFilter());
registration.addUrlPatterns("/*");
registration.setName("sentinelFilter");
registration.setOrder(1);

return registration;           

}

預設情況下,當請求被限流時會傳回預設的提示頁面。您也可以通過 WebServletConfig.setBlockPage(blockPage) 方法設定自定義的跳轉 URL,當請求被限流時會自動跳轉至設定好的 URL。同樣也可以實作 UrlBlockHandler 接口并編寫定制化的限流處理邏輯,然後将其注冊至 WebCallbackManager 中。

注意: Sentinel Web Filter 會将每個到來的不同的 URL 都作為不同的資源處理,是以對于 REST 風格的 API,需要自行實作 UrlCleaner 接口清洗一下資源(比如将滿足 /foo/:id 的 URL 都歸到 /foo/* 資源下),然後将其注冊至 WebCallbackManager 中。否則會導緻資源數量過多,超出資源數量門檻值(目前是 6000)時多出的資源的規則将 不會生效。

2.1.2 Dubbo

Sentinel 提供 Dubbo 的相關适配 Sentinel Dubbo Adapter,主要包括針對 Service Provider 和 Service Consumer 實作的 Filter。相關子產品:

sentinel-apache-dubbo-adapter(相容 Apache Dubbo 2.7.x 及以上版本,自 Sentinel 1.5.1 開始支援)

sentinel-dubbo-adapter(相容 Dubbo 2.6.x 版本)

對于 Apache Dubbo 2.7.x 及以上版本,使用時需引入以下子產品(以 Maven 為例):

com.alibaba.csp

sentinel-apache-dubbo-adapter

x.y.z

對于 Dubbo 2.6.x 及以下版本,使用時需引入以下子產品(以 Maven 為例):

sentinel-dubbo-adapter

引入此依賴後,Dubbo 的服務接口和方法(包括調用端和服務端)就會成為 Sentinel 中的資源,在配置了規則後就可以自動享受到 Sentinel 的防護能力。

若不希望開啟 Sentinel Dubbo Adapter 中的某個 Filter,可以手動關閉對應的 Filter,比如:

限流粒度可以是服務接口和服務方法兩種粒度:

服務接口:resourceName 為 接口全限定名,如 com.alibaba.csp.sentinel.demo.dubbo.FooService

服務方法:resourceName 為 接口全限定名:方法簽名,如 com.alibaba.csp.sentinel.demo.dubbo.FooService:sayHello(java.lang.String)

2.1.3 Spring Cloud

引入依賴:

<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>           

下面這個例子就是一個最簡單的使用 Sentinel 的例子:

@SpringBootApplication

public class Application {

public static void main(String[] args) {

SpringApplication.run(ServiceApplication.class, args);           

@RestController

public class TestController {

@GetMapping(value = "/hello")

@SentinelResource("hello")

public String hello() {

return "Hello Sentinel";           

@SentinelResource 注解用來辨別資源是否被限流、降級。上述例子上該注解的屬性 'hello' 表示資源名。

@SentinelResource 用于定義資源,并提供可選的異常處理和 fallback 配置項。 @SentinelResource 注解包含以下屬性:

value:資源名稱,必需項(不能為空)

entryType:entry 類型,可選項(預設為 EntryType.OUT)

blockHandler / blockHandlerClass: blockHandler 對應處理 BlockException 的函數名稱,可選項。blockHandler 函數通路範圍需要是 public,傳回類型需要與原方法相比對,參數類型需要和原方法相比對并且最後加一個額外的參數,類型為 BlockException。blockHandler 函數預設需要和原方法在同一個類中。若希望使用其他類的函數,則可以指定 blockHandlerClass 為對應的類的 Class 對象,注意對應的函數必需為 static 函數,否則無法解析。

fallback:fallback 函數名稱,可選項,用于在抛出異常的時候提供 fallback 處理邏輯。fallback 函數可以針對所有類型的異常(除了 exceptionsToIgnore 裡面排除掉的異常類型)進行處理。fallback 函數簽名和位置要求:

傳回值類型必須與原函數傳回值類型一緻;

方法參數清單需要和原函數一緻,或者可以額外多一個 Throwable 類型的參數用于接收對應的異常;

fallback 函數預設需要和原方法在同一個類中。若希望使用其他類的函數,則可以指定 fallbackClass 為對應的類的 Class 對象,注意對應的函數必需為 static 函數,否則無法解析。

defaultFallback(since 1.6.0):預設的 fallback 函數名稱,可選項,通常用于通用的 fallback 邏輯(即可以用于很多服務或方法)。預設 fallback 函數可以針對所有類型的異常(除了 exceptionsToIgnore 裡面排除掉的異常類型)進行處理。若同時配置了 fallback 和 defaultFallback,則隻有 fallback 會生效。defaultFallback 函數簽名要求:

方法參數清單需要為空,或者可以額外多一個 Throwable 類型的參數用于接收對應的異常。

defaultFallback 函數預設需要和原方法在同一個類中。若希望使用其他類的函數,則可以指定 fallbackClass 為對應的類的 Class 對象,注意對應的函數必需為 static 函數,否則無法解析。

exceptionsToIgnore(since 1.6.0):用于指定哪些異常被排除掉,不會計入異常統計中,也不會進入 fallback 邏輯中,而是會原樣抛出。

特别地,若 blockHandler 和 fallback 都進行了配置,則被限流降級而抛出 BlockException 時隻會進入 blockHandler 處理邏輯。若未配置 blockHandler、fallback 和 defaultFallback,則被限流降級時會将 BlockException 直接抛出。

示例:

public class TestService {

// 對應的

handleException

函數需要位于

ExceptionUtil

類中,并且必須為 static 函數.

@SentinelResource(value = "test", blockHandler = "handleException", blockHandlerClass = {ExceptionUtil.class})

public void test() {

System.out.println("Test");           

// 原函數

@SentinelResource(value = "hello", blockHandler = "exceptionHandler", fallback = "helloFallback")

public String hello(long s) {

return String.format("Hello at %d", s);           

// Fallback 函數,函數簽名與原函數一緻或加一個 Throwable 類型的參數.

public String helloFallback(long s) {

return String.format("Halooooo %d", s);           

// Block 異常處理函數,參數最後多一個 BlockException,其餘與原函數一緻.

public String exceptionHandler(long s, BlockException ex) {

// Do some log here.
ex.printStackTrace();
return "Oops, error occurred at " + s;           

從 1.4.0 版本開始,注解方式定義資源支援自動統計業務異常,無需手動調用 Tracer.trace(ex) 來記錄業務異常。Sentinel 1.4.0 以前的版本需要自行調用 Tracer.trace(ex) 來記錄業務異常。

AspectJ

如果應用直接使用了 AspectJ,那麼需要在 aop.xml 檔案中引入對應的 Aspect:

Spring AOP

如果應用使用了 Spring AOP,需要通過配置的方式将 SentinelResourceAspect 注冊為一個 Spring Bean:

public class SentinelAspectConfiguration {

@Bean

public SentinelResourceAspect sentinelResourceAspect() {

return new SentinelResourceAspect();           

2.1.4 Spring WebFlux

注:從 1.5.0 版本開始支援,需要 Java 8 及以上版本。

Sentinel 提供與 Spring WebFlux 的整合子產品,進而 Reactive Web 應用也可以利用 Sentinel 的流控降級來保障穩定性。該整合子產品基于 Sentinel Reactor Adapter 實作。

使用時需引入以下子產品(以 Maven 為例):

sentinel-spring-webflux-adapter

使用時隻需注入對應的 SentinelWebFluxFilter 執行個體以及 SentinelBlockExceptionHandler 執行個體即可。比如:

public class WebFluxConfig {

private final List viewResolvers;

private final ServerCodecConfigurer serverCodecConfigurer;

public WebFluxConfig(ObjectProvider> viewResolversProvider,

ServerCodecConfigurer serverCodecConfigurer) {
this.viewResolvers = viewResolversProvider.getIfAvailable(Collections::emptyList);
this.serverCodecConfigurer = serverCodecConfigurer;           

@Order(-1)

public SentinelBlockExceptionHandler sentinelBlockExceptionHandler() {

// Register the block exception handler for Spring WebFlux.
return new SentinelBlockExceptionHandler(viewResolvers, serverCodecConfigurer);           

public SentinelWebFluxFilter sentinelWebFluxFilter() {

// Register the Sentinel WebFlux filter.
return new SentinelWebFluxFilter();           

您可以在 WebFluxCallbackManager 注冊回調進行定制:

setBlockHandler:注冊函數用于實作自定義的邏輯處理被限流的請求,對應接口為 BlockRequestHandler。預設實作為 DefaultBlockRequestHandler,當被限流時會傳回類似于下面的錯誤資訊:Blocked by Sentinel: FlowException。

setUrlCleaner:注冊函數用于 Web 資源名的歸一化。函數類型為 (ServerWebExchange, String) → String,對應含義為 (webExchange, originalUrl) → finalUrl。

setRequestOriginParser:注冊函數用于從請求中解析請求來源。函數類型為 ServerWebExchange → String。

2.1.5 gRPC

Sentinel 提供與 gRPC Java 的整合,以 gRPC ServerInterceptor 和 ClientInterceptor 的形式保護 gRPC 服務資源。

sentinel-grpc-adapter

在使用 Sentinel gRPC Adapter 時,隻需要将對應的 Interceptor 注冊至對應的用戶端或服務端中。其中用戶端的示例如下:

public class ServiceClient {

private final ManagedChannel channel;

ServiceClient(String host, int port) {

this.channel = ManagedChannelBuilder.forAddress(host, port)
    .intercept(new SentinelGrpcClientInterceptor()) // 在此處注冊攔截器
    .build();
// 在此處初始化用戶端 stub 類           

服務端的示例如下:

import io.grpc.Server;

Server server = ServerBuilder.forPort(port)

.addService(new MyServiceImpl()) // 添加自己的服務實作
 .intercept(new SentinelGrpcServerInterceptor()) // 在此處注冊攔截器
 .build();           

注意:由于 gRPC 攔截器中 ClientCall/ServerCall 以回調的形式進行請求響應資訊的擷取,每次 gRPC 服務調用計算出的 RT 可能會不準确。Sentinel gRPC Adapter 目前隻支援 unary call。

2.1.6 Reactive

Sentinel 提供 Reactor 的适配,可以友善地在 reactive 應用中接入 Sentinel。

sentinel-reactor-adapter

Sentinel Reactor Adapter 分别針對 Mono 和 Flux 實作了對應的 Sentinel Operator,進而在各種事件觸發時彙入 Sentinel 的相關邏輯。同時 Sentinel 在上層提供了 SentinelReactorTransformer 用于在組裝期裝入對應的 operator,使用者使用時隻需要通過 transform 操作符來進行變換即可。

接入示例:

someService.doSomething() // return type: Mono or Flux

.transform(new SentinelReactorTransformer<>(resourceName)) // 在此處進行變換

.subscribe();

2.1.7 API Gateway

Sentinel 支援對 Spring Cloud Gateway、Zuul 等主流的 API Gateway 進行限流。

Spring Cloud Gateway

從 1.6.0 版本開始,Sentinel 提供了 Spring Cloud Gateway 的适配子產品,可以提供兩種資源次元的限流:

route 次元:即在 Spring 配置檔案中配置的路由條目,資源名為對應的 routeId

自定義 API 次元:使用者可以利用 Sentinel 提供的 API 來自定義一些 API 分組

sentinel-spring-cloud-gateway-adapter

使用時隻需注入對應的 SentinelGatewayFilter 執行個體以及 SentinelGatewayBlockExceptionHandler 執行個體即可。比如:

public class GatewayConfiguration {

private final List<ViewResolver> viewResolvers;
private final ServerCodecConfigurer serverCodecConfigurer;

public GatewayConfiguration(ObjectProvider<List<ViewResolver>> viewResolversProvider,
                            ServerCodecConfigurer serverCodecConfigurer) {
    this.viewResolvers = viewResolversProvider.getIfAvailable(Collections::emptyList);
    this.serverCodecConfigurer = serverCodecConfigurer;
}

@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler() {
    // Register the block exception handler for Spring Cloud Gateway.
    return new SentinelGatewayBlockExceptionHandler(viewResolvers, serverCodecConfigurer);
}

@Bean
@Order(-1)
public GlobalFilter sentinelGatewayFilter() {
    return new SentinelGatewayFilter();
}           

因為Sentinel暫時隻支援了Zuul1.x,具體用發這裡暫不介紹。

2.1.8 Apache RocketMQ

在 Apache RocketMQ 中,當消費者去消費消息的時候,無論是通過 pull 的方式還是 push 的方式,都可能會出現大批量的消息突刺。如果此時要處理所有消息,很可能會導緻系統負載過高,影響穩定性。但其實可能後面幾秒之内都沒有消息投遞,若直接把多餘的消息丢掉則沒有充分利用系統處理消息的能力。我們希望可以把消息突刺均攤到一段時間内,讓系統負載保持在消息處理水位之下的同時盡可能地處理更多消息,進而起到“削峰填谷”的效果:

上圖中紅色的部分代表超出消息處理能力的部分。我們可以看到消息突刺往往都是瞬時的、不規律的,其後一段時間系統往往都會有空閑資源。我們希望把紅色的那部分消息平攤到後面空閑時去處理,這樣既可以保證系統負載處在一個穩定的水位,又可以盡可能地處理更多消息。Sentinel 專門為這種場景提供了勻速器的特性,可以把突然到來的大量請求以勻速的形式均攤,以固定的間隔時間讓請求通過,以穩定的速度逐漸處理這些請求,起到“削峰填谷”的效果,進而避免流量突刺造成系統負載過高。同時堆積的請求将會排隊,逐漸進行處理;當請求排隊預計超過最大逾時時長的時候則直接拒絕,而不是拒絕全部請求。

比如在 RocketMQ 的場景下配置了勻速模式下請求 QPS 為 5,則會每 200 ms 處理一條消息,多餘的處理任務将排隊;同時設定了逾時時間為 5 s,預計排隊時長超過 5 s 的處理任務将會直接被拒絕。示意圖如下圖所示:

RocketMQ 使用者可以根據不同的 group 和不同的 topic 分别設定限流規則,限流控制模式設定為勻速器模式(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER),比如:

private void initFlowControlRule() {

FlowRule rule = new FlowRule();
rule.setResource(KEY); // 對應的 key 為 `groupName:topicName`
rule.setCount(5);
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setLimitApp("default");

// 勻速器模式下,設定了 QPS 為 5,則請求每 200 ms 允許通過 1 個
rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER);
// 如果更多的請求到達,這些請求會被置于虛拟的等待隊列中。等待隊列有一個 max timeout,如果請求預計的等待時間超過這個時間會直接被 block
// 在這裡,timeout 為 5s
rule.setMaxQueueingTimeMs(5 * 1000);
FlowRuleManager.loadRules(Collections.singletonList(rule));           

2.2 抛出異常的方式定義資源

SphU 包含了 try-catch 風格的 API。用這種方式,當資源發生了限流之後會抛出 BlockException。這個時候可以捕捉異常,進行限流之後的邏輯處理。示例代碼如下:

// 1.5.0 版本開始可以利用 try-with-resources 特性

// 資源名可使用任意有業務語義的字元串,比如方法名、接口名或其它可唯一辨別的字元串。

try (Entry entry = SphU.entry("resourceName")) {

// 被保護的業務邏輯

// do something here...

} catch (BlockException ex) {

// 資源通路阻止,被限流或被降級

// 在此處進行相應的處理操作

特别地 ,若 entry 的時候傳入了熱點參數,那麼 exit 的時候也一定要帶上對應的參數(exit(count, args)),否則可能會有統計錯誤。這個時候不能使用 try-with-resources 的方式。另外通過 Tracer.trace(ex) 來統計異常資訊時,由于 try-with-resources 文法中 catch 調用順序的問題,會導緻無法正确統計異常數,是以統計異常資訊時也不能在 try-with-resources 的 catch 塊中調用 Tracer.trace(ex)。

1.5.0 之前的版本的示例:

Entry entry = null;

// 務必保證finally會被執行

try {

// 資源名可使用任意有業務語義的字元串

entry = SphU.entry("自定義資源名");

// do something...

} catch (BlockException e1) {

// 進行相應的處理操作

} finally {

if (entry != null) {

entry.exit();           

注意 : SphU.entry(xxx) 需要與 entry.exit() 方法成對出現,比對調用,否則會導緻調用鍊記錄異常,抛出 ErrorEntryFreeException 異常。

2.3 傳回布爾值方式定義資源

SphO 提供 if-else 風格的 API。用這種方式,當資源發生了限流之後會傳回 false,這個時候可以根據傳回值,進行限流之後的邏輯處理。示例代碼如下:

// 資源名可使用任意有業務語義的字元串

if (SphO.entry("自定義資源名")) {

// 務必保證finally會被執行

try {

/**
* 被保護的業務邏輯
*/           
SphO.exit();           

} else {

2.4 注解方式定義資源

Sentinel 支援通過 @SentinelResource 注解定義資源并配置 blockHandler 和 fallback 函數來進行限流之後的處理。示例:

// 原本的業務方法.

@SentinelResource(blockHandler = "blockHandlerForGetUser")

public User getUserById(String id) {

throw new RuntimeException("getUserById command failed");           

// blockHandler 函數,原方法調用被限流/降級/系統保護的時候調用

public User blockHandlerForGetUser(String id, BlockException ex) {

return new User("admin");           

注意 blockHandler 函數會在原方法被限流/降級/系統保護的時候調用,而 fallback 函數會針對所有類型的異常。請注意 blockHandler 和 fallback 函數的形式要求。

2.5 異步調用支援

Sentinel 支援異步調用鍊路的統計。在異步調用中,需要通過 SphU.asyncEntry(xxx) 方法定義資源,并通常需要在異步的回調函數中調用 exit 方法。以下是一個簡單的示例:

AsyncEntry entry = SphU.asyncEntry(resourceName);

// 異步調用.
doAsync(userId, result -> {
    try {
        // 在此處處理異步調用的結果.
    } finally {
        // 在回調結束後 exit.
        entry.exit();
    }
});           
// Request blocked.
// Handle the exception (e.g. retry or fallback).           

SphU.asyncEntry(xxx) 不會影響目前(調用線程)的 Context,是以以下兩個 entry 在調用鍊上是平級關系(處于同一層),而不是嵌套關系:

// 調用鍊類似于:

// -parent

// ---asyncResource

// ---syncResource

asyncEntry = SphU.asyncEntry(asyncResource);

entry = SphU.entry(normalResource);

若在異步回調中需要嵌套其它的資源調用(無論是 entry 還是 asyncEntry),隻需要借助 Sentinel 提供的上下文切換功能,在對應的地方通過 ContextUtil.runOnContext(context, f) 進行 Context 變換,将對應資源調用處的 Context 切換為生成的異步 Context,即可維持正确的調用鍊路關系。示例如下:

public void handleResult(String result) {

Entry entry = null;
try {
    entry = SphU.entry("handleResultForAsync");
    // Handle your result here.
} catch (BlockException ex) {
    // Blocked for the result handler.
} finally {
    if (entry != null) {
        entry.exit();
    }
}           

public void someAsync() {

try {
    AsyncEntry entry = SphU.asyncEntry(resourceName);

    // Asynchronous invocation.
    doAsync(userId, result -> {
        // 在異步回調中進行上下文變換,通過 AsyncEntry 的 getAsyncContext 方法擷取異步 Context
        ContextUtil.runOnContext(entry.getAsyncContext(), () -> {
            try {
                // 此處嵌套正常的資源調用.
                handleResult(result);
            } finally {
                entry.exit();
            }
        });
    });
} catch (BlockException ex) {
    // Request blocked.
    // Handle the exception (e.g. retry or fallback).
}           
  1. 規則的種類

    Sentinel 的所有規則都可以在記憶體态中動态地查詢及修改,修改之後立即生效。同時 Sentinel 也提供相關 API,供您來定制自己的規則政策。

Sentinel 支援以下幾種規則:流量控制規則 、熔斷降級規則 、系統保護規則 、來源通路控制規則 和 熱點參數規則 。

3.1 流量控制規則 (FlowRule)

流量規則的定義

重要屬性:

Field 說明 預設值

resource 資源名,資源名是限流規則的作用對象

count 限流門檻值

grade 限流門檻值類型,QPS 或線程數模式 QPS 模式

limitApp 流控針對的調用來源 default,代表不區分調用來源

strategy 判斷的根據是資源自身,還是根據其它關聯資源 (refResource),還是根據鍊路入口 根據資源本身

controlBehavior 流控效果(直接拒絕 / 排隊等待 / 慢啟動模式) 直接拒絕

同一個資源可以同時有多個限流規則。

通過代碼定義流量控制規則

了解上面規則的定義之後,我們可以通過調用 FlowRuleManager.loadRules() 方法來用寫死的方式定義流量控制規則,比如:

private void initFlowQpsRule() {

List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule(resourceName);
// set limit qps to 20
rule.setCount(20);
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setLimitApp("default");
rules.add(rule);
FlowRuleManager.loadRules(rules);           

3.2 熔斷降級規則 (DegradeRule)

熔斷降級規則包含下面幾個重要的屬性:

resource 資源名,即限流規則的作用對象

count 門檻值

grade 降級模式,根據 RT 降級還是根據異常比例降級

timeWindow 降級的時間,機關為 s

同一個資源可以同時有多個降級規則。

了解上面規則的定義之後,我們可以通過調用 DegradeRuleManager.loadRules() 方法來用寫死的方式定義流量控制規則。

private void initDegradeRule() {

List<DegradeRule> rules = new ArrayList<>();
DegradeRule rule = new DegradeRule();
rule.setResource(KEY);
// set threshold RT, 10 ms
rule.setCount(10);
rule.setGrade(RuleConstant.DEGRADE_GRADE_RT);
rule.setTimeWindow(10);
rules.add(rule);
DegradeRuleManager.loadRules(rules);           

3.3 系統保護規則 (SystemRule)

規則包含下面幾個重要的屬性:

highestSystemLoad 最大的 load1,參考值 -1 (不生效)

avgRt 所有入口流量的平均響應時間 -1 (不生效)

maxThread 入口流量的最大并發數 -1 (不生效)

qps 所有入口資源的 QPS -1 (不生效)

了解上面規則的定義之後,我們可以通過調用 SystemRuleManager.loadRules() 方法來用寫死的方式定義流量控制規則。

private void initSystemRule() {

List<SystemRule> rules = new ArrayList<>();
SystemRule rule = new SystemRule();
rule.setHighestSystemLoad(10);
rules.add(rule);
SystemRuleManager.loadRules(rules);           

3.4 通路控制規則 (AuthorityRule)

很多時候,我們需要根據調用方來限制資源是否通過,這時候可以使用 Sentinel 的通路控制(黑白名單)的功能。黑白名單根據資源的請求來源(origin)限制資源是否通過,若配置白名單則隻有請求來源位于白名單内時才可通過;若配置黑名單則請求來源位于黑名單時不通過,其餘的請求通過。

授權規則,即黑白名單規則(AuthorityRule)非常簡單,主要有以下配置項:

resource:資源名,即限流規則的作用對象

limitApp:對應的黑名單/白名單,不同 origin 用 , 分隔,如 appA,appB

strategy:限制模式,AUTHORITY_WHITE 為白名單模式,AUTHORITY_BLACK 為黑名單模式,預設為白名單模式

原文位址

https://www.cnblogs.com/babycomeon/p/11210884.html