由于 项目中 使用了很多第三方服务及 出现过数据库步稳定的情况, 所以在项目中需要使用 熔断降级的策略。
由于 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:热点参数限流