Spring Cloud Alibaba | Sentinel: 服務限流基礎篇
-
簡介
資源:可以是任何東西,服務,服務裡的方法,甚至是一段代碼。使用 Sentinel 來進行資源保護,主要分為幾個步驟:
定義資源
定義規則
檢驗規則是否生效
先把可能需要保護的資源定義好,之後再配置規則。也可以了解為,隻要有了資源,我們就可以在任何時候靈活地定義各種流量控制規則。在編碼的時候,隻需要考慮這個代碼是否需要保護,如果需要保護,就将之定義為一個資源。
- 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).
}
-
規則的種類
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