
提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档文章目录前言一、OpenFeign实现原理二、面试官追问1.超时怎么配置前言关于微服务组件OpenFeign面试题的记录一、OpenFeign实现原理OpenFeign的核心是声明式接口动态代理。启动时EnableFeignClients触发FeignClientsRegistrar扫描所有FeignClient接口把它们注册成BeanDefinition。注入时生成一个JDK动态代理ReflectiverFeign.FeignInvocationHandler)。调用接口方法时代理拦截到调用交给Contract解析方法上的注解SpringMvcContract解析GetMapping这类组装成RequestTemplate再通过Encoder编码、RequestInterceptor加工加工token、加工TraceId等最后交给Client发送出去。在Spring Cloud里这个client会走LoadBalancer拿到实例列表—负载均衡选一个 --发送HTTP请求返回结果由Decoder解码。二、面试官追问1.超时怎么配置feign.client.config.default.connetionTimeout 和 readTimeout。 有坑Feign额超时会被Ribbon老版本/LoadBalancer的超时覆盖另外readTimeout是从连接建立后开始算的。## 2.重试怎么配置会不会导致重复下单 默认Retryer.NEVER_RETRY,但是底层HttpClient可能重试。写操作绝对不能自动重试除非接口幂等我们用Feign调用下单接口时明确关掉重试。 ## 3.怎么传递请求头 实现RequestInterceptor从RquestContextHolder拿到当前请求的Header把Token/TraceId塞进template.header()中。 ## 4.怎么优化性能 1. 默认用HttpURLConnnetion换Apache HttpClient或OkHttp开启连接池这是收益最大的一条 2. 开启Gzip压缩 3. 合理设置日志级别生产必须时NONE或BASIC,fULL会打印请求体新跟那个损耗很大。 ## 5.Feign和TestTemplate、Dubbo怎么选 Feign声明式、开发效率高、Http通用性好Dubbo是RPC二进制协议长连接性能和吞吐更高但是耦合度也高。内部高频调用用Dubbo对外/异构系统用Feign。 --- # 总结 以上是我参加公司面试时记录的面试题以及我自己回答的答案。