springcloud-Hystrix

做者:純潔的微笑
出處:http://www.ityouknow.com/ 
版權歸做者全部,轉載請註明出處html

 

 

今天咱們和浙商銀行在測試環境聯調測試的時候,對方說調不了,由於國家一帶一路峯會給影響了,讓我很尷尬,一帶一路都影響到了咱們,並且是測試環境呀,真是和國家政策息息相關呀,或者算是蝴蝶效應?java

提及springcloud熔斷讓我想起了去年股市中的熔斷,屢次痛的領悟,隨意實施的熔斷對整個系統的影響是災難性的,好了接下來咱們仍是說正事。git

熔斷器

雪崩效應

在微服務架構中一般會有多個服務層調用,基礎服務的故障可能會致使級聯故障,進而形成整個系統不可用的狀況,這種現象被稱爲服務雪崩效應。服務雪崩效應是一種因「服務提供者」的不可用致使「服務消費者」的不可用,並將不可用逐漸放大的過程。github

若是下圖所示:A做爲服務提供者,B爲A的服務消費者,C和D是B的服務消費者。A不可用引發了B的不可用,並將不可用像滾雪球同樣放大到C和D時,雪崩效應就造成了。spring

熔斷器(CircuitBreaker)

熔斷器的原理很簡單,如同電力過載保護器。它能夠實現快速失敗,若是它在一段時間內偵測到許多相似的錯誤,會強迫其之後的多個調用快速失敗,再也不訪問遠程服務器,從而防止應用程序不斷地嘗試執行可能會失敗的操做,使得應用程序繼續執行而不用等待修正錯誤,或者浪費CPU時間去等到長時間的超時產生。熔斷器也可使應用程序可以診斷錯誤是否已經修正,若是已經修正,應用程序會再次嘗試調用操做。後端

熔斷器模式就像是那些容易致使錯誤的操做的一種代理。這種代理可以記錄最近調用發生錯誤的次數,而後決定使用容許操做繼續,或者當即返回錯誤。 熔斷器開關相互轉換的邏輯以下圖:瀏覽器

熔斷器就是保護服務高可用的最後一道防線。緩存

Hystrix特性

1.斷路器機制服務器

斷路器很好理解, 當Hystrix Command請求後端服務失敗數量超過必定比例(默認50%), 斷路器會切換到開路狀態(Open). 這時全部請求會直接失敗而不會發送到後端服務. 斷路器保持在開路狀態一段時間後(默認5秒), 自動切換到半開路狀態(HALF-OPEN). 這時會判斷下一次請求的返回狀況, 若是請求成功, 斷路器切回閉路狀態(CLOSED), 不然從新切換到開路狀態(OPEN). Hystrix的斷路器就像咱們家庭電路中的保險絲, 一旦後端服務不可用, 斷路器會直接切斷請求鏈, 避免發送大量無效請求影響系統吞吐量, 而且斷路器有自我檢測並恢復的能力.架構

2.Fallback

Fallback至關因而降級操做. 對於查詢操做, 咱們能夠實現一個fallback方法, 當請求後端服務出現異常的時候, 可使用fallback方法返回的值. fallback方法的返回值通常是設置的默認值或者來自緩存.

3.資源隔離

在Hystrix中, 主要經過線程池來實現資源隔離. 一般在使用的時候咱們會根據調用的遠程服務劃分出多個線程池. 例如調用產品服務的Command放入A線程池, 調用帳戶服務的Command放入B線程池. 這樣作的主要優勢是運行環境被隔離開了. 這樣就算調用服務的代碼存在bug或者因爲其餘緣由致使本身所在線程池被耗盡時, 不會對系統的其餘服務形成影響. 可是帶來的代價就是維護多個線程池會對系統帶來額外的性能開銷. 若是是對性能有嚴格要求並且確信本身調用服務的客戶端代碼不會出問題的話, 可使用Hystrix的信號模式(Semaphores)來隔離資源.

Feign Hystrix

由於熔斷只是做用在服務調用這一端,所以咱們根據上一篇的示例代碼只須要改動spring-cloud-consumer項目相關代碼就能夠。由於,Feign中已經依賴了Hystrix因此在maven配置上不用作任何改動。

一、配置文件

application.properties添加這一條:

feign.hystrix.enabled=true 

二、建立回調類

建立HelloRemoteHystrix類繼承與HelloRemote實現回調的方法

@Component public class HelloRemoteHystrix implements HelloRemote{ @Override public String hello(@RequestParam(value = "name") String name) { return "hello" +name+", this messge send failed "; } } 

三、添加fallback屬性

HelloRemote類添加指定fallback類,在服務熔斷的時候返回fallback類中的內容。

@FeignClient(name= "spring-cloud-producer",fallback = HelloRemoteHystrix.class) public interface HelloRemote { @RequestMapping(value = "/hello") public String hello(@RequestParam(value = "name") String name); } 

改動點就這點,很簡單吧。

四、測試

那咱們就來測試一下看看效果吧。

依次啓動spring-cloud-eureka、spring-cloud-producer、spring-cloud-consumer三個項目。

瀏覽器中輸入:http://localhost:9001/hello/neo

返回:hello neo,this is first messge

說明加入熔斷相關信息後,不影響正常的訪問。接下來咱們手動中止spring-cloud-producer項目再次測試:

瀏覽器中輸入:http://localhost:9001/hello/neo

返回:hello neo, this messge send failed

根據返回結果說明熔斷成功。

示例代碼

參考:

使用Spring Cloud與Docker實戰微服務

微服務框架Spring Cloud介紹 Part5: 在微服務系統中使用Hystrix, Hystrix Dashboard與Turbine

本站公眾號
   歡迎關注本站公眾號,獲取更多信息