4. Spring Cloud Alibaba整合Sentinel + 規則配置詳解
4.1 Spring Cloud Alibaba整合Sentinel
4.1.1 引入依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloudalibaba</artifactId>
<groupId>com.xiexie.springcloud</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>order-sentinel</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--集成alibaba-sentinel 啟動器-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
4.1.2 添加配置
server:
port: 8070
main:
allow-bean-definition-overriding: true
spring:
application:
name: oser-sentinel
cloud:
sentinel:
transport:
# 添加sentinel的控制台地址
dashboard: 127.0.0.1:8858
# 指定應用與Sentinel控制台交互的端口,應用本地會起一個該端口占用的HttpServer
# port: 8719
web-context-unify: false # 默認將調用鏈路收斂,需要打開才可以進行鏈路流控
4.1.3 測試
在sentinel控制台中設置流控規則
- 資源名: 接口的API
- 針對來源: 默認是default,當多個微服務都調用這個資源時,可以配置微服務名來對指定的微服務設置閾值
- 閾值類型: 分為QPS和線程數 假設閾值為10
- QPS類型: 只得是每秒訪問接口的次數>10就進行限流
- 線程數: 為接受請求該資源分配的線程數>10就進行限流

測試: 因為QPS是1,所以1秒內多次訪問會出現如下情形:

4.1.4 微服務和Sentinel Dashboard通信原理
Sentinel控制台與微服務端之間,實現了一套服務發現機制,集成了Sentinel的微服務都會將元數據傳遞給Sentinel控制台,架構圖如下所示:

流控針對privoder 熔斷降級 針對consumer
4.1.5 BlockException異常統一處理
springwebmvc接口資源限流入口在HandlerInterceptor的實現類AbstractSentinelInterceptor的preHandle方法中,對異常的處理是BlockExceptionHandler的實現類
自定義BlockExceptionHandler 的實現類統一處理BlockException
package com.xiexie.order.exception;
import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException;
import com.alibaba.csp.sentinel.slots.system.SystemBlockException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.xiexie.order.domain.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @Description 流控統一異常處理類(就不需要@SentinelResource注解)
* @Date 2022-04-13 14:43
* @Author xie
*/
@Component
@Slf4j
public class MyBlockExceptionHandler implements BlockExceptionHandler {
public void handle(
HttpServletRequest request,
HttpServletResponse response,
BlockException e) throws Exception {
log.info("BlockExceptionHandlerBlockException================" + e.getRule());
Result result = null;
if (e instanceof FlowException) {
result = Result.error(100, "接口限流了");
} else if (e instanceof DegradeException) {
result = Result.error(101, "服務降級了");
} else if (e instanceof ParamFlowException) {
result = Result.error(102, "熱點參數限流了");
} else if (e instanceof SystemBlockException) {
result = Result.error(103, "觸發系統保護規則了");
} else if (e instanceof AuthorityException) {
result = Result.error(104, "授權規則不通過");
}
//返回json數據
response.setStatus(500);
response.setCharacterEncoding("utf8");
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
new ObjectMapper().writeValue(response.getWriter(), result);
}
}
4.2 規則配置詳解
4.2.1 實時監控
監控接口的通過的QPS和拒絕的QPS

4.2.2 簇點鏈路
用來顯示微服務的所監控的API

4.2.3 流控規則
官方文檔:https://github.com/alibaba/Sentinel/wiki/流量控制
代碼使用:https://github.com/alibaba/Sentinel/wiki/如何使用
流量控制(flow control),其原理是監控應用流量的 QPS 或並發線程數等指標,當達到指定的閾值時對流量進行控制,以避免被瞬時的流量高峰沖垮,從而保障應用的高可用性。
==== FlowRule RT(響應時間) 1/0.2s =5


同一個資源可以創建多條限流規則。FlowSlot 會對該資源的所有限流規則依次遍歷,直到有規則觸發限流或者所有規則遍歷完畢。一條限流規則主要由下面幾個因素組成,我們可以組合這些元素來實現不同的限流效果。

參考文檔:https://github.com/alibaba/Sentinel/wiki/流量控制
4.2.3.1 限流閾值類型
· QPS(Query Per Second):每秒請求數,就是說服務器在一秒的時間內處理了多少個請求。
進入簇點鏈路選擇具體的訪問的API,然后點擊流控按鈕

測試

