天天看點

springcloud學習總結-HystrixHystrix

目錄

Hystrix

hystrix是什麼?

解決方案

降級,逾時

具體操作

熔斷,限流

熔斷

限流

feign整合hystrix

加上配置之後降級方法怎麼寫呢?

Hystrix

hystrix是什麼?

Hystrix是一個用于處理分布式系統的延遲和容錯的開源庫,在分布式系統裡,許多依賴不可避免的會調用失敗,比如逾時、異常等,Hystrix能夠保證在一個依賴出問題的情況下,不會導緻整體服務失敗,避免級聯故障,以提高分布式系統的彈性。
“斷路器”本身是一種開關裝置,當某個服務單元發生故障之後,通過斷路器的故障監控(類似熔斷保險絲),向調用方傳回一個符合預期的、可處理的備選響應(FallBack),而不是長時間的等待或者抛出調用方無法處理的異常,這樣就保證了服務調用方的線程不會被長時間、不必要地占用,進而避免了故障在分布式系統中的蔓延,乃至雪崩。

解決方案

  • 服務限流
  • 逾時監控
  • 服務熔斷
  • 服務降級

降級,逾時

我們先來解釋一下降級,降級是當我們的某個微服務響應時間過長,或者不可用了,講白了也就是那個微服務調用不了了,我們不能把錯誤資訊傳回出來,或者讓他一直卡在那裡,是以要在準備一個對應的政策(一個方法)當發生這種問題的時候我們直接調用這個方法來快速傳回這個請求,不讓他一直卡在那 。

具體操作

  • 先把hystrix的依賴加入
  • 啟動類加入注解@EnableHystrix
  • 然後在controller上面加入注解@HystrixCommand(fallbackMethod就是方法的名字)
@RequestMapping("/feignPower.do")
@HystrixCommand(fallbackMethod = "fallbackMethod")
public Object feignPower(String name){
    return powerServiceClient.power();
}
public Object fallbackMethod(String name){
    System.out.println(name);
    return R.error("降級資訊");
}
           
hystrix他有預設的逾時監聽,當你這個請求預設超過了1秒鐘就會逾時,也可以修改預設配置

熔斷,限流

熔斷

就好像我們生活中的跳閘一樣, 比如說你的電路出故障了,為了防止出現大型事故 這裡直接切斷了你的電源以免意外繼續發生, 把這個概念放在我們程式上也是如此, 當一個微服務調用多次出現問題時(預設是10秒内20次當然 這個也能配置),hystrix就會采取熔斷機制,不再繼續調用你的方法(會在預設5秒鐘内和電器短路一樣,5秒鐘後會試探性的先關閉熔斷機制,但是如果這時候再失敗一次{之前是20次} 那麼又會重新進行熔斷) 而是直接調用降級方法,這樣就一定程度上避免了服務雪崩的問題

限流

就是限制你某個微服務的使用量(可用線程),hystrix通過線程池的方式來管理你的微服務調用,他預設是一個線程池(10大小) 管理你的所有微服務,你可以給某個微服務開辟新的線程池:
具體操作
@RequestMapping("/feignOrder.do")
@HystrixCommand(fallbackMethod = "fallbackOrderMethod"  ,
        threadPoolKey = "order",
        threadPoolProperties ={@HystrixProperty(name = "coreSize",value = "2")
                              ,@HystrixProperty(name = "maxQueueSize",value = "1"})
public Object feignOrder(String name){
    System.out.println(1);
    return restTemplate.getForObject(ORDERURL+"/order.do",Object.class);
}
           
threadPoolKey 就是線上程池唯一辨別, hystrix 會拿你這個辨別去計數,看線程占用是否超過了, 超過了就會直接降級該次調用
比如, 這裡coreSize給他值為2 那麼假設你這個方法調用時間是3s執行完, 那麼在3s内如果有超過2個請求進來的話, 剩下的請求則全部降級

feign整合hystrix

feign 預設是支援hystrix的, 但是在Spring - cloud Dalston 版本之後就預設關閉了, 因為不一定業務需求要用的到,是以現在要使用首先得打開他,在yml檔案加上如下配置:

feign:

  hystrix:

enabled: true

加上配置之後降級方法怎麼寫呢?

@FeignClient(value = "SERVER-POWER",fallback = PowerServiceFallBack.class)
public interface PowerServiceClient {
    @RequestMapping("/power.do")
    public Object power(@RequestParam("name") String name);
}
           

繼續閱讀