springcloud服务熔断和降级
1、前提
分布式项目在发布时,由于某些原因导致服务不可用,调用这个服务的其他服务由于没有得到反馈,则会持续不断调用,增加了资源开销。处理方法:服务熔断和服务降级。
2、服务熔断
从数据库查询一个信息,这个信息为空,抛出了空指针异常(如果还要继续调用下一个服务,但是dept出现问题,导致服务不可用,前面的服务无法得到响应)
/**
* 根据id查询的方法
* @param id
* @return
*/
@GetMapping("/get/{id}")
@HystrixCommand(fallbackMethod="hystrixGet")
public Dept get(@PathVariable("id") Long id){
Dept dept = deptService.get(id);
if(dept == null){
throw new NullPointerException("对象查询失败");
}
return dept;
}
服务熔断是增加了注解@HystrixCommand,如果失败就调用这个方法,使得前面的服务可以得到响应,所以应在服务提供者给与响应
public Dept hystrixGet(Long id){
return new Dept().setId(id).setName("账号已注销").setDbSource("");
}
启动类需要添加注解@EnableHystrix

3、服务降级:
当服务调用达到高峰期,部分服务器压力巨大时,需要关闭一部分服务,使得空闲的服务器不占用资源,在服务调用者处给与响应(在接口加上注解@FeignClient fallbackFactory = DeptClientServiceFallBackFactory.class)
@Component
public class DeptClientServiceFallBackFactory implements FallbackFactory {
@Override
public DeptClientService create(Throwable cause) {
return new DeptClientService() {
@Override
public String add(Dept dept) {
return "服务暂时不可用";
}
@Override
public Dept queryById(Long id) {
return new Dept().setId(id).setName("").setDbSource("");
}
@Override
public List<Dept> list() {
List<Dept> deptList = new ArrayList<>();
return deptList;
}
};
}
}

浙公网安备 33010602011771号