Hystrix “豪猪”,具有自我保护的能力。hystrix 通过如下机制来解决雪崩效应问题。
在微服务架构中,我们把每个业务都拆成了单个服务模块,然后当有业务需求时,服务间可互相调用,但是,由于网络原因或者其他一些因素,有可能出现服务不可用的情况,当某个服务出现问题时,其他服务如果继续调用这个服务,就有可能出现线程阻塞,但如果同时有大量的请求,就会造成线程资源被用完,这样就可能会导致服务瘫痪,由于服务间会相互调用,很容易造成蝴蝶效应导致整个系统宕掉。因此,就有人提出来断路器来解决这一问题。
资源隔离:包括线程池隔离和信号量隔离,限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用。
降级机制:超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据。
熔断:当失败率达到阀值自动触发降级(如因网络故障/超时造成的失败率高),熔断器触发的快速失败会进行快速恢复。
缓存:提供了请求缓存、请求合并实现。
Hystrix服务降级,其实就是线程池中单个线程障处理,防止单个线程请求时间太长,导致资源长期被占有而得不到释放,从而导致线程池被快速占用完,导致服务崩溃。
Hystrix能解决如下问题:
1.请求超时降级,线程资源不足降级,降级之后可以返回自定义数据
2.线程池隔离降级,分布式服务可以针对不同的服务使用不同的线程池,从而互不影响
3.自动触发降级与恢复
4.实现请求缓存和请求合并
springBoot使用的是2.0.2.RELEASE版本 springCloud使用的是Finchley.RELEASE版本。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
在启动类加上@EnableCircuitBreaker注解
//@SpringBootApplication
//@EnableDiscoveryClient
//@EnableCircuitBreaker
这三个注解相当于一个@SpringCloudApplication
@EnableFeignClients
//@SpringBootApplication
//@EnableDiscoveryClient
//@EnableCircuitBreaker
@SpringCloudApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
设置断路器超时时间(默认1s)
feign:
hystrix:
enabled: true
client:
config:
default:
connectTimeout: 5000
readTimeout: 5000
1.在方法的头上加了@HystrixCommand(fallbackMethod = "hystrixMethod")注解,
代表对这个方法使用了Hystrix相关的功能,fallbackMethod属性是调用回调之后的处理方法。
默认设置了5s超时:
@GetMapping("/test")
@HystrixCommand(fallbackMethod = "hystrixMethod")
public String test(){
try {
Thread.sleep(6000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "ok";
}
public String hystrixMethod(){
return "请稍后再试";
}
2.Feign是自带断路器的,只需要在FeignClient的接口的注解中加上fallback的指定类就行了。
@FeignClient(name = "product", fallback = OrderHystrix.class)
public interface OrderClient {
@GetMapping("/product/list")
public String getProductInfo();
}
@Component
public class OrderHystrix implements OrderClient {
@Override
public String getProductInfo() {
return "商品服务忙,稍后再试。。。";
}
}