1、引入依賴
鏈接: 點擊查看依賴關系
父pom
<spring.cloud.version>Hoxton.SR12</spring.cloud.version>
<spring.cloud.alibaba.version>2.2.10-RC1</spring.cloud.alibaba.version>
Sentinel應用直接引用starter
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2、配置規則
限流著重于防止整體系統的入口流量過大,通過量化控制進入系統的請求速度。
降級是在系統負載過高或部分服務不可用時,采取的一種策略,它允許系統犧牲部分非核心功能或降低服務質量,以保證核心功能的正常運行。
// 限流配置規則@PostConstructpublic static void initFlowRules() {List<FlowRule> rules = new ArrayList<>();FlowRule rule = new FlowRule();rule.setResource("ordering"); //設置資源名稱rule.setGrade(RuleConstant.FLOW_GRADE_QPS);//QPS 每秒的訪問量// Set limit QPS to 20.rule.setCount(2);rules.add(rule);FlowRuleManager.loadRules(rules);}// 降級規則//@PostConstructpublic void initFlowRules2() {List<DegradeRule> rules = new ArrayList<>();DegradeRule rule = new DegradeRule();rule.setResource("ordering2"); //設置資源名稱rule.setGrade(DEGRADE_GRADE_EXCEPTION_RATIO);// Set limit QPS to 20.rule.setCount(0.5);rule.setMinRequestAmount(10);rule.setTimeWindow(10); // 10s 熔斷時長10srule.setStatIntervalMs(10*1000); 10s 統計時長,統計的窗口(單位為 ms)rules.add(rule);DegradeRuleManager.loadRules(rules);}
3、為接口設置熔斷與降級方法
blockHandler與fallback命名規則
- blockHandler方法應該接收與原始方法相同類型的參數,并且額外添加一個 BlockException 類型的參數,用于傳遞被 Sentinel 阻塞的具體原因。
命名規則是:
- 原方法名 + “_blockHandler”,比如在示例中,對應的 blockHandler 方法應該是 ordering_blockHandler(Integer id, BlockException ex)。
- 必須為static方法
- fallback方法應該接收與原始方法相同類型的參數
命名規則是:
- 原方法名 + “_fallback”,此方法應該接收與原始方法相同的參數列表,并返回與原始方法相同的返回類型。
- 必須為static方法
在示例中,對應的 fallback 方法應該是 ordering_fallback(Integer id)也可以ordering_fallback(Integer id, Throwable ex)
上述的 _blockHandler 和 _fallback 后面是可以帶上任意的參數類型,但至少需要包含原始方法的所有參數類型,以及在 blockHandler 方法中加入 BlockException 參數。
驗證限流
@RestController
@RequestMapping("/api/order")
@Slf4j
public class OrderController {private static AtomicInteger count = new AtomicInteger(0);@GetMapping@SentinelResource(value = "HelloWorld",blockHandlerClass=OrderController.class,blockHandler = "ordering_blockHandler")public String ordering(Integer id) {int i = count.incrementAndGet();log.debug(id + "進來了 - > "+i);return "下單成功";}public static String ordering_blockHandler(Integer id,BlockException ex){int i = count.incrementAndGet();log.debug("熔斷了 -> "+i );return "系統繁忙,請稍后重試";}@PostConstruct //初始化執行private void initFlowRules(){List<FlowRule> rules = new ArrayList<>();FlowRule rule = new FlowRule();rule.setResource("HelloWorld");rule.setGrade(RuleConstant.FLOW_GRADE_QPS);// Set limit QPS to 20.rule.setCount(2);rules.add(rule);FlowRuleManager.loadRules(rules);}
}
驗證降級
@RestController
@RequestMapping("/api/order2")
@Slf4j
public class Order2Controller {@GetMapping@SentinelResource(value = "ordering2",fallbackClass= Order2Controller.class,fallback = "ordering_fallback")public String ordering(Integer id) {log.debug("進來了");if (id == 4) {throw new IllegalArgumentException("參數異常");}return "下單成功";}//? 什么時候觸發? ordering_fallback 有什么要求嗎?public static String ordering_fallback(Integer id, Throwable ex) {log.debug("降級");return "降級了";}@PostConstruct //初始化執行 降級規則private void initDegradeRule(){List<DegradeRule> rules = new ArrayList<>();DegradeRule rule = new DegradeRule("ordering2").setGrade(CircuitBreakerStrategy.ERROR_COUNT.getType())// Max allowed response time 錯誤數量.setCount(2)// Retry timeout (in second) 熔斷10s.setTimeWindow(20).setMinRequestAmount(10) //最小請求數.setStatIntervalMs(10*1000);//10s 統計時長,統計的窗口(單位為 ms)rules.add(rule);DegradeRuleManager.loadRules(rules);}
}
高級配置
- 流量控制規則 (FlowRule)
- 熔斷降級規則 (DegradeRule)