参考文档
什么是熔断降级
除了流量控制以外,降低调用链路中的不稳定资源也是 Sentinel 的使命之一。由于调用关 系的复杂性,如果调用链路中的某个资源出现了不稳定,最终会导致请求发生堆积。
Sentinel 和 Hystrix 的原则是一致的: 当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则对这个资源的调用进行限制,让请求快速失败, 避免影响到其它的资源而导致级联故障。
熔断降级设计理念
在限制的手段上,Sentinel 和 Hystrix 采取了完全不一样的方法。Hystrix 通过 线程池隔离的方式,来对依赖(在 Sentinel 的概念中对应 资源)进行了隔离。这样做的好处是资源和资源之间做到了最彻底的隔离。缺点是除了增加了线程切换的成本(过多的线程池导致线程数目过多),还需要预先给各个资源做线程池大小的分配。
Sentinel 对这个问题采取了两种手段
通过并发线程数进行限制
和资源池隔离的方法不同,Sentinel 通过限制资源并发线程的数量,来减少不稳定资源对其 它资源的影响。这样不但没有线程切换的损耗,也不需要您预先分配线程池的大小。当某个 资源出现不稳定的情况下,例如响应时间变长,对资源的直接影响就是会造成线程数的逐步 堆积。当线程数在特定资源上堆积到一定的数量之后,对该资源的新请求就会被拒绝。堆积 的线程完成任务后才开始继续接收请求。
通过响应时间对资源进行降级
除了对并发线程数进行控制以外,Sentinel 还可以通过响应时间来快速降级不稳定的资源。 当依赖的资源出现响应时间过长后,所有对该资源的访问都会被直接拒绝,直到过了指定的 时间窗口之后才重新恢复。
整合测试
1、引入依赖
1. <dependency> 2. <groupId>org.springframework.cloud</groupId> 3. <artifactId>spring-cloud-starter-openfeign</artifactId> 4. </dependency> 5. <dependency> 6. <groupId>com.alibaba.cloud</groupId> 7. <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> 8. </dependency>
2、使用 Nacos 注册中心
1. <dependency> 2. <groupId>com.alibaba.cloud</groupId> 3. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> 4. </dependency>
3、定义 fallback 实现
1. public class OrderFeignServiceFallBack implements OrderFeignService { 2. 3. @Override 4. public Resp<OrderVo> getOrderInfo(String orderSn) { 5. return null; 6. } 7. }
4、定义 fallbackfactory 并放在容器中
1. @Component 2. public class OrderFeignFallbackFactory implements 3. FallbackFactory<OrderFeignServiceFallBack> { 4. @Override 5. public OrderFeignServiceFallBack create(Throwable throwable) { 6. 7. return new OrderFeignServiceFallBack(throwable); 8. } 9. }
5、改造 fallback 类接受异常并实现容错方法
1. public class OrderFeignServiceFallBack implements OrderFeignService { 2. 3. private Throwable throwable; 4. 5. public OrderFeignServiceFallBack(Throwable throwable){ 6. 7. this.throwable = throwable; 8. } 9. 10. @Override 11. public Resp<OrderVo> getOrderInfo(String orderSn) { 12. return Resp.fail(new OrderVo()); 13. } 14. }
6、远程接口配置 feign 客户端容错
1. @FeignClient(value = "gulimall-oms",fallbackFactory =OrderFeignFallbackFactory.class) 2. public interface OrderFeignService { 3. 4. @GetMapping("/oms/order/bysn/{orderSn}") 5. public Resp<OrderVo> getOrderInfo(@PathVariable("orderSn") StringorderSn); 6. }
7、开启 sentinel 代理 feign 功能;在 application.properties 中配置
feign.sentinel.enabled=true
更快的容错方式
1、使用@SentinelResource,并定义 fallback
@SentinelResource(value = "order",fallback = "e")
Fallback 和原方法签名一致,但是最多多一个 Throwable 类型的变量接受异常。
需要给容器中配置注解切面
1. 2. @Bean 3. public SentinelResourceAspect sentinelResourceAspect() { 4. 5. return new SentinelResourceAspect(); 6. }
在控制台添加降级策略
2、测试降级效果
当远程服务停止,前几个服务会尝试调用远程服务,满足降级策略条件以后则不会再尝试调 用远程服务