探祕SpringCloud系列《第五篇章:Fegin、Ribbon、Hystrix重試機制、超時時間的詳解-番外篇》

歡迎來到SpringCloud的江湖,在本章中,我們將向大家傳授如何創建SpringCloud的父子項目架構。
知識無止境,故事有好壞,文章純屬虛構,歡迎大家吐槽。
行走江湖,沒點伎倆傍身怎麼能行。本章牽扯到的技術以及工具如下:
Intellij Idea 2018.1
JDK 8
MAVEN 3.2.2
SpringBoot 1.5.13.RELEASE
Spring-Cloud Edgware.SR3
Fegin聲明式調用
Ribbon負載均衡
Hystrix熔斷器

前面我們分別介紹了Fegin服務間調用Ribbon負載均衡Hystrix斷路器。這裏我們說一下超時和重試機制

各組件超時

RestTemplate超時時間控制

/**
 * RestTemplate超時設置
 * 註釋:@LoadBalanced配置啓用Ribbon負載均衡,有無此註解不影響超時配置
 */
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
    SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
    //單位爲ms
    factory.setReadTimeout(5000);
    //單位爲ms
    factory.setConnectTimeout(5000);
    return new RestTemplate(factory);
}

Ribbon的超時配置

  • 全局配置
# 設置ribbon超時時間
# SpringCloud feign 默認開啓ribbon支持
ribbon:
  ### 指的是建立連接所用的時間,適用於網絡狀況正常的情況下,兩端連接所用的時間。
  ReadTimeout: 3000
  ### 指的是建立連接後從服務器讀取到可用資源所用的時間。
  ConnectTimeout: 3000
  • 局部設置
# 設置ribbon客戶端超時時間
# service-id是Ribbon所使用的虛擬主機名,一般和註冊到Eureka Server的服務名一致,即與spring.application.name一致
service-id:
  ribbon:
    ### 指的是建立連接所用的時間,適用於網絡狀況正常的情況下,兩端連接所用的時間。
    ReadTimeout: 3000
    ### 指的是建立連接後從服務器讀取到可用資源所用的時間。
    ConnectTimeout: 3000

Fegin的超時配置

### 設置fegin的超時
feign:
  client:
    config:
      # 如果使用通用配置,攜程default
      feginName:
        connectTimeout: 5000
        readTimeout: 5000 # 單位ms

Hystrix的超時配置

# 配置hystrix超時時間
hystrix:
  command:
    default:
      execution:
        timeout:
          # 默認開啓,如需關閉,將enabled改爲false即可
          enabled: true
        isolation:
          thread:
            timeoutInMilliseconds: 10000

各組件重試機制

Ribbon重試

# 注意Feign和Ribbon不要重複重試,否則會產生笛卡爾積次數
# <client>爲Ribbon Client名稱,表示對指定的Ribbon Client進行重試。省略代表全局配置
<client>:
  ribbon:
    MaxAutoRetries: 1 # 同一臺實例最大重試次數,不包括首次調用
    MaxAutoRetriesNextServer: 2 # 重試負載均衡其他的實例最大重試次數,不包括首次調用
    OkToRetryOnAllOperations: false  # 是否所有操作都重試

基於HTTP請求響應碼進行重試

<clickName>:
  ribbon:
    retryableStatusCodes: 404,502

OpenFegin Click的Retryer重試

/**
 * 開啓Fegin重試機制
 */
@Bean
Retryer feignRetryer() {
    return  new Retryer.Default(1L, 5L, 3);
}
  • Retryer繼承了Cloneable接口,它定義了continueOrPropagate、clone方法;它內置了一個名爲Default以及名爲NEVER_RETRY的實現
  • Default有period、maxPeriod、maxAttempts參數可以設置,默認構造器使用的period爲100,maxPeriod爲1000,maxAttempts爲5;continueOrPropagate方法首先判斷attempt是否達到閾值,達到則拋出異常,否則進一步計算interval,然後進行sleep
  • NEVER_RETRY的continueOrPropagate直接拋出異常,而clone方法直接返回當前實例

注意事項

  • 建議講Hystrix的超時時間設置爲大於多次重試所用時間的和。
  • 一般不建議將ribbon.OkToRetryOnAllOperations設爲true。一旦啓用,post請求時,由於緩存了請求題,此時可能會影響服務器的資源。
  • Ribbon重試不要和Retryer重試同時啓用,會產生笛卡爾積的重試結果。

本章到此結束。後續文章會陸續更新,文檔會同步在CSDN和GitHub保持同步更新。

CSDN:https://blog.csdn.net/qq_34988304/category_8820134.html

Github文檔:https://github.com/hack-feng/Java-Notes/tree/master/src/note/SpringCloud

GitHub源碼:https://github.com/hack-feng/Spring-Cloud-Edgware.git

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