十八、springcloud(四)熔斷器
1、熔斷器(Hystrix)
a.斷路器機制
斷路器很好理解, 當Hystrix Command請求後端服務失敗數量超過一定比例(預設50%), 斷路器會切換到開路狀態(Open). 這時所有請求會直接失敗而不會發送到後端服務. 斷路器保持在開路狀態一段時間後(預設5秒), 自動切換到半開路狀態(HALF-OPEN). 這時會判斷下一次請求的返回情況, 如果請求成功, 斷路器切回閉路狀態(CLOSED), 否則重新切換到開路狀態(OPEN). Hystrix的斷路器就像我們家庭電路中的保險絲, 一旦後端服務不可用, 斷路器會直接切斷請求鏈, 避免傳送大量無效請求影響系統吞吐量, 並且斷路器有自我檢測並恢復的能力.
b.Fallback
Fallback相當於是降級操作. 對於查詢操作, 我們可以實現一個fallback方法, 當請求後端服務出現異常的時候, 可以使用fallback方法返回的值. fallback方法的返回值一般是設定的預設值或者來自快取.
c.資源隔離
在Hystrix中, 主要通過執行緒池來實現資源隔離. 通常在使用的時候我們會根據呼叫的遠端服務劃分出多個執行緒池. 例如呼叫產品服務的Command放入A執行緒池, 呼叫賬戶服務的Command放入B執行緒池. 這樣做的主要優點是執行環境被隔離開了. 這樣就算呼叫服務的程式碼存在bug或者由於其他原因導致自己所線上程池被耗盡時, 不會對系統的其他服務造成影響. 但是帶來的代價就是維護多個執行緒池會對系統帶來額外的效能開銷. 如果是對效能有嚴格要求而且確信自己呼叫服務的客戶端程式碼不會出問題的話, 可以使用Hystrix的訊號模式(Semaphores)來隔離資源.
2、修改上一篇spring-cloud-houge-consumer
a、application.properites
#開啟熔斷器 feign.hystrix.enabled=true
b、建立回撥類
@Component public class DynastyServiceHystrix implements DynastyService{ @Override public String hello(@RequestParam(value="name")String name) { return"hello," +name+", method invoke failed "; } }
c、新增fallback屬性
@FeignClient(name= "spring-cloud-provider",fallback=DynastyServiceHystrix.class) //name:遠端服務名,及spring.application.name配置的名稱 public interface DynastyService { @RequestMapping(value="/dynasty/hello") public String hello(@RequestParam(value = "name")String name); }
3、測試
啟動spring-cloud-houge-eureka,spring-cloud-houge-consuer,不啟動spring-cloud-houge-provider
http://localhost:8000/
http://localhost:9001/dynasty/hello?name=monkey
根據返回結果說明熔斷成功