Spring Cloud Feign调用异常:feign.RetryableException: connect timed out executing POST http://xxx

本文档记录了在使用Spring Cloud Feign调用服务时遇到的连接超时问题。问题源于服务提供方在Docker容器内注册的IP,导致本地调用方无法ping通。解决方案包括更换能ping通的Nacos注册中心地址或在同一Docker服务中部署调用方。排查步骤涉及检查命名空间一致性及网络连通性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概述

在使用Spring Cloud Feign接口调用时,发现调用接口链接超时,报错信息如下:

feign.RetryableException: connect timed out executing POST http://xxx

本案例使用 nacos 注册中心

前景提要:提供方的服务已经在开发环境注册中心注册,本地开发服务调用方时,使用开发环境的注册中心,调用服务提供方

二、排查方案

排查一:

如果注册中心含有多个命名空间,则需要保证  调用方、提供方的微服务 在同一个命名空间下

即:spring.cloud.discovery.namespace 保持一致

spring:
     application:
		name: feign-demo
	cloud:
		nacos:
			discovery:
				server-addr: 127.0.0.1:8848
				namespace: dev
			config:
				enabled: false
server:
	port: 80901

如果 nacos 只有一个默认的 public(保留空间),可以不用配置 spring.cloud.discovery.namespace

排查二:


如果 调用方、提供方的微服务 都已经在注册中心成功注册,并且可以查询到 两个微服务信息时,需要排查是否可以 ping 通 两个微服务的注册ip

本地开发调用者ip

 另一个服务提供方注册ip

 

排查发现 ping  服务提供方ip时,请求超时。

 

到这里 feign 接口连接超时问题就找到了,因为服务提供方使用 docker 容器部署,注册ip使用的是容器ip,本地开发的 服务调用方与服务提供方不能够 ping通,导致 connect timed out。

解决方案:

1、更换其他能够 ping 通 服务提供方的 nacos注册中心地址。

2、在同一个docker服务中部署服务调用方

参考:Spring Cloud feign 接口调用,可能出现的各种异常
https://www.iflym.com/index.php/code/202006010001.html
 

### Feign.RetryableException 与 Servlet.service() 连接超时问题分析 Feign 是一种声明式的 Web 服务客户端,它使得编写 HTTP 客户端变得更加简单[^1]。当在使用 Feign 客户端进行调用时,如果目标服务不可达或者网络连接出现问题,可能会抛出 `feign.RetryableException` 异常,其中包含“connect timed out”错误信息。这种异常通常发生在 Feign 客户端尝试与远程服务建立连接但未能成功的情况下。 #### 问题原因 `feign.RetryableException` 中的“connect timed out”错误表明 Feign 客户端在尝试连接到目标服务时超时。这可能是由于以下原因之一: - 网络延迟或不稳定导致连接无法在指定时间内完成。 - 目标服务未启动或不可用。 - Feign 客户端配置的连接超时时间过短,不足以等待目标服务响应。 此外,`Servlet.service()` 方法是 Servlet 的核心方法,用于处理 HTTP 请求和响应。如果在此方法中调用Feign 客户端,并且该客户端抛出了异常,则需要对异常进行捕获并妥善处理,以避免影响整个应用的正常运行[^2]。 #### 解决方案 1. **调整 Feign 客户端的超时设置** Feign 客户端的超时时间可以通过配置来调整。可以设置 `connectTimeout` 和 `readTimeout` 参数以增加允许的最大等待时间。示例如下: ```yaml feign: client: config: default: connect-timeout: 5000 # 单位为毫秒 read-timeout: 5000 # 单位为毫秒 ``` 或者通过代码方式动态设置: ```java import feign.Request.Options; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class FeignConfig { @Bean public Options feignOptions() { return new Options(5000, 5000); // 设置连接超时和读取超时时间为 5 秒 } } ``` 2. **启用重试机制** Feign 提供了内置的重试功能,可以通过配置启用。例如: ```java import feign.Retryer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class FeignConfig { @Bean public Retryer feignRetryer() { return new Retryer.Default(100, java.util.concurrent.TimeUnit.SECONDS.toMillis(1), 3); } } ``` 上述代码将配置 Feign 在遇到异常时最多重试 3 次,每次间隔 1 秒。 3. **捕获并处理异常** 在 `Servlet.service()` 方法中调用 Feign 客户端时,建议捕获 `feign.RetryableException` 并进行适当的处理。例如: ```java protected void service(HttpServletRequest request, HttpServletResponse response) { try { // 调用 Feign 客户端 String result = feignClient.someRemoteCall(); response.getWriter().write(result); } catch (feign.RetryableException e) { // 处理连接超时或其他重试失败的情况 response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); response.getWriter().write("Failed to connect to remote service: " + e.getMessage()); } catch (Exception e) { // 其他异常处理逻辑 response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); response.getWriter().write("Unexpected error: " + e.getMessage()); } } ``` 4. **检查目标服务状态** 确保目标服务正在运行并且网络连接正常。可以通过工具如 `ping` 或 `telnet` 测试目标服务的可达性。 #### DispatcherServlet 的角色 `DispatcherServlet` 是 Spring MVC 的核心组件之一,负责将请求分发到相应的控制器。如果在 `DispatcherServlet` 的处理过程中调用Feign 客户端,则需要确保上述异常处理逻辑已经正确实现,以避免因 Feign 调用失败而导致整个请求处理链中断[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值