去年將 Spring Cloud 升級到了 Finchley 版本:
Spring Cloud 升級最新 Finchley 版本,踩了全部的坑!spring
這個大版本棧長是踩了很是多的坑啊,幫助了很多小夥伴。微信
Spring Cloud Greenwich 在 01/23/2019 這天正式發佈了:
Spring Cloud Greenwich 正式發佈,Hystrix 即將壽終正寢!。ide
Greenwich發佈也快 1 年了,棧長遲遲沒有升級,距離上個大版本升級一年多了,因此棧長最近將 Spring Cloud 升級到了 Greenwich,幾乎沒踩多少坑,但也有坑,這裏再記錄分享一下,但願對你有用。微服務
升級前 => 升級後spa
Spring Cloud Finchley.RELEASE => Spring Cloud Greenwich.SR3日誌
Spring Boot 2.0.2.RELEASE => Spring Boot 2.1.7.RELEASEcode
爲何不直接升級到 Spring Boot 2.2.x?blog
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 服務的時候報了個這個異常:
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 碼農們:大家升級了嗎?有遇到什麼樣的坑?歡迎留言!