欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

集成feign碰到的问题

程序员文章站 2022-05-12 23:07:47
...

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包中),排查了是版本冲突问题
集成feign碰到的问题
接着按照错误信息指示,找下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有四种实现方式
集成feign碰到的问题
可通过两种配置方式配置:
(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去实现

参考资料

  1. SpringCloud 版本.
  2. Feign、httpclient、OkHttp3 结合使用.
相关标签: exception