使用Sentinel熔断、降级、流控等功能
定义
资源:作为规则管理的最小单元,分为流量控制规则 (FlowRule)、熔断降级规则 (DegradeRule)、系统保护规则 (SystemRule)、访问控制规则 (AuthorityRule)、热点规则 (ParamFlowRule)。
资源管理:通过定义资源,动态修改资源,来达到熔断降级流控等目的。
使用示例
资源定义
- 资源定义方式一(代码的形式,灵活可控)
// 1.5.0 版本开始可以利用 try-with-resources 特性(使用有限制)
// 资源名可使用任意有业务语义的字符串,比如方法名、接口名或其它可唯一标识的字符串。
try (Entry entry = SphU.entry("resourceName")) {
// 被保护的业务逻辑
// do something here...
} catch (BlockException ex) {
// 资源访问阻止,被限流或被降级
// 在此处进行相应的处理操作
}
/**
* 支持异步
*/
try {
AsyncEntry entry = SphU.asyncEntry(resourceName);
// 异步调用.
doAsync(userId, result -> {
try {
// 在此处处理异步调用的结果.
} finally {
// 在回调结束后 exit.
entry.exit();
}
});
} catch (BlockException ex) {
// Request blocked.
// Handle the exception (e.g. retry or 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");
}
- 资源定义方式三(主流框架适配,如引入Spring Cloud Alibaba Sentinel后,则会自动为接口定义资源)
参考【HZero服务启用Sentinel监控功能】,即按照【HZero服务启用Sentinel监控功能】文档调整后,则自动为接口定义了资源。
资源管理
- 资源管理方式一(服务启动时即定义好流控规则)
// 服务启动时运行该方法,使用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);
}
- 资源管理方式二(界面化控制,可查看当前生效规则,动态修改)
![Sentinel Dashboard _ 1](/img/docs/development-guide/sentinel-example/Sentinel Dashboard _ 1.png)
仅需安装并启动Sentinel控制台即可,参考【启用Sentinel控制台】