hystrix服务熔断和降级
原创
©著作权归作者所有:来自51CTO博客作者wx5add7776993de的原创作品,请联系作者获取转载授权,否则将追究法律责任
hystrix简介
分布式系统面临的问题
复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免的失败
当多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务,这就是所谓的扇出,如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,从而引出系统崩溃,这就是服务雪崩
解决方案
hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统中,许多依赖不可避免的会调用失败,比如超时,异常等,hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性
何为熔断
就是在某个服务出现故障后,通过故障监控,会向调用方返回一个符合预期的,可处理的备选响应,而不是长时间等待或者抛出调用方法无法处理的异常,这样就保证了服务调用方的线程不会被长时间,不必要的占用,从而避免故障造成分布式系统的服务雪崩
hystrix重要概念
服务降级
- 服务降级就是向调用方返回一个符合预期的,可处理的备选响应,而不是长时间等待或者抛出调用方无法处理的异常
哪些情况会发出降级:
- 程序运行异常
- 超时
- 服务熔断触发服务降级
- 线程池/信号量打满
服务熔断
- 熔断就类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示,其实就是服务降级的触发条件,当响应恢复正常后,可以恢复服务的正常调用
服务限流
demo案例
服务降级
引入依赖
<!--hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
启动类加上注解
@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class Hystrix {
public static void main(String[] args) {
SpringApplication.run(Hystrix.class,args);
}
}
配置降级处理方法
@HystrixCommand(fallbackMethod = "timeOutHandler",commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
})
@RequestMapping("/errorTimeAwait")
public Object errorTimeAwait(){
return paymentService.error_timeAwait();
}
public Object timeOutHandler(){
return "超时啦!";
}
这种方式的话,每一个需要处理降级的业务都需要配置一个单独的处理方法,会造成代码膨胀
全局降级处理
@RestController
@RequestMapping("/pay")
@DefaultProperties(defaultFallback = "globalHandler")//再配合 @HystrixCommand对业务方法实现降级
public class PaymentController {
/**
* 服务熔断和降级,限流在消费端和服务提供端都可以配置
* 这里模拟消费端配置
*/
@Autowired
private PaymentService paymentService;
@RequestMapping("/ok")
public Object ok(){
return paymentService.ok();
}
@HystrixCommand
@RequestMapping("/errorTimeAwait")
public Object errorTimeAwait(){
return paymentService.error_timeAwait();
}
public Object timeOutHandler(){
return "超时啦!";
}
}
还有一种是在feign调用方中设置
@Component
@FeignClient(value = "PAYMENT8101",fallback = FeignServiceImpl.class)//声明服务名
public interface FeignService {
@RequestMapping("/res/res")//controller方法的接口声明
String create();
}
将降级处理方法实现在实现类上
@Component
public class FeignServiceImpl implements FeignService {
/**
* 降级处理方法
* @return
*/
@Override
public String create() {
return "------- 降级啦 -------";
}
}
配置文件开启配置
feign:
hystrix:
enabled: true
服务熔断
//在10s中有6次请求失败则触发断路器,10s一个窗口
@HystrixCommand(fallbackMethod = "timeOutHandler",commandProperties = {
@HystrixProperty(name = "circuitBreaker.enabled",value = "true"),//是否开启断路器
@HystrixProperty(name = "circuitBreaker.requestVolmueThreshold",value = "10"),//请求次数
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),//时间窗口期
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60")//失败率达到多少后触发熔断
})
@RequestMapping("/errorTimeAwait")
public Object errorTimeAwait(){
return paymentService.error_timeAwait();
}
public Object timeOutHandler(){
return "超时啦!";
}