阿里 sentinel 在项目中的使用

由于 项目中 使用了很多第三方服务及 出现过数据库步稳定的情况, 所以在项目中需要使用   熔断降级的策略。

由于  hystrix  已经停止更新了,  所以在项目中使用的是  阿里的  sentinel.  官网地址:https://github.com/alibaba/Sentinel

 

项目中 的引用及操作步骤:

 

1:引入 maven 依赖:

     这是核心包:

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.4.0</version>
</dependency>
需要控制台则引入此包:
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
    <version>1.4.0</version>
</dependency>

 

2:项目中的使用: 我只是在项目中使用了3种,

      1:  根据异常的数量。

      2:根据异常的比例

      3: 根据平均响应时间

 

   使用的第一步: 创建规则

     1:  根据异常的数量。

private static void initDegradeRule() {
    List<DegradeRule> rules = new ArrayList<>();
    DegradeRule rule = new DegradeRule();
    rule.setResource(KEY);  //资源名称, 自定义
    rule.setCount(3);   //一分钟内发生的异常数量 
    rule.setGrade(RuleConstant.DEGRADE_EXCEPTION_COUNT);  // 降级模式 根据异常数量降级
    rule.setTimeWindow(10);  降级时长
    rules.add(rule);
    DegradeRuleManager.loadRules(rules);
}

  2:根据异常的比例

private static void initDegradeRule() {
    List<DegradeRule> rules = new ArrayList<>();
    DegradeRule rule = new DegradeRule();
    rule.setResource(KEY);  //资源名称自定义
    rule.setCount(0.1);  //比列  [0.1, 1.0]
    rule.setGrade(RuleConstant.DEGRADE_EXCEPTION_RATIO); //降级模式, 根据异常的比例降级
    rule.setTimeWindow(10);  //降级时长
    rules.add(rule);
    DegradeRuleManager.loadRules(rules);
}

3: 根据平均响应时间

private static void initDegradeRule() {
    List<DegradeRule> rules = new ArrayList<>();
    DegradeRule rule = new DegradeRule();
    rule.setResource(KEY);   //定义的资源名称
    // set threshold RT, 10 ms
    rule.setCount(10);  // 平均响应时间
    rule.setGrade(RuleConstant.DEGRADE_GRADE_RT);  //根据平均响应时间降级
    rule.setTimeWindow(10);  //降级持续时长
    rules.add(rule);
    DegradeRuleManager.loadRules(rules);
}

使用的第二步: 在业务代码中使用规则:

   initDegradeRule();  //引入规则

Entry entry = null;
// 务必保证finally会被执行
try {
  // 资源名可使用任意有业务语义的字符串
  entry = SphU.entry("自定义资源名");     //  与规则中的资源名一致
  // 被保护的业务逻辑
  service.add(param);  //这是服务的调用处,降级的依据就是此处服务的调用的结果, 比如发生了异常,超过三次就会降级。                           

} catch (BlockException e1) {
  // 资源访问阻止,被限流或被降级    //降级后的处理,就是服务调用发生异常, 响应慢的处理。 比如返回空数据,不让前台报错等
  // 进行相应的处理操作
} finally {
  if (entry != null) {
    entry.exit();  //必须存在。
  }
}

注意: SphU.entry(xxx) 需要与 entry.exit() 方法成对出现,匹配调用,否则会导致调用链记录异常,抛出 ErrorEntryFreeException 异常。

 

3: 控制台的使用:https://github.com/alibaba/Sentinel/wiki/%E6%8E%A7%E5%88%B6%E5%8F%B0

      1:下载控制台的jar包:https://github.com/alibaba/Sentinel/releases

           sentinel-dashboard.jar

 

   2:配置命令启动控制台: 使用如下命令启动控制台,这是一行命令。。

       java -Dserver.port=8080

      -Dcsp.sentinel.dashboard.server=localhost:8080

     -Dproject.name=sentinel-dashboard

     -jar sentinel-dashboard.jar

  其中 -Dserver.port=8080 用于指定 Sentinel 控制台端口为 8080

 

3:客户端连接控制台的配置

       比如eclipse 的tomcat配置  jvm参数就是: 将

      -Dcsp.sentinel.dashboard.server=consoleIp:port  

  将上面这一行加到jvm参数中。  ip:端口  是 控制台定义的ip:端口   localhost:8080

      

 

   

 

    4;控制台的查看,规则的定义:  控制台中配置规则默认是存放内存中, 如果没有配置持久化,则重启后规则失效,

       看到如下界面则控制台启动成功, 这时候看不到数据, 需要访问一下应用,就会出现数据。 左边菜单栏降级规则可以添加规则。

     localhost:8080

  

 

 

 

 

 

4:规则的说明    sentinel有好几种系统保护的模式:

    1:流量控制

          

 

 2:熔断降级

 

3:系统保护

 

4: 授权

 

5:热点参数限流