SpringBoot OpenFeign整合okHttpClient实践

 更新时间:2026年04月20日 09:33:03   作者:倒流时光三十年  
SpringCloud默认使用JDK自带HttpURLConnection进行数据传输,但没有连接池,意味着每发起一个请求都会创建一个新连接,为提高系统的稳定,需要使用池化技术,这里使用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有其锋利得地方,但是也不是万无一失的。

既然是池,资源是有限的!有耗尽用完时!有等待分配时!会有等不到报错时!资源闲置回收时!问题就不单单是网络调用请求的事情。

所以结合自身业务如何设置调用参数,就无比重要。更要提高报错分析问题的能力,要理解池子的概念。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java SpringBoot安全框架整合Spring Security详解

    Java SpringBoot安全框架整合Spring Security详解

    这篇文章主要介绍了Spring Boot整合Spring Security的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-09-09
  • 详解MyBatis Plus中分页插件的使用

    详解MyBatis Plus中分页插件的使用

    这篇文章主要为大家详细介绍了MyBatis Plus中分页插件使用的相关知识,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-02-02
  • 解决Spring boot整合mybatis,xml资源文件放置及路径配置问题

    解决Spring boot整合mybatis,xml资源文件放置及路径配置问题

    这篇文章主要介绍了解决Spring boot整合mybatis,xml资源文件放置及路径配置问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Springboot actuator生产就绪功能实现解析

    Springboot actuator生产就绪功能实现解析

    这篇文章主要介绍了Springboot actuator生产就绪功能实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java实现邮件发送功能

    Java实现邮件发送功能

    这篇文章主要为大家详细介绍了Java实现邮件发送功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 解决问题:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources

    解决问题:Failed to execute goal org.apache.m

    这篇文章主要给大家介绍了关于解决问题:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources的相关资料,文中将解决的办法介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • mybatisplus中返回Vo的案例讲解

    mybatisplus中返回Vo的案例讲解

    这篇文章主要介绍了mybatisplus中返回Vo的案例,mybatisplus内置的几个方法使用泛型限制了方法的返回类型,所以实现返回Vo还是得自定义方法, 这个方法名尽量不要和原有的名字类似,本文通过实例代码给大家详解讲解,需要的朋友可以参考下
    2023-03-03
  • java解析xml之sax解析xml示例分享

    java解析xml之sax解析xml示例分享

    SAX基于事件的解析,解析器在一次读取XML文件中根据读取的数据产生相应的事件,由应用程序实现相应的事件处理逻辑,即它是一种“推”的解析方式;这种解析方法速度快、占用内存少,但是它需要应用程序自己处理解析器的状态,实现起来会比较麻烦
    2014-01-01
  • Java 普通代码块静态代码块执行顺序(实例讲解)

    Java 普通代码块静态代码块执行顺序(实例讲解)

    下面小编就为大家带来一篇Java 普通代码块静态代码块执行顺序(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • java实现文件上传下载和图片压缩代码示例

    java实现文件上传下载和图片压缩代码示例

    本文给大家介绍的是项目中经常需要用到的一个常用的功能,使用java实现文件的上传下载和图片的压缩功能,这里推荐给大家,有需要的小伙伴参考下。
    2015-03-03

最新评论