基于本文回答
0
评论

Feign 和 OpenFeign 有什么区别?

知识点图片

FeignOpenFeign 本质上是同一个项目在不同时期的产物。简单来说,OpenFeign 是 Feign 的升级版和接替者

对于现在的 Java 和 Spring Cloud 开发者来说,实际开发中使用的都是 OpenFeign

以下是它们的核心区别:

1. 历史背景与维护状态

  • Feign(Netflix Feign)
    • 出身:最初由 Netflix 公司开发,是 Netflix OSS(开源软件组件)的一部分。
    • 状态:Netflix 后来宣布停止维护许多开源组件(包括 Eureka、Hystrix、Feign 等),Feign 进入了停更状态。
  • OpenFeign
    • 出身:由于 Netflix 停止维护,Feign 被移交给了开源社区(Github 上的 OpenFeign 组织),并正式更名为 OpenFeign。
    • 状态:目前非常活跃,由开源社区持续维护和更新。

2. 注解支持(最直观的开发区别)

这是开发者在写代码时感受最明显的区别:

  • Feign
    • 只支持 Feign 自带的专属注解,例如 @RequestLine@Param
    • 不支持 Spring MVC 的注解。
  • OpenFeign(Spring Cloud OpenFeign)
    • 在保留原有 Feign 注解的基础上,完美支持 Spring MVC 注解(如 @RequestMapping@GetMapping@RequestParam@RequestBody 等)。
    • 这使得习惯了写 Spring Controller 的开发者可以零学习成本地编写远程调用接口。

代码对比:

java
// 旧版 Netflix Feign 的写法
public interface UserClient {
    @RequestLine("GET /users/{id}")
    User getUser(@Param("id") Long id);
}

// 新版 OpenFeign (配合 Spring Cloud) 的写法
@FeignClient(name = "user-service")
public interface UserClient {
    @GetMapping("/users/{id}")
    User getUser(@PathVariable("id") Long id);
}

3. Spring Cloud 生态集成

  • Feign
    • 存在于早期的 Spring Cloud 版本中(如 Dalston、Edgware 版本)。
    • 依赖包通常是 spring-cloud-starter-feign
  • OpenFeign
    • 从 Spring Cloud Finchley 版本开始,Spring 官方正式使用 OpenFeign 替换了老版本的 Feign。
    • 依赖包变更为 spring-cloud-starter-openfeign

4. 依赖坐标 (Maven/Gradle)

  • 旧版 Feign
    xml
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-feign</artifactId> <!-- 已废弃 -->
    </dependency>
  • 新版 OpenFeign
    xml
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId> <!-- 当前主流 -->
    </dependency>

总结对比表

特性 Feign (Netflix) OpenFeign
创造者/维护者 Netflix / 已停止维护 开源社区 / 持续活跃维护
Spring MVC 注解 ❌ 不支持(需用 @RequestLine 等) ✅ 原生支持(@GetMapping 等)
底层核心依赖包 com.netflix.feign:* io.github.openfeign:*
Spring Cloud 依赖 spring-cloud-starter-feign spring-cloud-starter-openfeign
使用建议 绝对不要在新项目中使用 当前微服务开发的主流标配

结论:如果你现在在学习或搭建 Spring Cloud 微服务项目,请直接无视旧版的 Feign,全部使用 OpenFeign 即可。日常交流中,大家常说的“用 Feign 调一下接口”,通常指的也是 OpenFeign。

右滑查看面试常问