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; } }; } }