集成feign碰到的问题
集成feign碰到的问题
springboot集成feign
在springboot集成opoenfeign的过程中,项目启动的时候报错了,记录下解决问题的过程
问题描述
当时在A项目使用springboot集成openfeign的时候,没有出现问题,但是在B项目集成的时候启动报错,错误信息如下
Caused by: java.lang.ClassNotFoundException: org.apache.http.impl.client.HttpClientBuilder
解决思路
看错误信息还是很明显的,缺少了HttpClientBuilder类,但是为什么在A项目集成的时候没有出现问题呢?
一开始我认为是springboot和openfeign版本冲突导致的,于是查了下springboot和openfeign版本的对应关系(openfeign在springcloud包中),排查了是版本冲突问题
接着按照错误信息指示,找下org.apache.http.impl.client.HttpClientBuilder类在哪个包中,发现在httpclient包中,发现项目中已经引入过了httpclient依赖了
<!--httpclient-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.2.1</version>
</dependency>
但是项目中却搜不到HttpClientBuilder类,于是找下httpclient最新的版本升级试试,果然可以搜到HttpClientBuilder类了,于是重启项目试下,发现项目启动成功。
<!--httpclient-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.12</version>
</dependency>
原因分析
feign的client有四种实现方式
可通过两种配置方式配置:
(1)org.springframework.cloud.openfeign.ribbon.FeignRibbonClientAutoConfiguration
(2)org.springframework.cloud.openfeign.FeignAutoConfiguration
由于当前项目没有使用到ribbon负载均衡的组件,所以项目使用FeignAutoConfiguration进行配置
package org.springframework.cloud.openfeign;
@Configuration
@ConditionalOnClass(Feign.class)
@EnableConfigurationProperties({FeignClientProperties.class, FeignHttpClientProperties.class})
public class FeignAutoConfiguration {
// the following configuration is for alternate feign clients if
// ribbon is not on the class path.
// see corresponding configurations in FeignRibbonClientAutoConfiguration
// for load balanced ribbon clients.
@Configuration
@ConditionalOnClass(ApacheHttpClient.class)//如果存在ApacheHttpClient类
@ConditionalOnMissingClass("com.netflix.loadbalancer.ILoadBalancer")
@ConditionalOnMissingBean(CloseableHttpClient.class)
@ConditionalOnProperty(value = "feign.httpclient.enabled", matchIfMissing = true)
protected static class HttpClientFeignConfiguration {
...
}
@Configuration
@ConditionalOnClass(OkHttpClient.class)// 如果存在OkHttpClient类
@ConditionalOnMissingClass("com.netflix.loadbalancer.ILoadBalancer")
@ConditionalOnMissingBean(okhttp3.OkHttpClient.class)
@ConditionalOnProperty(value = "feign.okhttp.enabled")
protected static class OkHttpFeignConfiguration {
....
}
}
由于项目A没有使用httpclient包,feign会使用自己的httpclient客户端去实现,但是B项目使用apache的httpclient包,存在ApacheHttpClient,所以B项目feign使用的是apache的httpclient去实现
参考资料
上一篇: 字符串的排列&&翻转单词顺序列
下一篇: 字符串中空格的替换
推荐阅读