Hystrix简介
Hystrix是一个用于处理分布式系统的延迟和容错的源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等。
Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
“断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方法返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要的占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
Hystrix 概念
服务降级
- 服务器忙,请稍后再试,不让客户端等待并立刻返回一个友好提示,fallback
- 哪些情况会发生降级
- 程序运行异常
- 超时
- 服务熔断触发服务降级
- 线程池/信号量打满也会导致服务降级
服务熔断:
- 类似保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示
服务限流
- 秒杀高并发等操作,严禁一窝蜂的过来拥挤,排队有序进行
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
降级处理
情况:
- 大量访问服务器变慢导致超时
- 宕机或者程序运行出错
服务端8001降级
注意:启动类@EnableCircuitBreaker
@RequestMapping("test2")
@HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler",commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
})
public String test2(){
int i = 12/0;
return "test2";
}
public String paymentInfo_TimeOutHandler(){
return "超时或异常处理";
}
当test2服务不可用,运行超过3秒,做服务降级,直接兜底方法paymentInfo_TimeOutHandler
客户端80降级
服务端超时时间为5秒
@RequestMapping("test2")
@HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler",commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "5000")
})
public String test2(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "test2";
}
feign:
hystrix:
enabled: true
客户端超时时间为1.5秒
@RequestMapping("test2")
@HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler",commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1500")
})
public String teest2(){
return hystrixService.test2();
}
public String paymentInfo_TimeOutHandler(){
return "70超时异常处理";
}
当客户端超过1.5秒后,兜底方法
全局服务降级
OpenFeign接口,配置fallback
@Component
@FeignClient(value="hystrix-service-7001",fallback = FallbackService.class)
public interface HystrixService {
@RequestMapping("test1")
public String test1();
@RequestMapping("test2")
public String test2();
}
创建全局fallback
@Component
public class FallbackService implements HystrixService{
@Override
public String test1() {
return "--------------------------------test1fallback";
}
@Override
public String test2() {
return "--------------------------------test2fallback";
}
}
application.yml
feign:
hystrix:
enabled: true
当服务端宕机时,客户端兜底方法
熔断机制
熔断机制概述
熔断机制是应对雪崩效应的一种微服务链路保护机制,当扇出链路的某个微服务出错不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。
当检测到该节点微服务调用响应正常后,恢复调用链路。
Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内20次调用失败,就会启动熔断机制
@HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = {
@HystrixProperty(name="circuitBreaker.enabled",value="true"),//是否开启断路器
@HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value = "10"),//请求次数
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value="1000"),//时间窗口期
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60") //失败率达到多少后跳闸
})
@RequestMapping("paymentCircuitBreaker")
public String paymentCircuitBreaker(@RequestParam("i") Integer i){
if(i<5){
throw new RuntimeException("不能小于5");
}
return "调用成功"+i;
}
public String paymentCircuitBreaker_fallback(Integer i){
return "回调方法";
}