前言
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 |
升级后,其中的Feign
和Hystrix
包名完全更改,可以看出Feign
的1.x使用的是Netflix开发的包,而2.x使用的是OpenFeign包。
在SpringCloud中使用Feign的区别
Netflix版本Feign提供的spring扫描器与OpenFeign版本的不一样,因此会出现以下情况。
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的唯一标识。
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覆盖。