Feign 和 OpenFeign 有什么区别?
Feign 和 OpenFeign 本质上是同一个项目在不同时期的产物。简单来说,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 的注解。
- 只支持 Feign 自带的专属注解,例如
- OpenFeign(Spring Cloud OpenFeign):
- 在保留原有 Feign 注解的基础上,完美支持 Spring MVC 注解(如
@RequestMapping、@GetMapping、@RequestParam、@RequestBody等)。 - 这使得习惯了写 Spring Controller 的开发者可以零学习成本地编写远程调用接口。
- 在保留原有 Feign 注解的基础上,完美支持 Spring MVC 注解(如
代码对比:
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。
右滑查看面试常问