记录feign远程调用问题

在测试环境中,A服务通过Feign成功调用了B服务的接口,但在生产环境中,由于B服务部署在非Docker的服务器上,导致Feign调用出现'connect timeout executing'的错误。问题根源在于容器外的服务无法连接到容器内的服务。为解决此问题,可以参考相关技术文章进行排查和配置调整,确保网络通信的畅通。

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

一、问题现象描述:
在A服务上使用Feign远程调用B服务的接口,测试环境A、B两个服务都是使用后k8s部署,可以访问成功;生产环境,B服务使用k8s部署在docker容器上,服务手动部署在另外一台服务器(非docker容器),接口调用报错”Caused by: feign.RetryableException: connect timed out executing“

二、原因分析
容器外的服务不能链接到容器内的服务

三、解决办法
参考:https://blog.youkuaiyun.com/qq_48721706/article/details/124937543

### Feign 远程调用工作原理详解 Feign 是一种声明式的 Web 服务客户端,它使得编写 HTTP 客户端变得更加简单。通过定义接口并使用注解来描述请求细节,可以轻松实现对其他微服务的远程调用。 #### 接口定义与配置 为了使 Feign 能够正常工作,首先需要定义一个用于表示远程 API 的接口,并为其添加必要的注释。这通常涉及到指定 URL、HTTP 方法以及参数映射等内容[^1]: ```java @FeignClient(name = "example-service", url = "http://localhost:8080") public interface ExampleServiceClient { @GetMapping("/api/example") String getExample(); } ``` 上述代码片段展示了如何利用 `@FeignClient` 注解标记一个名为 `example-service` 的远程服务,并指定了其基础地址;接着,在具体的方法上应用了 Spring MVC 风格的路径映射和 HTTP 动词注解。 #### Bean 创建过程 当应用程序启动时,Spring Cloud 将会扫描所有带有 `@FeignClient` 注解的类,并自动注册对应的 bean 至上下文中。这意味着开发者无需手动管理这些 client 对象的生命期或初始化逻辑——一切都由框架处理完成[^2]。 一旦完成了这一系列准备工作之后,便可以在任何地方像操作普通 Java 类一样直接依赖注入此类型的对象来进行远程调用了。 #### 请求执行机制 实际发起网络请求前,Feign 会先根据所给定的目标 URI 和方法签名构建出完整的 HTTP 请求信息。随后借助内部集成的支持库(如 Apache HttpClient 或 OkHttp),将此请求发送出去等待响应到来。值得注意的是,整个过程中还包含了诸如编码/解码、日志记录等功能模块的支持,从而进一步简化开发者的编程体验。 此外,考虑到分布式环境中可能出现的服务不可达等问题Feign 提供了一套完善的熔断降级策略。即当检测到某项特定的操作频繁失败时,则暂时停止对该资源的一切访问尝试直至恢复正常为止[^3]。 最后值得一提的是,针对不同的业务场景需求,还可以自定义 fallback 工厂以提供更加灵活可控的行为模式。例如下面这段代码就展示了一个实现了回退功能的消息 API 客户端工厂接口[^4]: ```java @Component public class MessageApiFallbackFactory implements FallbackFactory<MessageApiFeignClient> { @Override public MessageApiFeignClient create(Throwable cause) { return new MessageApiFeignFallBackFactoryClient(cause); } } interface MessageApiFeignFallBackFactoryClient extends MessageApiFeignClient{ // Implement default behavior here... } ``` 综上所述,Feign 不仅能够帮助我们快速搭建起高效稳定的 RESTful 微服务体系间通信桥梁,同时也提供了丰富的扩展点以便应对复杂多变的实际应用场景挑战。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值