在微服务调用的中,为了防止服务的雪崩和业务方案的降级,要事先准备好降级方案。
业务降级
比如优惠券的推荐方案,在上线后,有可能发现不是很合适,有大量的客诉。
这时就要回滚到之前的方案。
有两种选择
- 回滚代码,重新上线,浪费时间和人力
- Apollo配置开关,开关关闭,回到之前的逻辑,简单高效,新老接口逻辑耦合在一起
熔断降级
feign调用其他服务,有hystrix降级,超时熔断,保护本服务。
Hystrix整个工作流如下:
1 | !复制代码 1.构造一个 HystrixCommand或HystrixObservableCommand对象,用于封装请求,并在构造方法配置请求被执行需要的参数; |
从流程图上可知道,第5步线程池/队列/信号量已满时,还会执行第7步逻辑,更新熔断器统计信息,而第6步无论成功与否,都会更新熔断器统计信息。
hystrix隔离策略:线程池(默认),信号量
策略 | 线程切换 | 支持异步 | 支持超时 | 支持熔断 | 限流 | 开销 |
---|---|---|---|---|---|---|
信号量 | 否 | 否 | 否 | 是 | 是 | 小 |
线程池 | 是 | 是 | 是 | 是 | 是 | 大 |
手写超时降级策略
基于spring aop,一个注解加上一个切面类就可以了。使用线程池来执行业务代码,超时降级,执行降级方法,没有熔断功能。
1 | java复制代码@RestController |
1 | java复制代码@Target(ElementType.METHOD) |
1 | java复制代码@Aspect |
本文转载自: 掘金