- 了解服务雪崩
服务雪崩就是一连串相关联的服务当其中某个服务出现错误,那么此时请求就会阻塞,当很多用户都要访问这个服务的时候,就会引起大面积地阻塞,这就是服务雪崩;到达一定程度就会影响服务器地性能。
- 什么是降级
简单的说就是:当A服务很多人访问,而B服务很少人访问的时候,A服务需要承受很大的压力才能满足大量的请求,此时解决方法是将B服务关掉,让调用B服务的用户暂时无法调用到服务,这样确保A服务器能顶住压力,否则可能会崩掉(牺牲少数人保证整体能正常运行),那么这时候关掉B服务(自动或人工)就叫做降级。
- 什么是熔断
熔断就是在某个服务出现问题地时候,系统不应该一直等待或者报错,而是应该调用其他的方法向用户提示该服务出现了问题。hystrix就很好地用于解决这个问题。
基本过程是:编写本地备用方法(也就是不需要访问服务的方法),当对某些请求超时或请求错误或需要降级的服务进行熔断后,就调用这个备用的本地方法。
- 被调用方熔断
针对于被调用方自身服务出现了问题,自己的问题自己解决
基本步骤:
①开启熔断功能:在著启动类加上@EnableCircuitBreaker
注解。
②编写备用方法
public List<dept> hystrixGetDepts(){
ArrayList<dept> list=new ArrayList<dept>();
list.add(new dept(1,"服务出错","no"));
return list;
}
③在正常调用方法上加上HystrixCommand注解,参数fallbackMethod的值是备用方法名。(这里用休眠的方法模拟访问超时)
@Autowired
DeptService deptService;
@HystrixCommand(fallbackMethod = "hystrixGetDepts")
@RequestMapping("/getDepts")
public List<dept> getDepts() throws InterruptedException {
Thread.sleep(3000);
return deptService.getDepts();
}
④测试结果
- 调用方熔断
常用于降级后的熔断,因为要降级,所以关闭的应该是下游服务,下游提供者的服务关闭之后就执行不了备用方法了,所以熔断的方案在调用方编写。
如果不使用Feign,在调用方使用上面类似的方法即可;
如果使用Feign,基本步骤如下:
①在调用方导入依赖同上
②新建一个备用类,实现FallbackFactory接口(T为业务方法所在的类),重写create方法,返回一个T类型对象,这个对象重写业务方法为备用方法。例:
@Service
public class TestHystrixFeign implements FallbackFactory<testFeign> {
@Override
public testFeign create(Throwable throwable) {
return new testFeign() {
@Override
public List<dept> testFeign() {
ArrayList<dept> list=new ArrayList<dept>();
list.add(new dept(1,"上游服务出错","no"));
return list;
}
};
}
}
③在业务方法上的FeignClient注解追加fallbackFactory参数,值为备用类的类对象。如:
@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT",fallbackFactory = TestHystrixFeign.class)
④yml中配置hystrix开启
feign:
hystrix:
enabled: true
⑤测试结果
当服务提供者正常提供服务时,调用者能成功拿到数据,当关闭提供者时,显示服务出错。