SpringBoot OpenFeign整合okHttpClient实践
前言
SpringCloud微服务之间数据传输一般使用 OpenFeign,简单又易用。ta默认状态下使用 JDK 自带的 HttpURLconnection,这种没有连接池的。
就意味着每发起一个请求,都会创建一个新连接,并且不会对最大连接数加以限制(操作系统的限制,实际上能够创建的连接数量是有限的。)
这种略显野蛮的方式可能会威胁到系统的稳定。所以必须使用池化技术啦。
默认客户端 HttpURLConnection
代码在 package feign 下的 Client 接口类中 , 类中 Default 静态内部类,此类使用jdk提供的客户端实现真正的网络调用.
依赖
- Gradle
implementation 'io.github.openfeign:feign-okhttp'
- Maven
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>配置池化Config
OkHttpClient 这里要导入okhttp3 的依赖,不要使用Feign提供的包装类. 不要导错.
package io.github.diehao;
import okhttp3.ConnectionPool;
import okhttp3.OkHttpClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.TimeUnit;
@Configuration
public class FeignConfig {
@Bean
public OkHttpClient feignClient() {
return new OkHttpClient.Builder()
.connectTimeout(5, TimeUnit.SECONDS)
.readTimeout(5, TimeUnit.SECONDS)
.writeTimeout(5, TimeUnit.SECONDS)
.connectionPool(new ConnectionPool(250, 1, TimeUnit.MINUTES))
.build();
}
}| # 超时设置 | ||
| 方法 | 含义 | 当前值 |
| connectTimeout | 建立连接的最大等待时间 | 5 秒 |
| readTimeout | 从服务器读取响应的最大等待时间 | 5 秒 |
| writeTimeout | 发送请求的最大等待时间 | 5 秒 |
| # 池化设置 | ||
| maxIdleConnections | 最大空闲连接数 | 250 |
| keepAliveDuration | 空闲连接最大存活时间 | 1 |
| timeUnit | 时间单位 | 分钟 |
| ⚠️ 注意点: 关于空闲连接设置除非你有非常高的并发需求,否则 50 - 100 之间即可.默认OkHttp 的连接池默认最大空闲连接数为 5,存活时间是 1 分钟 | ||
Yml 配置
feign:
okhttp:
enabled: true一开始配置成这样,就是不生效.原来是不符合 FeignAutoConfiguration类中 okHttpClient 要求的装配条件.
feign:
client:
config:
default:
http-method: okhttp
测试
你的 OkHttpClient 已就绪!

总结
池化技术一直是作为提升系统性能有力的手段,连接池、线程池、对象池等等。ta有其锋利得地方,但是也不是万无一失的。
既然是池,资源是有限的!有耗尽用完时!有等待分配时!会有等不到报错时!资源闲置回收时!问题就不单单是网络调用请求的事情。
所以结合自身业务如何设置调用参数,就无比重要。更要提高报错分析问题的能力,要理解池子的概念。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Idea中如何调出Run dashboard 或services窗口
这篇文章主要介绍了Idea中如何调出Run dashboard 或services窗口问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-03-03


最新评论