Spring Cloud Hystrix 服务降级限流策略详解
Lxlxxx 人气:0前言
前面说到在我们应对高并发的场景,请求量过于大的情况下给我们服务器的压力很多,造成缓存穿透、击穿、雪崩,那么我们采用布隆过滤器,有兴趣的小伙伴可以去看看上篇文章,关于布隆过滤器的解析。Redis处理高并发之布隆过滤器
我们要从根源上解决问题,比如一个接口在同一时间内被多次请求,如果请求失败了,我们还要继续请求么,一直请求一直失败,一直的在给我们的服务器施加压力,这种情况下肯定是不行,这个时候我们就需要对接口服务提供降级策略,在服务请求达成一定失败率的情况下,就触发降级、熔断策略对服务进行保护,也可以去服务的每分钟请求次数做限制,从而保护我们的服务,给服务端减轻压力,可以更加效率去执行业务逻辑。
Hystrix简介
Hystrix 是一个用于解决分布式服务调用出现延迟、故障,在一个服务出现故障的时候,保护其他服务可以正常使用,避免整个系统出现问题,Hystrix作为开源库,以断路器的角色存在着。
Hystrix的使用
服务降级
服务超时或故障,Hystrix调用降级方法处理,首先构建两个服务,一个system服务,定义2个controller方法,一个是模拟超时的场景,一个模拟调用错误的场景,另外一个system2的服务,去模拟分布式场景下的调system服务的场景。
system服务控制层
@RestController @RequestMapping("/hystrix") @DefaultProperties(defaultFallback = "timeOutFallbackMethod") public class HystrixController { @Autowired private IHystrixService iHystrixService; @GetMapping("/error") @HystrixCommand public String errorMethod() { int i = 10 / 0; return iHystrixService.fallBackMethodOk(); } @GetMapping("/timeOut") @HystrixCommand(fallbackMethod = "timeOutFallbackMethod", commandProperties = { //超过2秒及服务降级 @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000") }) public String timeOutMethod() throws InterruptedException { //线程睡眠3秒 return iHystrixService.timeOutMethod(); } /** * 降级方法 * * @return */ private String timeOutFallbackMethod() { return "服务访问失败,降级处理"; } }
@DefaultProperties 默认全局降级方法,在单纯只加@HystrixCommand注解的情况下,走默认的defaultFallback方法。
int i = 10 / 0; 接口异常情况下降级
超时降级,服务设置超时时间为2秒,调用线程睡眠3秒,超时调降级服务
System2调System降级场景
controller
@RestController @AllArgsConstructor @RequestMapping("/provider") public class HystrixProviderController { @Autowired private HystrixService hystrixService; /** * 模拟接口错误场景 * @return */ @GetMapping("/executeProviderMethod1") public String executeProviderMethod1(){ int i =5/0; String result = hystrixService.errorMethod(); return result; } }
服务system feign接口,feign添加fallback,实现类是调用的降级方法。
@FeignClient(contextId = "hystrixService", value = "Lxlxxx-system", fallbackFactory = HystrixFallbackFactory.class) public interface HystrixService { /** * 异常方法 * * @return */ @GetMapping("/hystrix/error") public String errorMethod(); /** * 超时方法 * * @return */ @GetMapping("/hystrix/timeOut") public String timeOutMethod(); }
fallback降级方法。
@Component @Slf4j public class HystrixFallbackFactory implements FallbackFactory<HystrixService> { @Override public HystrixService create(Throwable cause) { log.error("用户服务调用失败:{}", cause.getMessage()); return new HystrixService() { @Override public String errorMethod() { return "触发system 服务的降级方法"; } @Override public String timeOutMethod() { return null; } }; } }
服务熔断
Service类里面的熔断方式,可以配置多个出发服务熔断的属性,从而更好的断路保护服务。
@Service @Slf4j public class HystrixServiceImpl implements IHystrixService { //服务熔断 @HystrixCommand(fallbackMethod = "fallback",commandProperties = { @HystrixProperty(name = "circuitBreaker.enabled",value = "true"), //是否开启断路器 @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "5"), //请求次数 @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"), //时间范围 @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"), //失败率达到多少后跳闸 }) @Override public String countError(Integer count){ //模拟报错 if (count > 0){ throw new RuntimeException("*****count 必须大于0"); } return Thread.currentThread().getName()+"\t"+"调用成功"; } public String fallback(Integer count){ return "count 必修大于0 count: " +count; } }
总结
熔断、降级的方式有很多,Spring Cloud Hystrix 可以能更好的集成在分布式微服务的架构体系上,采用注解的方式,更加方便使用,如果还有更好的服务熔断、降级策略欢迎小伙伴分享。
加载全部内容