feign和hystrix的超時配置總結(jié) 以及 Hystrix的局部愚隧、全局各自的超時配置

#參考官方配置 https://docs.spring.io/spring-cloud-openfeign/docs/2.2.5.RELEASE/reference/html/
feign:
  client:
    config:
      default:
        connectTimeout: 1000
        readTimeout: 5000
  hystrix:
    enabled: true

#在feign和hystrix共存時,hystrix可以配置自身降級時間锻全,默認1s
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 10000 # 設(shè)置hystrix的超時時間為6000ms
      circuitBreaker:
        #在當10秒的時間內(nèi)狂塘,最近20次調(diào)用請求,請求錯誤率超過60%鳄厌,則觸發(fā)熔斷5秒荞胡,期間快速失敗,以下都是默認值
        requestVolumeThreshold: 20
        errorThresholdPercentage: 50
        sleepWindowInMilliseconds: 5000
      #設(shè)置統(tǒng)計的時間窗口值的毫秒值了嚎,circuit break 的打開會根據(jù)1個rolling window的統(tǒng)計來計算泪漂。
      #若rolling window被設(shè)為10000毫秒廊营,則rolling window會被分成n個buckets,
      #每個bucket包含success萝勤,failure露筒,timeout,rejection的次數(shù)的統(tǒng)計信息敌卓。默認10000慎式。
      metrics:
          rollingStats:
            timeInMilliseconds: 10000

feign

  • ConnectTimeout

    指的是建立連接所用的時間,適用于網(wǎng)絡(luò)狀況正常的情況下趟径,兩端連接所用的時間瘪吏。
    在java中,網(wǎng)絡(luò)狀況正常的情況下蜗巧,例如使用HttpClient或者HttpURLConnetion連接時設(shè)置參數(shù)connectTimeout=5000即5秒肪虎,如果連接用時超過5秒就是拋出java.net.SocketException: connetct time out的異常

  • ReadTimeout

    指的是建立連接后從服務(wù)器讀取到可用資源所用的時間。
    在這里我們可以這樣理解ReadTimeout:正常情況下惧蛹,當我們發(fā)出請求時可以收到請求的結(jié)果扇救,也就是頁面上展示的內(nèi)容,但是當網(wǎng)絡(luò)狀況很差的時候香嗓,就會出現(xiàn)頁面上無法展示出內(nèi)容的情況迅腔。另外當我們使用爬蟲或者其他全自動的程序時,無法判斷當前的網(wǎng)絡(luò)狀況是否良好靠娱,此時就有了ReadTimeout的用武之地了沧烈,通過設(shè)置ReadTimeout參數(shù),例:ReadTimeout=5000像云,超過5秒沒有讀取到內(nèi)容時锌雀,就認為此次讀取不到內(nèi)容并拋出Java.net.SocketException: read time out的異常。

根據(jù)上面關(guān)于ConnectTimeout和ReadTimeout的描述迅诬,在我們使用需要設(shè)置這兩項參數(shù)的服務(wù)或程序時腋逆,應(yīng)該對兩項參數(shù)一起設(shè)置。

一般而言兩項參數(shù)的數(shù)值可以設(shè)置成一樣的侈贷,可以適當把ReadTimeout設(shè)置的長一點惩歉,ConnectTimeout可以相對比較短,這是源于我們的網(wǎng)絡(luò)狀況一般較為穩(wěn)定俏蛮,連接時很少出現(xiàn)問題撑蚌,但是讀取時因為數(shù)據(jù)下載時的網(wǎng)絡(luò)波動,出狀況的可能性更大一些搏屑。

測試争涌,

1. 雙邊連接良好

① 只設(shè)置hystrix(5s),feign的ReadTimeout辣恋、ConnectTimeout均不設(shè)置亮垫,服務(wù)方sleep1/2/3秒解幼,結(jié)果都如下:
調(diào)用方顯示了Read timed out,觸發(fā)了降級包警,并且有進行了重試撵摆,重試了1次,間隔1秒害晦。

############################# 第一次
1635755154447 --port : 7000 --- testHystrixSleep : 3
1635755155207 --port : 7000 --- testHystrixSleep : 3

############################# 第二次

1635755167963 --port : 7000 --- testHystrixSleep : 3
1635755168972 --port : 7000 --- testHystrixSleep : 3
由此可得 feign 的 readTimeout 默認是1s特铝。

② 設(shè)置hystrix(5s),feign的ReadTimeout為2s壹瘟,connectTimeout不設(shè)置:
服務(wù)方sleep 1s鲫剿,正常返回,
服務(wù)方sleep 2s稻轨,降級灵莲,沒有重試。

由此可得殴俱,在連接正常的情況下政冻,有設(shè)置readTimeout且少于請求時間,降級只取決于readTimeout的時間线欲。

③ 設(shè)置hystrix(5s)明场,feign的connectTimeout為1/2s,ReadTimeout不設(shè)置:
服務(wù)方sleep 2s李丰,無論connectTimeout是1s 還是 2s苦锨,均返回正常結(jié)果,沒有重試趴泌。

