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;
            }
        };
    }
}
posted @ 2023-06-26 01:03  此时不卷何时卷  阅读(196)  评论(0编辑  收藏  举报