SpringCloud Hystrix

SpringCloud Hystrix

針對之前的章節描述過服務註冊、負載策略,那是否會存在一些特殊場景需要處理? 針對系統微服務高負載如何快速處理呢?

思考如下問題

  1. 如果服務提供者響應非常緩慢,那麼消費者對提供者的請求就會被強制等待,直到處理處理完返回,高負載情況下會造成所有處理用戶請求的線程都會被耗竭
  2. 如果服務消費者可以是其它服務的提供者,這樣會造成其它服務消費者接着耗竭,造成雪崩效應

解決方案思路如下

  • 設置超時機制
  • 斷路器模式

超時詳細分析:
優勢:如服務A調用B默認是20S超時,那我們根據場景設定一個合理值,如4S,可能盡力避免資源耗竭。
缺點:當依賴服務有大量超時,再讓新的請求去訪問從本質上來看沒有多少意義,只會無畏消耗現有資源,我們應該使用斷路器避免浪費資源

斷路器模式
優勢:可以實現快速失敗,如果它在一段時間內偵測到錯誤(如:超時),就會強迫其以後的多個調用快速失敗,不再請求所依賴的服務,防止資源消耗;
同樣路由器也可以使應用程序能夠診斷錯誤是否已修正,如果正常;會再次嘗試調用

斷路器模式需要做哪些事情呢?

  1. 首先肯定要監控,比如調用哪些服務,共計多少次?多少次失敗? 如超過20%,斷路器打開狀態
  2. 斷路器狀態(打開、關閉、半開)
  3. 分流,半開狀態,一小部分流量嘗試請求
  4. 斷路器狀態切換

下面講解 Hystrix 實現斷路器模式

熔斷

如圖,瀏覽器發送一個請求到API,請求微服務B,此處微服務B出現異常,開發人員可以在微服務B基礎上提供一個Fallback機制,API直接請求Fallback,此時不再請求服務B

Hystrix Demo

@SpringBootAppliction
@EnableCircuitBreaker
public class CircuitBreakerApplication{
	public static void main(String[] args){
		SpringApplication.run(CircuitBreakerApplication.class,args);
	}
}



@RestController
public class CircuitBreakerDemoController {


    @Autowired
    private FeginClient feginClient;

    @RequestMapping(value = "/getUser",method = RequestMethod.GET)
    @HystrixCommand(fallbackMethod="getUserFallback")
    public String showInfo(@RequestParam String name){
        return feginClient.userInfo(name);
     }
	public getUserFallback(String name){
	    return "";
		}
    }

針對以上代碼,什麼時候進入getUserFallback()方法呢?
配置 hystrix.command.default.execution.isolation.trhead.timeoutInMilliseconds:5000
調用服務方法showInfo(),5秒鐘未響應,此時認爲服務存在異常,會調用getUserFallback()方法

總結:
Hystrix 實現斷路器模式,可以控制服務的統計、限流;保證資源合理化利用

作者簡介:張程 技術研究

更多文章請關注微信公衆號:zachary分解獅 (frankly0423)
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章