Spring Boot 3中默认使用的Feign(OpenFeign)与Spring Boot 2版本的核心区别,这些区别主要集中在依赖适配、底层组件、规范兼容、配置项等方面,下面按维度拆解,结合示例让你一目了然。
核心区别总览
先明确版本映射关系(基础前提):
- Spring Boot 2 → 对应Spring Cloud 2021.x及更早版本(如Hoxton、2020.x),Feign基于
OpenFeign 10.x/11.x; - Spring Boot 3 → 对应Spring Cloud 2022.x+(Kilburn、2023.x、2024.x),Feign基于
OpenFeign 12.x+,且完全适配Jakarta EE。
一、核心依赖与底层组件变更
这是最关键的区别,直接影响使用方式:
| 维度 | Spring Boot 2 (Feign) | Spring Boot 3 (Feign) |
|---|---|---|
| 负载均衡默认组件 | 早期依赖Netflix Ribbon(后期版本需手动切换到LoadBalancer),引入spring-cloud-starter-openfeign会自动带ribbon依赖 | 完全移除Ribbon,默认依赖Spring Cloud LoadBalancer,引入Feign依赖即自动集成LoadBalancer |
| 核心规范依赖 | 基于Java EE(javax.*包),如javax.servlet、javax.ws.rs | 基于Jakarta EE 9+(jakarta.*包),如jakarta.servlet、jakarta.ws.rs |
| JDK版本要求 | 兼容JDK 8/11(主流) | 最低要求JDK 17(强制) |
| OpenFeign版本 | 10.x/11.x | 12.x+(适配Jakarta EE) |
依赖配置示例对比
1. Spring Boot 2(pom.xml)
<!-- Feign依赖(自动带Ribbon) -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<!-- 适配Spring Boot 2.7.x,比如2021.0.5 -->
<version>2021.0.5</version>
</dependency>
<!-- 如需替换为LoadBalancer,需手动排除Ribbon + 引入LoadBalancer -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
2. Spring Boot 3(pom.xml)
<!-- Feign依赖(自动带LoadBalancer,无Ribbon) -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<!-- 适配Spring Boot 3.1.x,比如2023.0.0 -->
<version>2023.0.0</version>
</dependency>
<!-- 无需排除Ribbon,也无需手动引入LoadBalancer -->
二、配置项变化
1. 负载均衡配置(核心)
- Spring Boot 2:需配置Ribbon参数(如
ribbon.ReadTimeout=5000),切换LoadBalancer后才用loadbalancer.xxx; - Spring Boot 3:仅支持
loadbalancer.xxx和feign.client.config.xxx,ribbon.xxx配置完全失效。
配置文件对比
Spring Boot 2(application.yml)
# Ribbon配置(默认生效)
ribbon:
ReadTimeout: 5000
ConnectTimeout: 3000
# 若切换LoadBalancer,需加
spring:
cloud:
loadbalancer:
ribbon:
enabled: false # 关闭Ribbon
Spring Boot 3(application.yml)
# 直接配置LoadBalancer/Feign参数
feign:
client:
config:
default:
connectTimeout: 3000
readTimeout: 5000
httpclient:
enabled: true # 若用Apache HttpClient
spring:
cloud:
loadbalancer:
max-connections: 200 # LoadBalancer连接池
2. 注解/API兼容
Spring Boot 3的Feign中,所有javax.*相关的注解/类都替换为jakarta.*,比如:
- 旧:
javax.ws.rs.GET→ 新:jakarta.ws.rs.GET; - 旧:
javax.servlet.http.HttpServletRequest→ 新:jakarta.servlet.http.HttpServletRequest。
如果自定义Feign拦截器/编码器时用到javax包,升级后会报“类找不到”错误,需替换为jakarta包。
三、自动配置类变化
- Spring Boot 2:核心自动配置类
FeignRibbonClientAutoConfiguration(适配Ribbon); - Spring Boot 3:核心自动配置类
FeignLoadBalancerAutoConfiguration(适配LoadBalancer),移除所有Ribbon相关的自动配置。
四、其他细节区别
- Feign客户端创建方式:
- Boot2中部分低版本支持
Feign.builder()结合javax类; - Boot3中
Feign.builder()适配jakarta类,且默认的FeignClientFactoryBean逻辑优化,更贴合Spring Boot 3的上下文管理。
- Boot2中部分低版本支持
- 第三方HTTP客户端适配:
- Boot2:
feign-httpclient适配Apache HttpClient 4.x; - Boot3:
feign-httpclient适配Apache HttpClient 5.x(也兼容4.x,但推荐5.x)。
- Boot2:
- 兼容性:
- Boot2的Feign代码直接迁移到Boot3会报错(主要是
javax→jakarta、Ribbon配置失效); - 需修改依赖、替换
javax包为jakarta、删除Ribbon配置。
- Boot2的Feign代码直接迁移到Boot3会报错(主要是
总结
Spring Boot 3的Feign对比Spring Boot 2的核心区别可总结为3点:
- 负载均衡组件:从默认Ribbon彻底切换为Spring Cloud LoadBalancer,无需手动排除/引入,
ribbon配置失效; - 规范适配:从Java EE(
javax.*)迁移到Jakarta EE(jakarta.*),涉及注解/API的包名变更; - 版本要求:JDK最低17,OpenFeign版本升级到12.x+,依赖适配Spring Cloud 2022.x+。
简单来说,Boot3的Feign更轻量化(移除停更的Ribbon)、更符合最新的Java规范,但升级时需重点处理包名替换和配置项清理。