0%

SpringBoot2升级坑-Feign

前言

SpringBoot1.x升级到SpringBoot2.x;SpringCloud从Camden升级到Hoxton后出现的不兼容问题。

版本

升级前名字 升级前版本号 升级后名字 升级后版本号
org.springframework 4.x org.springframework 5.2.2.RELEASE
org.springframework.boot 1.4.x org.springframework.boot 2.2.2.RELEASE
spring-cloud Camden.RELEASE (1.x) spring-cloud Hoxton.RELEASE (2.2.0)
spring-cloud-starter-feign 1.2.7.RELEASE spring-cloud-starter-openfeign 2.2.0.RELEASE
spring-cloud-starter-hystrix 1.2.7.RELEASE spring-cloud-starter-netflix-hystrix 2.2.0.RELEASE

升级后,其中的FeignHystrix包名完全更改,可以看出Feign的1.x使用的是Netflix开发的包,而2.x使用的是OpenFeign包。

在SpringCloud中使用Feign的区别

Netflix版本Feign提供的spring扫描器与OpenFeign版本的不一样,因此会出现以下情况。
  1. Netflix版本(spring-cloud-starter-feign 1.2.7.RELEASE)

    1
    2
    3
    @FeignClient(value=ServiceConfig.SERVICE_NAME,      //客户端名称,负载均衡用,Eureka中充当服务名
    path=ServiceConfig.CONTEXT_PATH //全局路径/前缀,微服务中一般为项目名等(如/login-service)
    )

    value是客户端的名称,但在Eureka中充当的是服务名,Spring扫描Bean时使用的是ClassName,因此使用@FeignClient注解所在类的类名充当bean的唯一标识。

  2. OpenFeign版本(spring-cloud-starter-openfeign 2.2.0.RELEASE)

    1
    2
    3
    4
    @FeignClient(contextId="client_id",          //客户端名称,只区分每个客户端类的bean唯一标识,与服务id不同
    value=ServiceConfig.SERVICE_NAME, //客户端名称,负载均衡用,Eureka中充当服务名
    path=ServiceConfig.CONTEXT_PATH //全局路径/前缀,微服务中一般为项目名等(如/login-service)
    )

    在2.2.0版本中,使用和1.2.7是一样的,但是Spring扫描Bean的时候使用的是name/value,因此在Eureka中同服务的客户端value都是同一个服务名,启动时候会报错:bean重复。

升级后的解决方法(两种方法选择其中一种即可)

  • 在@FeignClient后加入参数contextId="client_id",为客户端的唯一标识,只用于区分bean。
  • 在配置中加入spring.main.allow-bean-definition-overriding=true,允许bean覆盖。