当前位置: 首页 > ops >正文

高并发feign调用 :Address already in use: no further information executing POST

问题描述

最近再测试数据时,发现高并发情况下,服务之间的feign调用会出现一下报错:

Address already in use: no further information executing POST

原因

查找了一些资料,也做了一些测试,最终确认可能时因为并发量太大,HTTP连接未及时释放。导致资源耗尽了。

Feign默认使用的是HTTP客户端,比如JDK自带的HttpURLConnection,但它的性能可能不够好,特别是在高并发下容易耗尽连接池资源。通常的解决方法是替换为更高效的客户端,例如Apache HttpClient或OkHttp,并配置连接池参数。

解决办法

使用Apache HttpClient

依赖:

<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
<version>12.5</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.14</version>
</dependency>

先自定义实现相关配置

@Configuration
public class FeignConfig {@Bean@Primary   //确保全局配置类中的Bean名称不与自动配置冲突public CloseableHttpClient httpClient() {return HttpClientBuilder.create()// 设置最大连接总数.setMaxConnTotal(200)// 设置单个路由的最大连接数(针对特定目标主机的最大并发).setMaxConnPerRoute(50)// 配置连接存活时间(单位:毫秒).setKeepAliveStrategy((response, context) -> 30000)// 禁用自动重试.disableAutomaticRetries().build();}@Bean@Primary    //确保全局配置类中的Bean名称不与自动配置冲突public Client feignClient() {return new ApacheHttpClient(httpClient());}// 可选:配置超时参数@Bean@Primary   //确保全局配置类中的Bean名称不与自动配置冲突public Request.Options options() {return new Request.Options(5_000,   // 连接超时时间(ms)10_000   // 读取超时时间(ms));}
}

再具体的feign中配置:

@FeignClient(name = "serviceName",configuration = FeignConfig.class // 指定配置类)
public interface MyFeignClient {// ...
}

如果时全局的feign都使用这个配置,在@EnableFeignClients注解有一个defaultConfiguration属性,可以指定一个全局的配置类,这样所有Feign客户端都会应用这个配置,而无需每个客户端单独指定。

// 全局配置方案:通过@EnableFeignClients注解统一指定
@SpringBootApplication
@EnableFeignClients(defaultConfiguration = FeignConfig.class) // 关键配置
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

若某个Feign客户端单独指定了configuration,则局部配置优先于全局配置

 使用okHttp

// OkHttp全局配置方案
@Configuration
public class FeignOkHttpConfig {// 配置OkHttp连接池(默认最大空闲连接数5,存活时间5分钟)@Beanpublic OkHttpClient okHttpClient() {return new OkHttpClient.Builder().connectionPool(new ConnectionPool(100, // 最大空闲连接数5,   // 存活时间(单位:分钟)TimeUnit.MINUTES)).connectTimeout(5, TimeUnit.SECONDS)   // 连接超时.readTimeout(10, TimeUnit.SECONDS)     // 读取超时.writeTimeout(10, TimeUnit.SECONDS)    // 写入超时.retryOnConnectionFailure(false)       // 禁用自动重试.build();}// 声明使用OkHttp客户端@Beanpublic Client feignClient(OkHttpClient okHttpClient) {return new feign.okhttp.OkHttpClient(okHttpClient);}
}

全局配置和单一的feign配置和httpclient一样

@EnableFeignClients(defaultConfiguration = FeignOkHttpConfig.class)
@SpringBootApplication(exclude = {HttpClientAutoConfiguration.class // 排除Apache HttpClient自动配置
})
public class Application {...}

http://www.xdnf.cn/news/12360.html

相关文章:

  • 华为OD机试_2025 B卷_数组去重和排序(Python,100分)(附详细解题思路)
  • 【Elasticsearch】映射:Nested 类型
  • Docker部署Hive大数据组件
  • Vue 渲染 Markdown 文件完全指南
  • 前端项目初始化
  • 浏览器工作原理06 [#]渲染流程(下):HTML、CSS和JavaScript是如何变成页面的
  • 【Python】数据类型
  • 赋能大型语言模型与外部世界交互——函数调用的崛起
  • 数据治理在制造业的实践案例
  • 北斗卫星导航系统(BDS)的 RNSS 和 RDSS
  • VMware Workstation 与 Hyper-V 不兼容。请先从系统中移除 Hyper-V 角色,然后再运
  • PostgreSQL17 编译安装+相关问题解决
  • spring:实例化类过程中方法执行顺序。
  • 使用 Mechanical 脚本获取联合反作用力和力矩
  • Python Day43 学习(日志Day10-11复习)
  • 简单了解以下Hugging Face(抱抱脸)
  • 负载均衡LB》》HAproxy
  • php执行系统命令的四个常用函数
  • 西北某省级联通公司:3D动环模块如何实现机房“一屏统管”?
  • [蓝桥杯]轨道炮
  • android debug包和release包的区别
  • 解决 VSCode 中无法识别 Node.js 的问题
  • Python训练营打卡DAY46
  • day 46
  • UNECE R158——解读自动驾驶相关标准法规(VRU)
  • 实践提炼,EtherNet/IP转PROFINET网关实现乳企数字化工厂增效
  • MySQL 回表、索引覆盖与查询优化
  • 5.1 HarmonyOS NEXT系统级性能调优:内核调度、I/O优化与多线程管理实战
  • 高等数学》(同济大学·第7版)第二章第一节“导数的概念“
  • 西安国际数字科创产业园:数字产业生态的开拓者