Spring Cloud 升級最新 Greenwich 版本,舒服了~

去年將 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踩坑

升級後,應用啓動正常,但調用 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 碼農們:大家升級了嗎?有遇到什麼樣的坑?歡迎留言!

相關文章
相關標籤/搜索