13161216443

您所在位置: 首頁> 學習課程> java培訓 | Spring Cloud 升級最新 Greenwich 版本,哪個好?

java培訓 | Spring Cloud 升級最新 Greenwich 版本,哪個好?

發布百知教育 來源:學習課程 2019-11-14

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 兼容性請見正文表格:

java培訓


如果用超出版本的,兼容性會有問題。

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。

java培訓班


而在 Spring Boot 2.1.0 之前這個值都是 true,也沒有這個參數可以修改這個配置。


java培訓班



那這個參數到底有什么用?

正常情況下,Spring容器里面只可能有一個唯一名字的 Bean 的,如果名字相同的情況下,就要看這個參數決定了,即是否允許 Bean 覆蓋,不允許情況下會拋出異常,如果允許,則誰覆蓋誰要看 Spring 容器 Bean 的初始化的順序了。

所以,配置這個參數為 true 后,多個 @FeignClient 注解相同名字的 Bean 的 configuration參數就會被覆蓋了。

如果項目中有多個 configuration,那會受影響,我們沒有多個這樣的配置,所以暫且先配置這個參數解決問題。解決之后,就能正常使用 Feign 了,正常訪問微服務。

這難道是 Feign 的坑嗎?不可能把所有東西都寫在一個接口服務里面??!暫時也沒找到好的辦法,后續再研究下吧。


java培訓班:http://www.akpsimsu.com/java2019


注釋:本文內容來自公眾號java技術棧

上一篇:java培訓 | JavaScript測試教程,用 Jest 進行單元測試

下一篇:應屆生去公司找個Java程序員的職位需要什么技能?

相關推薦

www.akpsimsu.com

有位老師想和您聊一聊

關閉

立即申請