springboot3 Feign 与springboot 2有什么区别?

springboot3 Feign 与springboot 2有什么区别?

_

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 EEjavax.*包),如javax.servletjavax.ws.rs基于Jakarta EE 9+jakarta.*包),如jakarta.servletjakarta.ws.rs
JDK版本要求兼容JDK 8/11(主流)最低要求JDK 17(强制)
OpenFeign版本10.x/11.x12.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.xxxfeign.client.config.xxxribbon.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相关的自动配置。

四、其他细节区别

  1. Feign客户端创建方式
    • Boot2中部分低版本支持Feign.builder()结合javax类;
    • Boot3中Feign.builder()适配jakarta类,且默认的FeignClientFactoryBean逻辑优化,更贴合Spring Boot 3的上下文管理。
  2. 第三方HTTP客户端适配
    • Boot2:feign-httpclient适配Apache HttpClient 4.x;
    • Boot3:feign-httpclient适配Apache HttpClient 5.x(也兼容4.x,但推荐5.x)。
  3. 兼容性
    • Boot2的Feign代码直接迁移到Boot3会报错(主要是javaxjakarta、Ribbon配置失效);
    • 需修改依赖、替换javax包为jakarta、删除Ribbon配置。

总结

Spring Boot 3的Feign对比Spring Boot 2的核心区别可总结为3点:

  1. 负载均衡组件:从默认Ribbon彻底切换为Spring Cloud LoadBalancer,无需手动排除/引入,ribbon配置失效;
  2. 规范适配:从Java EE(javax.*)迁移到Jakarta EE(jakarta.*),涉及注解/API的包名变更;
  3. 版本要求:JDK最低17,OpenFeign版本升级到12.x+,依赖适配Spring Cloud 2022.x+。

简单来说,Boot3的Feign更轻量化(移除停更的Ribbon)、更符合最新的Java规范,但升级时需重点处理包名替换和配置项清理。

2025年AI 元年:从炒作到务实,从工具到代理 2025-12-29
通俗的语言讲好Spring AOP 2025-12-29

评论区