阿里 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:热点参数限流