去年將 Spring Cloud 升級到了 Finchley 版本:
Spring Cloud 升級最新 Finchley 版本,踩了所有的坑!
這個大版本棧長是踩了非常多的坑啊,幫助了不少小伙伴。
Spring Cloud Greenwich 在 01/23/2019 這天正式發布了:
Spring Cloud Greenwich 正式發布,Hystrix 即將壽終正寢!。
Greenwich發布也快 1 年了,棧長遲遲沒有升級,距離上個大版本升級一年多了,所以棧長最近將 Spring Cloud 升級到了 Greenwich,幾乎沒踩多少坑,但也有坑,這里再記錄分享一下,希望對你有用。
依賴升級
升級前 => 升級后
Spring Cloud Finchley.RELEASE => Spring Cloud Greenwich.SR3
Spring Boot 2.0.2.RELEASE => Spring Boot 2.1.7.RELEASE
為什么不直接升級到 Spring Boot 2.2.x?
Spring Cloud 和 Spring Boot 兼容性請見正文表格:
Spring Cloud Train | Spring Boot Version |
---|---|
Hoxton | 2.2.x |
Greenwich | 2.1.x |
Finchley | 2.0.x |
Edgware | 1.5.x |
Dalston | 1.5.x |
如果用超出版本的,兼容性會有問題。
分不清這些版本的區別和意義?可以參考棧長之前寫的關於版本的文章:
Spring Cloud 多版本怎么選擇?。
有興趣的可以關注棧長的微信公眾號:Java技術棧,Spring Boot、Spring Cloud 干貨教程及時推送。
Feign踩坑
升級后,應用啟動正常,但調用 Feign 服務的時候報了個這個異常:
The bean 'SERVICE-XXX.FeignClientSpecification', defined in null, could not be registered. A bean with that name has already been defined in null and overriding is disabled.
同時日志中也給出了解決文案:
Action:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
沒錯,就是在配置文件中配置上這個參數:
spring.main.allow-bean-definition-overriding=true
原因就是使用 @FeignClient
的時候定義了多個相同 name
的接口。
@FeignClient(name = "xxx", configuration = XXXConfig.class, fallbackFactory =
XXXServiceFallback.class)
public interface XXXService extends IXXXService {
}
那為什么升級之后是好好的呢?
那是因為在 Spring Boot 2.1.0 之后把默認值改成了false。
而在 Spring Boot 2.1.0 之前這個值都是 true,也沒有這個參數可以修改這個配置。
那這個參數到底有什么用?
正常情況下,Spring容器里面只可能有一個唯一名字的 Bean 的,如果名字相同的情況下,就要看這個參數決定了,即是否允許 Bean 覆蓋,不允許情況下會拋出異常,如果允許,則誰覆蓋誰要看 Spring 容器 Bean 的初始化的順序了。
所以,配置這個參數為 true 后,多個 @FeignClient
注解相同名字的 Bean 的 configuration
參數就會被覆蓋了。
如果項目中有多個 configuration
,那會受影響,我們沒有多個這樣的配置,所以暫且先配置這個參數解決問題。解決之后,就能正常使用 Feign 了,正常訪問微服務。
這難道是 Feign 的坑嗎?不可能把所有東西都寫在一個接口服務里面啊!暫時也沒找到好的辦法,后續再研究下吧。
未完,棧長將陸續分享 Spring Cloud 最新技術教程,現在已經寫了一堆存貨了,關注微信公眾號 "Java技術棧" ,公眾號第一時間推送!
@ All 碼農們:你們升級了嗎?有遇到什么樣的坑?歡迎留言!