• 使用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");
    }
    

    参考【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控制台】