springcloud服务熔断和降级
1、前提
分布式项目在发布时,由于某些原因导致服务不可用,调用这个服务的其他服务由于没有得到反馈,则会持续不断调用,增加了资源开销。处理方法:服务熔断和服务降级。
2、服务熔断
从数据库查询一个信息,这个信息为空,抛出了空指针异常(如果还要继续调用下一个服务,但是dept出现问题,导致服务不可用,前面的服务无法得到响应)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | /** * 根据 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,如果失败就调用这个方法,使得前面的服务可以得到响应,所以应在服务提供者给与响应
1 2 3 | public Dept hystrixGet(Long id ){ return new Dept().setId( id ).setName( "账号已注销" ).setDbSource( "" ); } |
启动类需要添加注解@EnableHystrix
3、服务降级:
当服务调用达到高峰期,部分服务器压力巨大时,需要关闭一部分服务,使得空闲的服务器不占用资源,在服务调用者处给与响应(在接口加上注解@FeignClient fallbackFactory = DeptClientServiceFallBackFactory.class)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | @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; } }; } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律