· 並發線程數
並發數控制用於保護業務線程池不被慢調用耗盡。
例如,當應用所依賴的下游應用由於某種原因導致服務不穩定、響應延遲增加,對於調用者來說,意味着吞吐量下降和更多的線程數占用,極端情況下甚至導致線程池耗盡。
為應對太多線程占用的情況,業內有使用隔離的方案,比如通過不同業務邏輯使用不同線程池來隔離業務自身之間的資源爭搶(線程池隔離)。這種隔離方案雖然隔離性比較好,但是代價就是線程數目太多,線程上下文切換的 overhead 比較大,特別是對低延時的調用有比較大的影響。
Sentinel 並發控制不負責創建和管理線程池,而是簡單統計當前請求上下文的線程數目(正在執行的調用數目),如果超出閾值,新的請求會被立即拒絕,效果類似於信號量隔離。並發數控制通常在調用端進行配置。

4.2.3.2 流控模式
基於調用關系的流量控制。調用關系包括調用方、被調用方;一個方法可能會調用其它方法,形成一個調用鏈路的層次關系。
· 直接
資源調用達到設置的閾值后直接被流控拋出異常
· 關聯
當兩個資源之間具有資源爭搶或者依賴關系的時候,這兩個資源便具有了關聯。比如對數據庫同一個字段的讀操作和寫操作存在爭搶,讀的速度過高會影響寫得速度,寫的速度過高會影響讀的速度。如果放任讀寫操作爭搶資源,則爭搶本身帶來的開銷會降低整體的吞吐量。可使用關聯限流來避免具有關聯關系的資源之間過度的爭搶,舉例來說,read_db 和write_db 這兩個資源分別代表數據庫讀寫,我們可以給 read_db 設置限流規則來達到寫優先的目的:設置 strategy 為RuleConstant.STRATEGY_RELATE 同時設置 refResource 為 write_db。這樣當寫庫操作過於頻繁時,讀數據的請求會被限流。

· 鏈路
根據調用鏈路入口限流。
下面中記錄了資源之間的調用鏈路,這些資源通過調用關系,相互之間構成一棵調用樹。這棵樹的根節點是一個名字為getUser 的虛擬節點,調用鏈的入口都是這個虛節點的子節點。
一棵典型的調用樹如下圖所示:
getUser
/ \
/ \
/order/test1 /order/test2
上圖中來自入口 /order/test1 和 /order/test2的請求都調用到了資源 getUser,Sentinel 允許只根據某個入口的統計信息對資源限流。

測試會發現鏈路規則不生效
注意,高版本此功能直接使用不生效,如何解決?
從1.6.3 版本開始,Sentinel Web filter默認收斂所有URL的入口context,因此鏈路限流不生效。
1.7.0 版本開始(對應SCA的2.1.1.RELEASE),官方在CommonFilter 引入了WEB_CONTEXT_UNIFY 參數,用於控制是否收斂context。將其配置為 false 即可根據不同的URL 進行鏈路限流。
SCA 2.1.1.RELEASE之后的版本,可以通過配置spring.cloud.sentinel.web-context-unify=false即可關閉收斂SCA 2.1.1.RELEASE之后的版本,可以通過配置spring.cloud.sentinel.web-context-unify=false即可關閉收斂
此場景攔截不到BlockException,對應@SentinelResource指定的資源必須在@SentinelResource注解中指定blockHandler處理BlockException
點擊查看代碼
package com.xiexie.order.service;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.stereotype.Service;
/**
* @Description
* @Date 2022-04-13 15:24
* @Author xie
*/
@Service
public class OrderServiceImpl implements IOrderService {
/**
* @SentinelResource 不止針對路徑參數,還可以針對方法,
* 但是此場景攔截不到BlockException,所以BlockExceptionHandler不起作用,需要重新實現blockHandler
* @return java.lang.String
*/
@SentinelResource(value = "getUser", blockHandler = "blockHandlerGetUser")
public String getUser() {
return "查詢用戶";
}
public String blockHandlerGetUser(BlockException e) {
e.printStackTrace();
return "查詢用戶-被限流了";
}
}
package com.xiexie.order.controller;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.xiexie.order.service.IOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.concurrent.TimeUnit;
/**
* @Description
* @Date 2022-04-07 14:46
* @Author xie
*/
@RestController
@RequestMapping("/order")
public class OrderSentinelController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private IOrderService orderService;
@RequestMapping("sentinel")
public String sentinel() {
return "hello sentinel";
}
/**
* 測試流控規則 - QPS
* @return java.lang.String
*/
@RequestMapping("flow")
//@SentinelResource(value = "flow", blockHandler = "blockHandlerFlow")
public String flow() {
return "hello flow";
}
public String blockHandlerFlow(BlockException e) {
return "hello flow 進入流控了";
}
/**
* 測試流控規則 - 線程數隔離
* @return java.lang.String
*/
@RequestMapping("flowThread")
@SentinelResource(value = "flowThread", blockHandler = "blockHandlerFlow")
public String flowThread() throws InterruptedException {
TimeUnit.SECONDS.sleep(5);
return "hello flowThread";
}
/************************ 測試關聯流控 ****************************/
@RequestMapping("/add")
public String add() {
System.out.println("下單成功");
return "生成訂單";
}
@RequestMapping("/get")
public String get() throws InterruptedException {
return "查詢訂單";
}
/************************ 測試鏈路流控 ****************************/
@RequestMapping("/test1")
public String test1() {
return orderService.getUser();
}
@RequestMapping("/test2")
public String test2() {
return orderService.getUser();
}
}
總結: 為了解決鏈路規則引入ComonFilter的方式,除了此處問題,還會導致更多的問題,不建議使用ComonFilter的方式。 流控鏈路模式的問題等待官方后續修復,或者使用AHAS。
4.2.3.3 流控效果
· 快速失敗
官方文檔更詳細:https://github.com/alibaba/Sentinel/wiki/流量控制
(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)方式是默認的流量控制方式,當QPS超過任意規則的閾值后,新的請求就會被立即拒絕,拒絕方式為拋出FlowException。這種方式適用於對系統處理能力確切已知的情況下,比如通過壓測確定了系統的准確水位時。
· Warm Up(激增流量)
Warm Up(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即預熱/冷啟動方式。當系統長期處於低水位的情況下,當流量突然增加時,直接把系統拉升到高水位可能瞬間把系統壓垮。通過"冷啟動",讓通過的流量緩慢增加,在一定時間內逐漸增加到閾值上限,給冷系統一個預熱的時間,避免冷系統被壓垮。
詳細文檔可以參考 流量控制 - Warm Up 文檔,具體的例子可以參見 WarmUpFlowDemo。
冷加載因子: codeFactor 默認是3,即請求 QPS 從 threshold / 3 開始,經預熱時長逐漸升至設定的 QPS 閾值。通常冷啟動的過程系統允許通過的 QPS 曲線如下圖所示

測試用例:
@RequestMapping("/warmUp")
public String warmUp() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "warmUp";
}
編輯流控規則

