在正常情况下order服务调用user服务正常。引入feign后将调用feign相关的抽取到了feign-api项目中.然后启动就报错。错误信息如下:
事故现场回顾:
使用的时候sentinel整合Feign.order和user服务之前使用feign调用正常。在整合sentinel的时候,出现上图问题。
sentinel整合Feign步骤:
一:在服务调用方的配置文件中添加feign开启sentinel服务
本案例中是order调用user服务。所以,也就是需要在order服务的application.yml添加:
feign: sentinel: enabled: true # 开启feign对sentinel的支持
二:编写失败降级逻辑
业务失败后,不能直接报错,而应该返回用户一个友好提示或者默认结果,这个就是失败降级逻辑。
给FeignClient编写失败后的降级逻辑
①方式一:FallbackClass,无法对远程调用的异常做处理
②方式二:FallbackFactory,可以对远程调用的异常做处理,我们选择这种
这里我们演示方式二的失败降级处理。
三:在feing-api项目中的UserClient接口中使用UserClientFallbackFactory
四:启动类上添加如下:
重启服务,然后就报错了。
从网上查询,有说bean的加载顺序错误。修改后就可以了。如下图:
凯哥也这么来,不行。
还有说对应的server添加@Lazy注解,让其延时加载。如下图:
难道无解决办法了吗?
先来看看凯哥的服务版本:
Spring Boot 版本为:2.3.8.RELEASE
Spring Cloud 版本为:Hoxton.SR10
Spring Cloud Alibaba 版本为:2.2.5.RELEASE
Spring Cloud Gateway:2.2.5.RELEASE
我们去spring官网https://spring.io/projects/spring-cloud 查找spring cloud Hoxton版本对应关系:
找到对应的Hoxton.SR10对应各个版本依赖:
我们可以看到,虽然Hoxton.SR10对spring boot的支持是2.2.x<spring boot<2.3.x
凯哥使用的是spring boot的2.3.5版本符合当前SR10的要求。BUT,SR10的GateWay支持的版本是2.2.7.RELEASE。可是凯哥使用的GateWay版本是2.2.5.RELEASE。版本对应不上啊。噗噗。(一口老血喷出啊~~~)
那么,接着在spring 官网找到支持GateWay是2.2.5的。发现SR8是支持的。如下图:
果断换上试试。
刷新maven依赖后,重启服务。一起OK。
小总结:
spring cloud的版本及对应的spring BootGateWay等其他组件的版本关系,最好以官网的为准。不然,就会像凯哥这样,浪费一两个小时。ε=(´ο`*)))唉