一、为什么要优化Feign
1.1 什么是Feign
Feign是—个声明式、模板化的HTTP客户端
在HTTP协议中,发送请求的一方就是HTTP 客户端,在JAVA 中,有很多HTTP 客户端框架。
实际Feign 集成简化了其他HTTP 客户端框架,实际发送请求是由Feign 中的Client接口实现类去处理的,默认使用的是Defalut 类,该类使用的是HttpURLConnection。
1.2 为什么Feign需要优化
既然发送请求,是由Feign 中的Client接口实现类去处理的。
那么必然遵循HTTP通信过程:
在HTTP 通信的过程中,建立连接是一个很复杂的过程,涉及到多个数据包的交换,很耗时间。
而且HTTP连接需要3次握手和4次挥手开销都很大。
如果没有连接池那么将会反复创建与销毁,在请求量上来的时候,将会导致接口响应变慢,整体时间变长。
所以采用HTTP连接池,节约大量的3次握手4次挥手时间,提升吞吐量。
1.3 skywalking 查看feign阻塞
如下图1,通过skywalking 观察
高并发压测流量突增时,请求阻塞在feign上,业务逻辑其实并未执行,self耗时特别长

1.4 选择哪一种池化技术
- HttpURLConnection 不推荐
- Feign默认的HttpURLConnection是JDK自带的,并不支持连接池。
- 如果要实现连接池的机制,还需要自己来管理连接对象。
- HttpClient 推荐
- HttpClient 相比JDK自带的HttpURLConnection,它封装了访问HTTP的请求头,参数,内容体,响应等等。
- 它不仅使客户端发送HTTP请求变得容易,而且也方便了开发人员测试接口(基于HTTP协议的),既提高了开发的效率,又提高了代码的健壮性。
- 另外高并发大量的请求网络的时候,也是用"连接池"提升吞吐量。
- OkHttp 推荐
- OkHttp作为后期之秀,功能和性能上,可能稍优于HttpClient ,但是几乎没多大区别,实际使用时都可以
二、Feign使用httpclient
- 第一步:验证配置类,在idea中双击“SHift”中输入 HttpClientFeignLoadBalancedConfiguration

- 第二步:检查是否缺少ApacheHttpClient
- 如果缺少的话,feign 连接池也不会生效,同时“feign.httpclient.enabled=true” 才能生效

- 如果缺少的话,feign 连接池也不会生效,同时“feign.httpclient.enabled=true” 才能生效
- 第三步:引包
- SpringBoot 1.* 引入如下包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
-
- SpringBoot 2.* 引入如下包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
-
- 如果ApacheHttpClient类还在报红,引入下面的包 推荐9.6.0以上版本 如10.10.1
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
- 第四步:启动,确认启用
- 定位到HttpClientFeignLoadBalancedConfiguration 的connectionManager方法,打一个断点,启动的时候进来,说明生效了

- 第五步:配置,feignClient 的配置如下
- 这个配置完了即可生效
feign.httpclient.enabled = true #httpClient 启用开关
feign.httpclient.maxConnections = 1000 #最大连接数
feign.httpclient.maxConnectionsPerRoute = 300 #feign单个路径的最大连接数
feign.httpclient.connectionTimeout = 3000 #超时时间
三、Feign使用Okhttp
- 第一步:在idea中双击“SHift”中输入 OkHttpFeignLoadBalancedConfiguration

- 第二步:检查是否缺少OkHttpClient
- 如果缺少的话,feign 连接池也不会生效,同时“feign.okhttp.enabled=true” 才能生效

- 第三步:引包
- SpringBoot 1.* 引入如下包
- feign-okhttp 推荐使用9.6.0以上版本 如10.10.1
- SpringBoot 1.* 引入如下包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
- SpringBoot 2.* 引入如下包
- feign-okhttp 推荐使用9.6.0以上版本 如10.10.1
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
- 第四步:启动,确认生效
- 定位到OkHttpFeignLoadBalancedConfiguration 的httpClientConnectionPool方法,打一个断点,启动的时候进来,说明生效了

- 第五步:配置,feignClient 的配置如下
- 配置完成即可生效
feign.httpclient.enabled = false #httpClient 关闭
feign.okhttp.enabled = true #okHttpClient 启用
feign.httpclient.maxConnections = 1000 #最大连接数
feign.httpclient.maxConnectionsPerRoute = 300 #feign单个路径的最大连接数
feign.httpclient.connectionTimeout = 3000 #超时时间
本文探讨了为什么需要优化Feign,分析了Feign在高并发下出现请求阻塞的问题,并推荐了使用HttpClient和OkHttp作为Feign的连接池技术,详细介绍了配置和验证这两者的方法。
112

被折叠的 条评论
为什么被折叠?



