在分布式系统里面,许多依赖难免会调用失败,比如超时等,Hystrix能保证一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障。
当某个服务单元发生故障时,通过熔断器的故障监控,向调用方返回一个符合预期的,可处理的备选响应,而不是长时间的等待或抛出无法调用的异常,这样就可以保证服务调用方的线程不会长时间被暂用,从而避免故障在分布式系统中蔓延。
Hystrix是服务端的处理技术
pom文件中添加下面依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
配置文件中配置注册到eureka中心以及一些mybatis等相关的信息,
启动类上添加@EnableCircuitBreaker注解,开启Hystrix的熔断器功能
Hystrix主要有以下几点功能
服务降级
在一些情况下,资源快耗尽时,先放弃一些不重要的服务
服务熔断
在controller的接口上添加@HystrixCommand(fallbackMethod="processHystrix_Get"),并定义处理错误的方法,
服务熔断用一句话来解释就是,接口里面有一些情况,比如报错跑异常时,就由HystrixCommand注解上定义的fallbackMethod来处理
这种方式有一个很严重的问题,每个接口都要有一个对应的fallbackMethod方法,这样会造成controller中方法膨胀,异常处理与业务逻辑也高耦合
针对这个问题,可以将fallbackMethod放到service层的接口中,在接口中处理这个问题,这样controller中就不会有这2个问题了
在service接口中处理这个问题需要创建一个类,实现FallbackFactory接口,重写create方法即可,该方法上记得加上@Component注解,具体如下,
@Component
public class DeptClientServiceFallBackFactory implements FallbackFactory<DeptClientService> {
@Override
public DeptClientService create(Throwable cause) {
return new DeptClientService() {
@Override
public List<Dept> getAll() {
return null;
}
@Override
public Dept get(Long id) {
Dept dept = new Dept();
dept.setDeptno(id);
dept.setDname("找不到相关信息");
return dept;
}
@Override
public boolean add(Dept dept) {
return false;
}
};
}
}
create方法返回一个具体的service接口的实例,重写接口的方法,重写的内容就是接口调用报错是的处理逻辑,也就是前面讲的fallbackMethod方法中的内容。
最后要在接口的@FeignClient注解里加上刚创建的 DeptClientServiceFallBackFactory类
@FeignClient(value = "MICROSERVICECLOUD-DEPT", fallbackFactory=DeptClientServiceFallBackFactory.class)
最后在配置文件中添加一下对Hystrix的支持
服务限流
实时监控
后面补充