# 095. 开发品牌名称获取接口的基于本地缓存的 fallback 降级机制
- 创建 command
- 执行 command
- request cache
- 短路器如果打开了,执行 fallback 降级机制
按照流程来说,应该讲解断路器,但是为了讲解方便,把 fallback 提前了
因为只要是异常,都会调用 fallback ,如:
访问外部接口服务报错,访问 mysql、redis 等外部依赖报错
资源隔离被拒绝(reject)
访问外部依赖超时(timeout)
断路器被打开 断路器被打开不属于异常了,应该属于高可用的一个机制
如果短路器发现异常事件的占比达到了一定的比例,直接开启短路(circuit breaker)
那么 hystrix 中怎么开启降级机制的呢?
# Hystrix fallback 的写法
public class CommandThatFailsFast extends HystrixCommand<String> {
private final boolean throwException;
public CommandThatFailsFast(boolean throwException) {
super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));
this.throwException = throwException;
}
@Override
protected String run() {
if (throwException) {
throw new RuntimeException("failure from CommandThatFailsFast");
} else {
return "success";
}
}
// 重写 getFallback 方法
@Override
protected String getFallback() {
return "降级机制";
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
如果是 HystrixObservableCommand 则
@Override
protected Observable<String> resumeWithFallback() {
if (throwException) {
return Observable.error(new Throwable("failure from CommandThatFailsFast"));
} else {
return Observable.just("success");
}
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
测试,如下代码,如果没有降级机制的话,这个调用不可能走到 System.out.println(execute)
这行代码
@Test
public void testFailure() {
String execute = new CommandThatFailsFast(true).execute();
System.out.println(execute);
}
1
2
3
4
5
2
3
4
5
# fallback 使用场景
对于 fallback 的使用场景视频中也没有什么干货讲解,最后讲解了一个获取商品品牌信息的场景,如下
调用商品信息后,再去调用服务获取商品品牌信息
当品牌信息调用失败后,在 fallback 中获取一份在本地缓存保存的品牌数据
该品牌数据名称可能是落后的,也就是实际品牌名称为 ip7,本地缓存的名称为 ip
fallback 最经典的两种降级机制:纯内存数据、默认值;
所以对于 hystrix 这种框架的时候,我觉得重点应该是使用场景,而不是官网教程中都已经很详细的教程
对于使用场景我唯一能想到的可能是游戏中的个人头像,个人喜欢玩游戏,但是有这么一个有趣的现象: 有时候个人信息的头像图片是不准确的,也就是不是自己设置的;
对于这个又去的现象,我唯一能想到的原因可能是:
- 获取头像信息失败,降级返回的一个本地内存中的一张图片或者返回的一个默认图片
- 由于是图片信息,占用网络带宽巨大,在繁忙的时候,对于这个服务进行降级,随机获取本地已有的图片返会;这里说的繁忙是指可能大量超时,导致获取失败,那么这样一来就省略了去服务中获取一次的网络开销了