· 排隊等待(脈沖流量)
勻速排隊(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式會嚴格控制請求通過的間隔時間,也即是讓請求以均勻的速度通過,對應的是漏桶算法。
該方式的作用如下圖所示:

這種方式主要用於處理間隔性突發的流量,例如消息隊列。想象一下這樣的場景,在某一秒有大量的請求到來,而接下來的幾秒則處於空閑狀態,我們希望系統能夠在接下來的空閑期間逐漸處理這些請求,而不是在第一秒直接拒絕多余的請求。
注意:勻速排隊模式暫時不支持 QPS > 1000 的場景。
4.2.4 降級規則(熔斷降級)
官方文檔:https://github.com/alibaba/Sentinel/wiki/熔斷降級
代碼使用:https://github.com/alibaba/Sentinel/wiki/如何使用
除了流量控制以外,對調用鏈路中不穩定的資源進行熔斷降級也是保障高可用的重要措施之一。我們需要對不穩定的弱依賴服務調用進行熔斷降級,暫時切斷不穩定調用,避免局部不穩定因素導致整體的雪崩。熔斷降級作為保護自身的手段,通常在客戶端(調用端)進行配置。


4.2.4.1 熔斷降級規則說明
熔斷降級規則(DegradeRule)包含下面幾個重要的屬性:

4.2.4.2 熔斷策略
-
慢調用比例
慢調用比例 (SLOW_REQUEST_RATIO):選擇以慢調用比例作為閾值,需要設置允許的慢調用RT(即最大的響應時間),請求的響應時間大於該值則統計為慢調用。當單位統計時長(statIntervalMs)內請求數目大於設置的最小請求數目,並且慢調用的比例大於閾值,則接下來的熔斷時長內請求會自動被熔斷。經過熔斷時長后熔斷器會進入探測恢復狀態(HALF-OPEN狀態),若接下來的一個請求響應時間小於設置的慢調用 RT 則結束熔斷,若大於設置的慢調用 RT 則會再次被熔斷。

-
異常比例
異常比例 (ERROR_RATIO):當單位統計時長(statIntervalMs)內請求數目大於設置的最小請求數目,並且異常的比例大於閾值,則接下來的熔斷時長內請求會自動被熔斷。經過熔斷時長后熔斷器會進入探測恢復狀態(HALF-OPEN 狀態),若接下來的一個請求成功完成(沒有錯誤)則結束熔斷,否則會再次被熔斷。異常比率的閾值范圍是 [0.0, 1.0],代表 0%-100%。
@RequestMapping("/test2")
public String test2() {
atomicInteger.getAndIncrement();
if (atomicInteger.get() % 2 == 0){
//模擬異常和異常比率
int i = 1/0;
}
return "========test2()========";
}

- 異常數
異常數 (ERROR_COUNT):當單位統計時長內的異常數目超過閾值之后會自動進行熔斷。經過熔斷時長后熔斷器會進入探測恢復狀態(HALF-OPEN 狀態),若接下來的一個請求成功完成(沒有錯誤)則結束熔斷,否則會再次被熔斷。
注意:異常降級僅針對業務異常,對 Sentinel 限流降級本身的異常(BlockException)不生效。

4.2.5 熱點規則(熱點參數限流)
官方文檔:https://github.com/alibaba/Sentinel/wiki/熱點參數限流
代碼使用:https://github.com/alibaba/Sentinel/wiki/如何使用
熱點識別流控
何為熱點?熱點即經常訪問的數據。很多時候我們希望統計某個熱點數據中訪問頻次最高的數據,並對其訪問進行限制。比如:
- 商品 ID 為參數,統計一段時間內最常購買的商品 ID 並進行限制
- 用戶 ID 為參數,針對一段時間內頻繁訪問的用戶 ID 進行限制

熱點參數限流會統計傳入參數中的熱點參數,並根據配置的限流閾值與模式,對包含熱點參數的資源調用進行限流。熱點參數限流可以看做是一種特殊的流量控制,僅對包含熱點參數的資源調用生效。

注意:
- 1. 熱點規則需要使用@SentinelResource("resourceName")注解,否則不生效
- 2. 參數必須是7種基本數據類型才會生效
@RequestMapping("/info/{id}")
@SentinelResource(value = "userinfo",
blockHandlerClass = CommonBlockHandler.class,
blockHandler = "handleException2",
fallbackClass = CommonFallback.class,
fallback = "fallback"
)
public R info(@PathVariable("id") Integer id){
UserEntity user = userService.getById(id);
return R.ok().put("user", user);
}
單機閾值: 針對所有參數的值進行設置的一個公共的閾值
- 1. 假設當前 參數 大部分的值都是熱點流量, 單機閾值就是針對熱點流量進行設置, 額外針對普通流量進行參數值流控
- 2. 假設當前 參數 大部分的值都是普通流量, 單機閾值就是針對普通流量進行設置, 額外針對熱點流量進行參數值流控
配置熱點參數規則
注意: 資源名必須是@SentinelResource(value="資源名")中 配置的資源名,熱點規則依賴於注解

具體到參數值限流,配置參數值為3,限流閾值為1

測試:
http://localhost:8800/user/info/1 限流的閾值為3
http://localhost:8800/user/info/3 限流的閾值為1

4.2.6 系統規則
官方文檔:https://github.com/alibaba/Sentinel/wiki/系統自適應限流
代碼使用:https://github.com/alibaba/Sentinel/wiki/如何使用

Sentinel 系統自適應限流從整體維度對應用入口流量進行控制,結合應用的 Load、CPU 使用率、總體平均 RT、入口QPS 和並發線程數等幾個維度的監控指標,通過自適應的流控策略,讓系統的入口流量和系統的負載達到一個平衡,讓系統盡可能跑在最大吞吐量的同時保證系統整體的穩定性。
- Load 自適應(僅對 Linux/Unix-like 機器生效):系統的 load1 作為啟發指標,進行自適應系統保護。當系統load1 超過設定的啟發值,且系統當前的並發線程數超過估算的系統容量時才會觸發系統保護(BBR 階段)。系統容量由系統的
maxQps * minRt估算得出。設定參考值一般是CPU cores * 2.5。
https://www.cnblogs.com/gentlemanhai/p/8484839.html - CPU usage(1.5.0+ 版本):當系統 CPU 使用率超過閾值即觸發系統保護(取值范圍 0.0-1.0),比較靈敏。
- 平均 RT:當單台機器上所有入口流量的平均 RT 達到閾值即觸發系統保護,單位是毫秒。
- 並發線程數:當單台機器上所有入口流量的並發線程數達到閾值即觸發系統保護。
- 入口 QPS:當單台機器上所有入口流量的 QPS 達到閾值即觸發系統保護。

4.2.6 授權控制規則
官方文檔:https://github.com/alibaba/Sentinel/wiki/黑白名單控制
代碼使用:https://github.com/alibaba/Sentinel/wiki/如何使用
很多時候,我們需要根據調用來源來判斷該次請求是否允許放行,這時候可以使用 Sentinel 的來源訪問控制(黑白名單控制)的功能。來源訪問控制根據資源的請求來源(origin)限制資源是否通過,若配置白名單則只有請求來源位於白名單內時才可通過;若配置黑名單則請求來源位於黑名單時不通過,其余的請求通過。
來源訪問控制規則(AuthorityRule)非常簡單,主要有以下配置項:
- resource:資源名,即限流規則的作用對象。
- limitApp:對應的黑名單/白名單,不同
origin用 , 分隔,如 appA,appB。 - strategy:限制模式,
AUTHORITY_WHITE為白名單模式,AUTHORITY_BLACK為黑名單模式,默認為白名單模式。

第一步:實現com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser接口,在parseOrigin方法中區分來源,並交給spring管理
注意:如果引入CommonFilter,此處會多出一個

import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
/**
* @author Fox
*/
@Component
public class MyRequestOriginParser implements RequestOriginParser {
/**
* 通過request獲取來源標識,交給授權規則進行匹配
* @param request
* @return
*/
@Override
public String parseOrigin(HttpServletRequest request) {
// 標識字段名稱可以自定義
String origin = request.getParameter("serviceName");
// if (StringUtil.isBlank(origin)){
// throw new IllegalArgumentException("serviceName參數未指定");
// }
return origin;
}
}
測試:origin是order的請求不通過。

4.2.7 集群規則
官方文檔:https://github.com/alibaba/Sentinel/wiki/集群流控
代碼使用:https://github.com/alibaba/Sentinel/wiki/如何使用
為什么要使用集群流控呢?假設我們希望給某個用戶限制調用某個 API 的總 QPS 為 50,但機器數可能很多(比如有 100 台)。這時候我們很自然地就想到,找一個 server 來專門來統計總的調用量,其它的實例都與這台 server 通信來判斷是否可以調用。這就是最基礎的集群流控的方式。另外集群流控還可以解決流量不均勻導致總體限流效果不佳的問題。假設集群中有 10 台機器,我們給每台機器設置單機限流閾值為 10 QPS,理想情況下整個集群的限流閾值就為 100 QPS。不過實際情況下流量到每台機器可能會不均勻,會導致總量沒有到的情況下某些機器就開始限流。因此僅靠單機維度去限制的話會無法精確地限制總體流量。而集群流控可以精確地控制整個集群的調用總量,結合單機限流兜底,可以更好地發揮流量控制的效果。
https://github.com/alibaba/Sentinel/wiki/集群流控
集群流控中共有兩種身份:
- Token Client:集群流控客戶端,用於向所屬 Token Server 通信請求 token。集群限流服務端會返回給客戶端結果,決定是否限流。
- Token Server:即集群流控服務端,處理來自 Token Client 的請求,根據配置的集群規則判斷是否應該發放 token(是否允許通過)。
Sentinel 集群流控支持限流規則和熱點規則兩種規則,並支持兩種形式的閾值計算方式: - 集群總體模式:即限制整個集群內的某個資源的總體 qps 不超過此閾值。
- 單機均攤模式:單機均攤模式下配置的閾值等同於單機能夠承受的限額,token server 會根據連接數來計算總的閾值(比如獨立模式下有 3 個 client 連接到了 token server,然后配的單機均攤閾值為 10,則計算出的集群總量就為 30),按照計算出的總的閾值來進行限制。這種方式根據當前的連接數實時計算總的閾值,對於機器經常進行變更的環境非常適合。
4.2.7.1 啟動方式
Sentinel 集群限流服務端有兩種啟動方式:
-
獨立模式(Alone),即作為獨立的 token server 進程啟動,獨立部署,隔離性好,但是需要額外的部署操作。獨立模式適合作為 Global Rate Limiter 給集群提供流控服務。

-
嵌入模式(Embedded),即作為內置的 token server 與服務在同一進程中啟動。在此模式下,集群中各個實例都是對等的,token server 和 client 可以隨時進行轉變,因此無需單獨部署,靈活性比較好。但是隔離性不佳,需要限制 token server 的總 QPS,防止影響應用本身。嵌入模式適合某個應用集群內部的流控。

雲上版本 AHAS Sentinel 提供開箱即用的全自動托管集群流控能力,無需手動指定/分配 token server 以及管理連接狀態,同時支持分鍾小時級別流控、大流量低延時場景流控場景,同時支持 Istio/Envoy 場景的 Mesh 流控能力。
鏈接:http://note.youdao.com/noteshare?id=fc7d801d1a8213fc4d1b691302e82a62&sub=675ACF22A59841AFAECD58A0A9B4E151

