亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

首頁 慕課教程 Spring Cloud Hystrix Spring Cloud Hystrix Hystrix 企業級應用避坑指南

Hystrix 企業級應用避坑指南

1. 前言

各位同學,學到這里呢,已經是 Hystrix 本套課程的最后一篇了,在本節中,我將結合我在工作中經常遇到的問題,以及在使用 Hystrix 時經常出現的問題,為大家做一個簡單的避坑指南,各位同學通過學習本節內容,在實際工作中可能會少走一些彎路。

本節主要內容:

  • Hystrix 常見坑介紹與解決方法;

  • Hystrix 企業級應用使用技巧。

2. Hystrix 常見坑介紹與解決方法

2.1 關于參數配置的坑

我們在 Spring Cloud 中使用 Hystrix 時,一般會通過 HystrixCommand 注解去配置我們的 Hystrix 的各個配置參數,這個坑就出現在我們對線程池隔離所配置時,由于我們把線程池隔離的屬性的值都設置為了 1 ,導致配置有時候不會生效,詳見下方代碼:

threadPoolProperties = {
        @HystrixProperty(name = "coreSize", value = "1"),
        @HystrixProperty(name = "maxQueueSize", value = "1"),
        @HystrixProperty(name = "queueSizeRejectionThreshold", value = "1")
}

如果像上述代碼段中那樣進行配置,那么 threadPoolProperties 就不會生效,所以,各位同學在編碼的時候,可以適當把上述參數的值設置的大一些,比如將上述參數的值都擴大 10 倍:

threadPoolProperties = {
        @HystrixProperty(name = "coreSize", value = "10"),
        @HystrixProperty(name = "maxQueueSize", value = "10"),
        @HystrixProperty(name = "queueSizeRejectionThreshold", value = "10")
}

設置成這樣的話,無論怎么測試,threadPoolProterties 都是生效的。

2.2 關于回調方法的坑

當我們在項目中需要使用 Hystrix 的服務容錯或降級時,我們需要配置 fallbackMethod 屬性,將該屬性的值聲明為我們的備用方法。這個坑就出現在我們的原方法與備用方法中間,如果我們的原方法中的參數類型和參數個數與備用方法中的不同,那么當發生服務容錯或降級時,就會報下述異常:

 fallback method wasn't found

我們來看一下正確的配置原方法與備用方法的代碼:

@RequestMapping("temp.do")
@ResponseBody
@HystrixCommand(fallbackMethod = "temp_failed")
public CommonResponse<String> temp(String msg, int code){
    return tempService.temp(msg, code);
}
    
public CommonResponse<String> temp_failed(String msg, int code){
    return  CommonResponse.errorResponse("服務拒絕處理,請聯系系統管理員");
}

通過上述代碼段,我們可以看到,temp 方法與 temp_failed 方法的參數類型與參數個數是相同的,這樣我們的服務容錯與降級才能配置生效。

2.3 關于 Hystrix 調用無效的坑

當我們在項目間互相調用服務時,有時候會出現請求無法執行或請求沒有響應的情況,這個坑是由于 Hystrix 的超時時間引起的,如果我們沒有給 Hystrix 配置一個超時時間,那么 Hystrix 默認的超時時間會很短,很容易會造成服務間互相調用失敗。

針對于這種情況,我們只需要手動的去配置 Hystrix 的超時時間,如下代碼所示:

hystrix:
  threadpool:
    default:
      coreSize: 200 
      maxQueueSize: 200 
      queueSizeRejectionThreshold: 50 
      execution:
        timeout:
          enabled: true
        isolation:
          strategy: THREAD
          semaphore:
            maxConcurrentRequests: 1000
          thread:
            timeoutInMilliseconds: 30000
  command:
    default:
      execution:
        timeout:
          enabled: true
        isolation:
          thread:
            timeoutInMilliseconds: 5000

各位同學只需要知道各種請求超時參數如何進行配置就行了。

3. Hystrix 企業級應用使用技巧

3.1 關于微服務監控平臺

技巧 1

如果我們的微服務監控平臺沒有任何數據,或者說,在打開微服務平臺之后,各參數一直處于 loading 狀態,這個時候,我們只需要在服務端調用任意一個服務接口即可,這樣在微服務監控平臺,我們就能看到被監控實例的參數了。

技巧 2

如果我們在訪問 /actuator/hystrix.stream 路徑時,系統找不到對應的路徑,即報 404 異常,那么我們需要在對應項目的啟動類中添加一個 Bean :

@Bean
public ServletRegistrationBean hystrixMetricsStreamServlet() {
    ServletRegistrationBean registration = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
    registration.addUrlMappings("/hystrix.stream");
    return registration;
}

這樣我們就能正常訪問 /actuator/hystrix.stream 下的路徑了。

3.2 關于 Hystrix 高可用

在真實項目中,我們的微服務項目往往都是由 2 個及以上的服務模塊所構成,這樣一來,如果我們的服務只有一個 Hystrix 節點,那么在洪峰到來時,很有可能我們的這一個 Hystrix 節點會掛掉,所以我們需要在項目中對 Hystrix 配置一個最少 2 個節點的高可用集群。

這里由于篇幅限制,我說一下實現的思路:

我們保證默認的一個 Hystrix 節點不動,然后在另一個服務中引入 Hystrix 的依賴,即將 Hystrix 引入到另一個服務中,然后我們需要將兩個 Hystrix 服務全部注冊到 Eureka 上,在注冊到 Eureka 上后,我們需要配置默認的 Hystrix 節點與另一個 Hystrix 節點間的相互引用,即配置兩個服務間的相互引用。

在相互引用配置完畢后,我們需要在具體使用 Hystrix 的接口中添加 Hystrix 的注解配置項,這樣,我們就實現了一個具有 2 個節點的 Hystrix 高可用集群。

4. 小結

本節內容概覽

本小節為大家介紹了,Hystrix 這款微服務治理中間件在企業級應用時,經常遇到的一些坑,包括 Hystrix 參數配置、回調方法等常見問題,并針對這些問題都給出了相應的解決方案。在介紹常見問題的同時,結合我的實際工作經歷,給大家介紹了 Hystrix 的微服務監控平臺,已經高可用實現方案,希望各位同學能夠運用到真實項目中去。

本套課程就到這里了,希望同學們學的開心,碼的快樂。最后,感謝各位同學的支持與關注,江湖路遠,我們有緣再會!