Feign相关内容

微服务架构中,声明式的HTTP客户端。核心作用是简化服务间调用

通过接口+注解定义远程调用,Feign接口使用FeignClient注解。启动类使用EnableFeignClients注解。

原理

feign是一个声明式http客户端。在启动类上加上EnableFeignClients注解。spring启动后,扫描带有FeignClient注解的接口,通过JDK动态代理生成实现类。

调用接口方法时,feign把注解解析成HTTP请求,通过loadBalance进行负载均衡,最终发起远程调用

如何传递header

通过方法参数,RequestHeader注解

或者拦截器

第一次调用慢

很多对象和资源都是在第一次调用时初始化的

  • 创建feign动态代理
  • 初始化负载均衡器,拉取服务器列表
  • 建立http连接池

Feign 超时如何处理

我会从 调用链、服务端、客户端配置、HTTP 客户端选型 四个层面来排查。

第一,先看日志和异常类型,区分是 ConnectTimeout 还是 ReadTimeout。

第二,排查被调用方(模块 B),看接口 RT、CPU、线程池、慢 SQL,确认是不是服务端本身慢。

如果服务端本身就慢,单纯调大 Feign 超时时间是治标不治本。

第三,检查 Feign 的配置,包括 connectTimeout 和 readTimeout,是否设置过小。

在 Spring Cloud 2023 中,Feign 默认使用的是 HttpURLConnection,生产环境我一般会替换为OkHttp并开启连接池,提升性能。

第四,结合业务场景评估是否需要调大超时时间。

如果是偶发抖动,我会适当调大;如果是常态慢,我会推动下游服务优化,而不是一味放大超时时间,避免线程被长时间占用。

此外,生产环境我们一般使用fallbackFactory,既能兜底,又能记录异常日志。