在Java中使用Eureka和Feign时,connectTimeout和readTimeout是控制HTTP请求超时的关键参数,它们分别管理TCP连接建立和响应读取两个阶段:
1. connectTimeout(连接超时)
作用:控制建立TCP连接的最大等待时间(三次握手完成的时间)。
触发场景:当客户端无法在指定时间内与服务端建立物理连接时触发。
异常示例:
java.net.SocketTimeoutException: connect timed out
典型原因:
网络拥堵或路由问题
服务实例宕机
防火墙拦截
推荐值:通常较短(1~5秒),因为建立连接应是快速操作。
2. readTimeout(读取超时)
作用:控制从服务端获取响应数据的最大等待时间(连接建立后到完整接收响应的时间)。
触发场景:连接已建立,但服务端未在指定时间内返回完整响应。
异常示例:
java.net.SocketTimeoutException: Read timed out
典型原因:
服务端处理逻辑耗时过长
数据库查询慢或死锁
服务端资源不足(CPU/内存)
推荐值:根据业务逻辑复杂度设置(通常5~30秒)。
配置示例(YAML)
feign:
client:
config:
default: # 全局默认配置(可替换为服务名进行特定配置)
connectTimeout: 2000 # 连接超时 2秒
readTimeout: 10000 # 读取超时 10秒
注意事项
-
版本差异:
Spring Cloud 2020+:直接通过feign.client.config配置。
旧版本(使用Ribbon):需配置Ribbon参数:
ribbon:
ConnectTimeout: 2000
ReadTimeout: 10000 -
生效范围:
default:全局生效(所有Feign客户端)。
指定服务:将default替换为服务名(如user-service)可单独配置。
-
超时关系:
-
生产建议:
测试环境设置较小值(如500ms)快速暴露问题。
生产环境根据SLA调整,避免因超时导致级联故障。
结合Hystrix或Resilience4j实现熔断降级。