本篇博客將爲大家介紹SentinelAPI
1. SphU(官方文檔)
1.1 概念
SphU
包含了 try-catch 風格的 API。用這種方式,當資源發生了限流之後會拋出 BlockException
。這個時候可以捕捉異常,進行限流之後的邏輯處理。
1.2 示例
第一步:在TestController 新建一個方法
@GetMapping("/test-sentinel-api")
public String testSentinelAPI(@RequestParam(required = false) String a){
// 定義個sentinel保護的資源,名稱是test-sentinel-api
Entry entry = null;
String resourceName = "test-sentinel-api";
try {
entry = SphU.entry(resourceName);
// 被保護的業務邏輯
if (StringUtils.isBlank(a)){
throw new IllegalArgumentException("a is empty");
}
return a;
// 如果被保護的資源被限流或者降級了,就會拋BlockException異常
} catch (BlockException e) {
log.warn("限流,或者降級了",e);
return "限流,或者降級了";
} finally {
if (entry != null){
// 退出entry
entry.exit();
}
}
}
第二步:在瀏覽器請求一直請求接口
- 若請求的接口地址帶參數,則一直返回
- 若請求的接口地址不帶參數,則一直報IllegalArgumentException異常
第三步:添加流控規則
選擇QPS,單機閾值爲1
此時如果進行頻繁的請求超過閾值怎接口返回
限流,或者降級了
2. 業務異常統計 Tracer (官方文檔)
2.1 概念
業務異常記錄類 Tracer
用於記錄業務異常
2.2 示例
第一步:修改方法
@GetMapping("/test-sentinel-api")
public String testSentinelAPI(@RequestParam(required = false) String a){
// 定義個sentinel保護的資源,名稱是test-sentinel-api
Entry entry = null;
String resourceName = "test-sentinel-api";
try {
entry = SphU.entry(resourceName);
// 被保護的業務邏輯
if (StringUtils.isBlank(a)){
throw new IllegalArgumentException("a is empty");
}
return a;
// 如果被保護的資源被限流或者降級了,就會拋BlockException異常
} catch (BlockException e) {
log.warn("限流,或者降級了",e);
return "限流,或者降級了";
}catch (IllegalArgumentException e2){
// 統計IllegalArgumentException 次數、佔比等等
Tracer.trace(e2);
return "參數非法";
}finally {
if (entry != null){
// 退出entry
entry.exit();
}
}
}
第二步: 添加降級規則
爲資源名test-sentinel-api 添加降級規則
降級策略:異常比例
異常比例:0.1
時間窗口:1
第三步:多次不帶參數進行接口請求
返回:參數非法
3. 上下文工具類 ContextUtil(官方文檔)
3.1 示例
第一步:修改代碼
@GetMapping("/test-sentinel-api")
public String testSentinelAPI(@RequestParam(required = false) String a){
// 定義個sentinel保護的資源,名稱是test-sentinel-api
Entry entry = null;
String resourceName = "test-sentinel-api";
ContextUtil.enter(resourceName,"test-wfw");
try {
entry = SphU.entry(resourceName);
// 被保護的業務邏輯
if (StringUtils.isBlank(a)){
throw new IllegalArgumentException("a is empty");
}
return a;
// 如果被保護的資源被限流或者降級了,就會拋BlockException異常
} catch (BlockException e) {
log.warn("限流,或者降級了",e);
return "限流,或者降級了";
} catch (IllegalArgumentException e2){
// 統計IllegalArgumentException 次數、佔比等等
Tracer.trace(e2);
return "參數非法";
} finally {
if (entry != null){
// 退出entry
entry.exit();
}
ContextUtil.exit();
}
}
第二步:添加規則
針對資源名:test-sentinel-api添加規則
針對來源:test-wfw
閾值類型:QPS
單機閾值:1
第三步:快速請求接口
返回:限流,或者降級了