连载中 8/20

远程调用:Feign 的优雅与陷阱

2026-08-26 · 917 阅读 · 0 评论 · 0 赞

从手写 HTTP 到一个接口

早期的服务间调用长这样:拼 URL、发请求、解析响应、处理异常,每个调用点抄一遍。Feign 把这套动作收进一个接口:接口加注解,动态代理帮你发请求——调用远程服务像调用本地方法。可读性上去了,代价是底层细节被藏起来,藏不住的坑也一起被藏了起来。

@FeignClient(name = "inventory")
public interface InventoryClient {

    @PostMapping("/api/stock/deduct")
    Result<Boolean> deduct(@RequestParam("skuId") Long skuId,
                           @RequestParam("num") Integer num);

    @GetMapping("/api/stock/get")
    Result<StockDTO> get(@RequestParam("skuId") Long skuId);
}

// 调用方式与本地方法无异
Result<Boolean> r = inventoryClient.deduct(skuId, 1);

底层只有一句话

启动时扫描 @FeignClient 接口,用动态代理生成实现;调用时按注解把方法调用翻译成 HTTP 模板请求,依次经过编码器、拦截器、负载均衡器,拿到响应后交给解码器。理解这条链路,所有配置项都能对号入座:超时在哪层生效、日志怎么开、Token 怎么注入——知道每个部件在哪,才谈得上排障

陷阱一:超时与重试的默认值

Feign 默认连接超时 10 秒、读超时 60 秒——对线上接口来说长得离谱,一次下游抖动就能把上游线程拖死一片。接入后第一件事:把默认超时改成业务能接受的值。重试的默认行为也要看清:默认不重试是对的方向,一旦自定义重试器,务必确认接口幂等——非幂等接口重试一次,库存可能扣两次

feign:
  okhttp:
    enabled: true            # 换掉默认的 HttpURLConnection,开启池化
  client:
    config:
      default:
        connectTimeout: 1000 # 建连 1s 封顶
        readTimeout: 3000    # 读超时按接口 P99 的 2~3 倍定
      inventory-client:      # 按客户端名覆盖,精细控制
        readTimeout: 500

陷阱二:参数传递的花样

三个高频问题:GET 请求传对象参数要加 @SpringQueryMap,否则对象被当成请求体;路径参数漏写 @PathVariable("name") 的名字,编译能过但拼出来的 URL 悄悄多个 null;日期参数两边序列化格式不一致,查三天数据永远少一天。这类问题不报错、只是悄悄算错,上线前用真实流量回放一遍参数

陷阱三:连接池,抖动的隐形元凶

Feign 默认用 HttpURLConnection——没有连接池,每次请求重新建连,HTTPS 握手成本更高,RT 表现为周期性毛刺。换成 OkHttp 或 Apache HttpClient 并开启池化,是 Feign 优化的第一刀;最大连接数、单路由并发数跟着调,压测确认容量。很多找不出原因的偶发超时,根因就在这里

超时与重试不止是 Feign 的配置项,更是全链路的时间管理——下一篇把预算制讲清楚。

503

10 年全栈工程师 · 503咖啡馆主理人

#Feign#远程调用#超时配置#连接池#声明式调用

评论 (0)

相关推荐

连载中 12/20

排查四件套:jstack、jmap、jstat、jcmd 的实战分工

jstack 看线程在干什么,jmap 看堆里装了什么,jstat 看运行时在变什么,jcmd 是统一入口。四把刀各管一段,配合着用没有查不动的现场。

#jstack#jmap#jstat#jcmd#排查工具
2026-09-16 · 5 阅读 · 0 评论 · 0 赞
连载中 11/20

GC 日志:把回收过程翻译成人话

一行 GC 日志里塞着七种信息:谁触发的、收了哪、停了多久、活了哪些。加上 -Xlog 配置,再加上日志分析工具,GC 不再是只能盯监控曲线的黑盒。

#GC日志#Xlog#日志分析#GC监控#Full GC排查
2026-09-16 · 13 阅读 · 0 评论 · 0 赞
连载中 10/20

ZGC:亚毫秒停顿是怎么炼成的

百 G 大堆停顿不到一毫秒,靠的是把搬家全部挪到并发阶段——着色指针让引用自带状态,读屏障让搬运中的对象依然可访问。代价是吞吐与内存,收益是停顿与堆大小解耦。

#ZGC#着色指针#读屏障#亚毫秒停顿#分代ZGC
2026-09-15 · 8 阅读 · 0 评论 · 0 赞