關(guān)于springcloud中Feign和ribbon設(shè)置超時時間和重試機(jī)制的記錄
一、 Feign設(shè)置超時時間
使用Feign調(diào)用接口分兩層,ribbon的調(diào)用和hystrix的調(diào)用,所以ribbon的超時時間和Hystrix的超時時間的結(jié)合就是Feign的超時時間
#hystrix的超時時間hystrix:command:default:execution:timeout:enabled: trueisolation:thread:timeoutInMilliseconds: 9000#ribbon的超時時間ribbon:ReadTimeout: 3000ConnectTimeout: 3000
一般情況下,都是 ribbon 的超時時間(<)hystrix的超時時間(因?yàn)樯婕暗絩ibbon的重試機(jī)制)。因?yàn)閞ibbon的重試機(jī)制和Feign的重試機(jī)制有沖突,所以源碼中默認(rèn)關(guān)閉Feign的重試機(jī)制,源碼如下:

要開啟Feign的重試機(jī)制如下:(Feign默認(rèn)重試五次 源碼中有)
Retryer feignRetryer() {return new Retryer.Default();}
??二、ribbon的重試機(jī)制
設(shè)置重試次數(shù):
ribbon:ReadTimeout: 3000ConnectTimeout: 3000MaxAutoRetries: 1 #同一臺實(shí)例最大重試次數(shù),不包括首次調(diào)用MaxAutoRetriesNextServer: 1 #重試負(fù)載均衡其他的實(shí)例最大重試次數(shù),不包括首次調(diào)用OkToRetryOnAllOperations: false #是否所有操作都重試
根據(jù)上面的參數(shù)計(jì)算重試的次數(shù):MaxAutoRetries+MaxAutoRetriesNextServer+(MaxAutoRetries *MaxAutoRetriesNextServer) 即重試3次 則一共產(chǎn)生4次調(diào)用
如果在重試期間,時間超過了hystrix的超時時間,便會立即執(zhí)行熔斷,fallback。所以要根據(jù)上面配置的參數(shù)計(jì)算hystrix的超時時間,使得在重試期間不能達(dá)到hystrix的超時時間,不然重試機(jī)制就會沒有意義。
hystrix超時時間的計(jì)算:(1 + MaxAutoRetries + MaxAutoRetriesNextServer) * ReadTimeout 即按照以上的配置 hystrix的超時時間應(yīng)該配置為(1+1+1)*3=9秒。
當(dāng)ribbon超時后且hystrix沒有超時,便會采取重試機(jī)制。當(dāng)OkToRetryOnAllOperations設(shè)置為false時,只會對get請求進(jìn)行重試。如果設(shè)置為true,便會對所有的請求進(jìn)行重試,如果是put或post等寫操作,如果服務(wù)器接口沒做冪等性,會產(chǎn)生不好的結(jié)果,所以O(shè)kToRetryOnAllOperations慎用。
如果不配置ribbon的重試次數(shù),默認(rèn)會重試一次。
注意:
默認(rèn)情況下,GET方式請求無論是連接異常還是讀取異常,都會進(jìn)行重試。
非GET方式請求,只有連接異常時,才會進(jìn)行重試。
社區(qū)鏈接:http://docs.springcloud.cn/user-guide/ribbon/
CSDN鏈接:https://blog.csdn.net/east123321/article/details/82385816