由此可得舟舒,在連接正常的情況下,readTimeout的默認時間(1s)是不起效的嗜憔,只取決于hystrix的時間秃励。

④ 設(shè)置hystrix(5s),feign的connectTimeout(1s)痹筛,ReadTimeout(2s)
服務(wù)方sleep 2s莺治,直接降級,沒有重試

⑤ 設(shè)置hystrix(3s)帚稠,feign的connectTimeout(1s),ReadTimeout(4s)
服務(wù)方sleep 3s床佳,直接降級滋早,沒有重試
服務(wù)方sleep 2s,正常返回

由此可得砌们,在連接正常的情況下杆麸,hystrix搁进、readTimeout的值取決于最小那個。

2. 停掉了服務(wù)方

①. 只設(shè)置hystrix(10s)昔头,feign的ReadTimeout饼问、ConnectTimeout均不設(shè)置,結(jié)果都如下

2021-11-01 18:12:57.906 DEBUG 20248 --- [trix-provider-1] c.orion.service.TestFeignHystrixService  : [TestFeignHystrixService#providerHystrix] ---> GET http://provider/providerHystrix HTTP/1.1
2021-11-01 18:12:57.906 DEBUG 20248 --- [trix-provider-1] c.orion.service.TestFeignHystrixService  : [TestFeignHystrixService#providerHystrix] ---> END HTTP (0-byte body)
由此可得一下就沒了。

②只設(shè)置hystrix(10s)揭斧,feign的ReadTimeout(4s)莱革、ConnectTimeout(2s)均設(shè)置,ConnectTimeout,結(jié)果都如下

2021-11-01 18:09:37.516 DEBUG 7852 --- [trix-provider-2] c.orion.service.TestFeignHystrixService  : [TestFeignHystrixService#providerHystrix] ---> GET http://provider/providerHystrix HTTP/1.1
2021-11-01 18:09:37.517 DEBUG 7852 --- [trix-provider-2] c.orion.service.TestFeignHystrixService  : [TestFeignHystrixService#providerHystrix] ---> END HTTP (0-byte body)
2021-11-01 18:09:39.537 DEBUG 7852 --- [trix-provider-2] c.orion.service.TestFeignHystrixService  : [TestFeignHystrixService#providerHystrix] <--- ERROR SocketTimeoutException: connect timed out (2018ms)
由此可得還是取決 feign配置 的connectTimeout讹开。

總結(jié):

綜上可得盅视,其實在正常連接情況,都把connectTimeout配置比readTimeout小的旦万,hystrix默認是1秒闹击,而readTimeout也是1秒,但有時業(yè)務(wù)處理是不止1s的成艘,所以最好配置1s以上(不用默認值)赏半,在配置hystrix的同時,也要配置好connectTimeout和readTimeout淆两,而且上述測試可知除破,在readTimeout和hystrix同時在的情況下,誰小就誰決定降級時間琼腔,所以一般就把它們設(shè)置一樣就好了瑰枫。

----------------------------------- 分割線 -----------------------------------------

Hystrix的 局部降級 和 全局降級

首先看下,在上訴的例子里丹莲,得到的降級日志是怎么樣的光坝,我們能得到什么信息,為我們后續(xù)的局部甥材、全局的hystrix的配置提供有效信息盯另。

服務(wù)方會sleep 4s ,而調(diào)用方的配置如下:

feign:
  hystrix:
    enabled: true
  okhttp:
    enabled: true
  client:
    config:
      default:
        connectTimeout: 2000
        readTimeout: 10000

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 3000 # 設(shè)置hystrix的超時時間,默認1s
2021-11-01 18:51:54.933 DEBUG 12268 --- [trix-provider-6] c.orion.service.TestFeignHystrixService  : [TestFeignHystrixService#providerHystrix] ---> GET http://provider/providerHystrix HTTP/1.1
2021-11-01 18:51:54.933 DEBUG 12268 --- [trix-provider-6] c.orion.service.TestFeignHystrixService  : [TestFeignHystrixService#providerHystrix] ---> END HTTP (0-byte body)
2021-11-01 18:51:57.942 DEBUG 12268 --- [trix-provider-6] c.orion.service.TestFeignHystrixService  : [TestFeignHystrixService#providerHystrix] <--- ERROR SocketTimeoutException: Read timed out (3008ms)
2021-11-01 18:51:57.944 DEBUG 12268 --- [trix-provider-6] c.orion.service.TestFeignHystrixService  : [TestFeignHystrixService#providerHystrix] java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    略...
2021-11-01 18:51:57.955 DEBUG 12268 --- [trix-provider-6] c.orion.service.TestFeignHystrixService  : [TestFeignHystrixService#providerHystrix] <--- END ERROR
我們得到了 TestFeignHystrixService#providerHystrix , 這是一個hystrixCommandKey洲赵,而hystrix配置的格式是這樣的:hystrix.command.<HystrixCommandKey>.execution.isolation.thread.timeoutInMilliseconds: 100 鸳惯,默認是default即全局,而如果我們需要自定義某個方法叠萍,即自定義hystrixCommonKey芝发,由日志得出,很顯然HystrixCommandKey就是@feignClient描述的接口類以及調(diào)用方法(帶參數(shù)類型)組成的苛谷。

所以進行以下配置測試:(附帶上了circuitBreaker)

feign:
  hystrix:
    enabled: true
  okhttp:
    enabled: true
  client:
    config:
      default:
        connectTimeout: 2000
        readTimeout: 10000

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 3000 # 設(shè)置hystrix的超時時間,默認1s
      circuitBreaker:
        #在當10秒的時間內(nèi)辅鲸,最近20次調(diào)用請求,請求錯誤率超過60%腹殿,則觸發(fā)熔斷5秒独悴,期間快速失敗例书,以下都是默認值
        requestVolumeThreshold: 20
        errorThresholdPercentage: 50
        sleepWindowInMilliseconds: 5000
      #設(shè)置統(tǒng)計的時間窗口值的毫秒值,circuit break 的打開會根據(jù)1個rolling window的統(tǒng)計來計算刻炒。
      #若rolling window被設(shè)為10000毫秒决采,則rolling window會被分成n個buckets,
      #每個bucket包含success坟奥,failure树瞭,timeout,rejection的次數(shù)的統(tǒng)計信息筏勒。默認10000移迫。
      metrics:
        rollingStats:
          timeInMilliseconds: 10000
    TestFeignHystrixService#providerPartHystrix(Integer):
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 5000 # 設(shè)置hystrix的超時時間,默認1s
      circuitBreaker:
        #在當10秒的時間內(nèi),最近20次調(diào)用請求管行,請求錯誤率超過60%厨埋,則觸發(fā)熔斷5秒,期間快速失敗捐顷,以下都是默認值
        requestVolumeThreshold: 20
        errorThresholdPercentage: 50
        sleepWindowInMilliseconds: 5000
      #設(shè)置統(tǒng)計的時間窗口值的毫秒值荡陷,circuit break 的打開會根據(jù)1個rolling window的統(tǒng)計來計算。
      #若rolling window被設(shè)為10000毫秒迅涮,則rolling window會被分成n個buckets废赞,
      #每個bucket包含success,failure叮姑,timeout唉地,rejection的次數(shù)的統(tǒng)計信息。默認10000传透。
      metrics:
        rollingStats:
          timeInMilliseconds: 10000

提供了一個providerPartHystrix(Integer a) 方法:

@Service
@FeignClient(value = "provider", fallback = TestFeignHystrixServiceFallback.class)
public interface TestFeignHystrixService {

    @GetMapping("/providerHystrix") //hystrix降級配置3秒 ,服務(wù)方sleep 4秒
    Result providerHystrix();

    @GetMapping("/providerPartHystrix")   //hystrix降級配置5秒 ,服務(wù)方sleep 4秒
    Result providerPartHystrix(@RequestParam("a") Integer a);
}

在進行請求后耘沼,http://127.0.0.1:8000/hystrix/providerPartHystrix,正常返回結(jié)果:

{"msg":"Success","code":1000,"data":"port : 7000 --- testPartHystrixSleep : 4 -- a : 1"}

參考:
Feign如何實現(xiàn)局部配置優(yōu)先于全局默認配置

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末朱盐,一起剝皮案震驚了整個濱河市群嗤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌兵琳,老刑警劉巖狂秘,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異躯肌,居然都是意外死亡者春,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門羡榴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碧查,“玉大人,你說我怎么就攤上這事校仑≈沂郏” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵迄沫,是天一觀的道長稻扬。 經(jīng)常有香客問我,道長羊瘩,這世上最難降的妖魔是什么泰佳? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮尘吗,結(jié)果婚禮上逝她,老公的妹妹穿的比我還像新娘。我一直安慰自己睬捶,他們只是感情好黔宛,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著擒贸,像睡著了一般臀晃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上介劫,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天徽惋,我揣著相機與錄音,去河邊找鬼座韵。 笑死险绘,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的誉碴。 我是一名探鬼主播宦棺,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼析苫,長吁一口氣:“原來是場噩夢啊……” “哼鸯匹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起漂羊,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤蹬屹,失蹤者是張志新(化名)和其女友劉穎侣背,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慨默,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡贩耐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了厦取。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片潮太。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铡买,到底是詐尸還是另有隱情更鲁,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布奇钞,位于F島的核電站澡为,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏景埃。R本人自食惡果不足惜媒至,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谷徙。 院中可真熱鬧拒啰,春花似錦、人聲如沸完慧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骗随。三九已至蛤织,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸿染,已是汗流浹背指蚜。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留涨椒,地道東北人摊鸡。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像蚕冬,于是被迫代替她去往敵國和親免猾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容