一、背景
OpenFeign是一种声明式的REST客户端,openfeign是开发常用的对外提供服务,以及调用外部提供的openfeign接口的工具类,基于Java的HTTP客户端库,用于简化HTTP请求和响应的处理。OpenFeign支持多种编解码器,包括JSON、XML、Form等,开发者可以根据需要选择合适的编解码器。同时,它支持请求拦截器和响应拦截器,可以通过实现请求拦截器和响应拦截器来对HTTP请求和响应进行处理,例如添加认证信息、重试等。此外,OpenFeign还支持负载均衡,集成了Hystrix熔断器,可以在服务调用失败或超时时进行降级处理,保证服务的可靠性和可用性。
虽然它是一款很好用的jar,但是最近我在一个SpringCloud项目的引入上却出现了问题
1.1现象
通过2.1的第一种方式引入,可以在开发编译期成功引入openfeign工具类,但是在运行期却抛openfeign的jar包未找到
二、现象分析
字面意思系统在启动的时候没有找到spring-cloud-starter-openfeign的jar包,但是通过检查程序的pom.xml文件,我们通常按照SpringBoot推荐的方式进行openfeign的引入方式如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
这样的引入启动就会抛如上的错误,修改引入如下:(指定版本)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
启动就正常了
三、根源分析
通常我们在使用Spring Cloud 项目的时候,推荐使用starter方法进行第三依赖的引入,并且 spring-cloud-starter,我们只需要指定SpringCloud的版本即可,其他通过spring-cloud-starter引入的项目,默认会根据指定的SpringCloud版本进行自动版本引入,无需我们为版本不兼容烦恼,让程序员更多关注业务开发,将一些模板化的固定模式的内容交给spring-cloud-starter这种模式进行统一管理。
发生这种异常,通常出现在两种情况下,第一种情况:初步搭建环境的时候就抛错,第二种情况:就是开发很久的系统突然要新增或修改功能的时候。这两种情况我们都需要启动项目,然后进行调试工作。
第二种情况是最令人头疼的,通常这种异常抛出,很难去想到是pom文件引入导致的问题,容易让解决问题的思路走向歧途。
3.1、开发编译期成功引入了openfeign工具类,但在运行期抛出openfeign的jar包未找到的错误
出现这种情况可能有以下几种情况:
- 引入的openfeign版本与运行环境不兼容。在运行期,JVM无法找到对应的openfeign jar包,可能是由于引入的版本与运行环境不兼容。检查您使用的openfeign版本是否与您的Spring Cloud版本兼容。
- 依赖关系未正确配置。在运行期,JVM无法找到对应的openfeign jar包,可能是由于依赖关系未正确配置。检查您的项目依赖是否正确配置,并确保所需的jar包已正确引入。
- 构建工具未正确解析依赖。如果您使用构建工具(如Maven或Gradle)来构建项目,可能是由于构建工具未正确解析依赖导致JVM无法找到对应的openfeign jar包。检查您的构建配置文件是否正确配置了依赖,并尝试重新构建项目。
- 手动删除或移动了jar包。在项目开发过程中,有时候会手动删除或移动jar包,这可能会导致运行期找不到对应的jar包。检查您的项目结构,确保所需的jar包存在于正确的位置,并尝试重新构建项目。
最终通过指定OpenFeign的版本解决了这个异常,接下来总结一下那些情况需要明确指定openfeign的版本:
3.2、那些情况需要指定openfeign版本
- 当项目依赖的spring cloud版本与spring-cloud-starter-openfeign的默认版本不兼容时,需要指定合适的版本。
- 当项目需要使用特定版本的openfeign功能或修复某些已知问题时,需要指定相应的版本号。
例如,当Spring Cloud的版本升级时,可能会引入一些新的特性或者修复一些已知的问题,此时可能需要升级spring-cloud-starter-openfeign的版本以获得这些新特性或修复。另外,当项目需要使用特定版本的OpenFeign客户端时,也需要指定相应的版本号。
3.3、那些情况不需要指定openfeign版本号
- 当项目依赖的spring cloud版本与spring-cloud-starter-openfeign的默认版本兼容时,可以不需要指定版本。
- 当项目使用的是较新的spring cloud版本,并且该版本已经包含了spring-cloud-starter-openfeign的最新版本时,也不需要指定版本。
- 此外,如果项目使用的是Spring Cloud的稳定版本,并且该稳定版本已经经过了广泛的应用和测试,那么引入spring-cloud-starter-openfeign也可能不需要指定版本
四、总结
这个问题其实比较典型,我在踩这个坑的时候,有可能通过spring-cloud-starter-openfeign引入第三方包,但是其Spring Cloud没有与之合适的版本,所以需要我们在引入的时候特别指定一下。如果文章有不正确的地方,还望多多指正,希望我们做成长路上的好伙伴