共享 Feign 契约让服务调用不抄接口

zjc 于 2026-08-13 发布

OpenFeign 本来已经很声明式,但如果没有共享契约,消费者仍要在自己模块里重抄一份 provider 接口。路径改了、响应类型变了,两个项目不会同时提醒你。这个项目把跨服务 Feign 接口放进 service-common,让调用方直接注入。

一、契约放在公共 API 包

@FeignClient(
    name = "service-provider",
    contextId = "userFeignApi",
    fallbackFactory = UserFeignFallbackFactory.class
)
public interface UserFeignApi {
    @GetMapping("/user/{id}")
    ApiResponse<UserDTO> getUser(@PathVariable("id") Long userId);
}

https://github.com/springvortex/spring-cloud-alibaba/blob/main/service-common/src/main/java/com/zjc/common/api/user/UserFeignApi.java

接口描述的是跨服务契约,和 DTO 一样属于公共层,而不是某一个消费者的私有代码。

二、contextId 隔离同服务多客户端

两个 Feign 客户端可能指向同一个服务,但超时、拦截器、日志级别不同。contextId 让 OpenFeign 配置能精确到某个客户端,避免同名服务下的配置互相影响。

三、契约资源路径保持简短

接口里写 /user/{id},运行时会由统一 API 路径拦截器补成 /api/v1/provider/user/{id}。这样契约描述资源本身,版本和模块前缀由公共规则推导。

四、公共契约也要克制

只共享确实跨服务使用的 API,不要把 provider 的所有 Controller 都搬进 common。否则公共模块会膨胀,下游也会误用本该内部使用的接口。

五、经验总结

共享 Feign 契约的本质是“接口即文档、接口即代码”。一次修改,编译链路立刻暴露所有调用方,比人工同步注释可靠得多。