feign-service-provider.ribbon.OkToRetryOnAllOperations=true
feign-service-provider.ribbon.ConnectTimeout=1000
feign-service-provider.ribbon.ReadTimeout=2000
feign-service-provider.ribbon.MaxAutoRetries=2
feign-service-provider.ribbon.MaxAutoRetriesNextServer=2
以上參數(shù)設(shè)置了對(duì)feign-service-provider這個(gè)微服務(wù)的超時(shí)重試策略煤率,我們從上往下看極值函數(shù)的給定參數(shù)故慈。
- OkToRetryOnAllOperations:這個(gè)參數(shù)指定了什么HTTP Method可以進(jìn)行Retry活鹰,這里為了演示方便才設(shè)置為true无畔,表示不管GET還是POST什么都能重試辽装。真實(shí)的生產(chǎn)環(huán)境往往只是GET請(qǐng)求可以重試闽寡,或者實(shí)現(xiàn)了冪等性的其他類型請(qǐng)求代兵。
- ConnectTimeout:超時(shí)判定的第一個(gè)參數(shù)(單位ms),創(chuàng)建會(huì)話的連接時(shí)間爷狈。注意植影,這個(gè)不是服務(wù)的響應(yīng)時(shí)間,而是本機(jī)和服務(wù)建立一個(gè)Connection所花費(fèi)的時(shí)間涎永,如果連接超時(shí)則直接進(jìn)行重試思币。
- ReadTimeout:超時(shí)判定的第二個(gè)參數(shù),服務(wù)響應(yīng)時(shí)間土辩。當(dāng)連接建立好之后支救,如果對(duì)方服務(wù)沒(méi)有在規(guī)定時(shí)間內(nèi)返回,則直接進(jìn)行重試
- MaxAutoRetries:求極限關(guān)鍵參數(shù)之一拷淘,當(dāng)前節(jié)點(diǎn)重試次數(shù)各墨。這里重試次數(shù)為2,那么在首次調(diào)用超時(shí)以后启涯,會(huì)再次向同一個(gè)服務(wù)節(jié)點(diǎn)發(fā)起最多2次重試(總共向當(dāng)前節(jié)點(diǎn)1+2=3次請(qǐng)求)贬堵。
- MaxAutoRetriesNextServer:求極限關(guān)鍵參數(shù)之二恃轩,換N個(gè)節(jié)點(diǎn)重試。這里N=2黎做,就是說(shuō)在當(dāng)前機(jī)器調(diào)用超時(shí)后叉跛,F(xiàn)eign將最多換N臺(tái)機(jī)器發(fā)起調(diào)用(注意,這里將和第一個(gè)參數(shù)共同作用蒸殿,也就是說(shuō)筷厘,在新機(jī)器上超時(shí)后,會(huì)繼續(xù)重試MaxAutoRetries+1次)宏所。
下面問(wèn)題來(lái)了酥艳,按照前一個(gè)配置里的參數(shù),最大超時(shí)時(shí)間是多少爬骤?
答案是27000毫秒充石,你答對(duì)了嗎?計(jì)算過(guò)程如下
(2000 + 1000)(2 + 1)(2 + 1)= 27000ms
那總結(jié)一下我們的極值函數(shù)就是:
MAX(Response Time) = (ConnectTimeout + ReadTimeout) * (MaxAutoRetries + 1) * (MaxAutoRetriesNextServer + 1)
在配置超時(shí)信息的時(shí)候要注意霞玄,因?yàn)镕eign中集成了Ribbon所以在優(yōu)先級(jí)這塊骤铃,如果兩邊都配置了,F(xiàn)eign的超時(shí)策略是優(yōu)先于ribbon的坷剧,下面是實(shí)例