最近項目重構使用了Spring Boot和Spring Cloud。這兩者結合確實給項目帶來了方便,同時也遇到了一些問題。其中使用feign作為服務消費,但是斷路器hystrix一直不起作用讓人很費解。最終經過重重查找終於找到原因,以及解決方法。
問題產生原因
首先,使用spring-cloud搭建微服務的過程大部分是根據網上的教程來的,由於網上教程的時間較早,而spring-cloud更新迭代較快,會造成依賴上的一些問題。教程中的spring-cloud的依賴是
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Brixton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
而我自己使用idea搭建項目使用的是較新的依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
發現兩者的區別了嗎?對!就是依賴版本不同。教程中的版本是 Brixton.RELEASE
而我使用的版本是Dalston.RELEASE
。
探究過程
根據這個關系順藤摸瓜找到了Netflix的依賴版本
接着,去了官網找到對應的版本,查看文檔和API
在文檔中會看到
這個意思就說feign默認是啟用hystrix的,如果要禁用的話需要加配置語句。但是種種跡象表明,feign中並沒有有啟用hystrix,看到這里當時我就很疑惑,但是發現了hystrix在feign中的開關,還是有所收獲的。我抱着試一試的心態照着上面的描述在配置文件中加上了配置,將false
改為了true
,結果神奇般的起了作用!
雖然問題解決了,為什么官方文檔還是有錯誤的?在這里吐槽一句:TMD(挺萌的)~~~。
抱着追根求源的心態,查看了netflix的源碼,看看什么時候修改了默認配置。點擊上圖中的API就可以看到源github上的源碼了。里面這兩段代碼,就是管理默認配置的。
為什么要默認關閉hystrix呢?請看這里:https://github.com/spring-cloud/spring-cloud-netflix/issues/1277
至此,終於知道了產生錯誤的原因,以及為什么要默認關閉hystrix。
解決方案
如果是yml文件,請在文件中加入:
feign:
hystrix:
enabled: true
如果是properties文件,請在文件中加入:
feign.hystrix.enabled=true
重啟服務,大功告成!
本文首發地址:http://www.devzxd.top/2017/05/05/feign-hystrix-problem.html