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

文章讲述了在本地进行JUnit单元测试时,尝试连接部署在Centos7开发环境上的服务,因Feign的RetryableException:connecttimedout而失败。解决方法是确认服务端口未开,通过firewalld添加并重启7002/TCP端口以允许网络访问。

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

本机JUnit单元测试时,调用部署在开发环境(Centos7)的服务时,报feign.RetryableException: connect timed out

直接访问服务地址时,提示网络无法访问

http://192.168.1.15:7002/comDictionary/getDictionaryById?dictionaryId=GIVE_LOGIN

发现端口没有打开。需要打开linux防火墙的端口

firewall-cmd --permanent --zone=public --add-port=7002/tcp
firewall-cmd --reload

### 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]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值