前置說明
關(guān)于springcloud體系下的超時(shí)相關(guān)的配置主要有下面的,最初接觸時(shí)瞬間感覺有點(diǎn)凌亂
ribbon:
ReadTimeout: 10000 #單位ms,請(qǐng)求處理的超時(shí)時(shí)間
ConnectTimeout: 200 #單位ms,請(qǐng)求連接超時(shí)時(shí)間
feign:
hystrix:
enabled: true
client:
config:
default:
connect-timeout: 200 #連接超時(shí)時(shí)間
read-timeout: 10000
hystrix:
threadpool:
default:
#設(shè)置feign的核心線程池的數(shù)量
coreSize: 200
command:
default:
execution:
isolation:
thread:
#斷路器超時(shí)設(shè)置和請(qǐng)求的超時(shí)
timeoutInMilliseconds: 12000
isolation:
semaphore:
#設(shè)置回退的最大線程數(shù)
maxConcurrentRequests: 10
?
ribbon,feign和hystrix說明
- 先看ribbon和feign的區(qū)別
Ribbon
Ribbon就是一種客戶端負(fù)載均衡的實(shí)現(xiàn),它是有Netflix發(fā)布的一個(gè)基于HTTP和TCP的客戶端負(fù)載均衡工具笨使。
服務(wù)消費(fèi)者繼承Ribbon后卿樱,只需要配置服務(wù)提供者地址,Ribbon就可以基于指定的負(fù)載均衡算法硫椰,自動(dòng)幫服務(wù)消費(fèi)者分配請(qǐng)求繁调。
Ribbon提供了很多常見的負(fù)載均衡算法萨蚕,入輪詢、隨機(jī)蹄胰、權(quán)重等岳遥。
作為Spring Cloud體系中的一員,Ribbon可以和Eureka方便地集合使用裕寨,可以直接從Eureka Server中獲取所有服務(wù)提供者的節(jié)點(diǎn)地址寒随,
然后根據(jù)指定的負(fù)載均衡策略選擇某個(gè)節(jié)點(diǎn)進(jìn)行訪問。
Feign
Feign 是在 Ribbon的基礎(chǔ)上進(jìn)行了一次改進(jìn)帮坚,是一個(gè)使用起來更加方便的 HTTP 客戶端妻往。
采用接口的方式, 只需要?jiǎng)?chuàng)建一個(gè)接口试和,然后在上面添加注解即可 讯泣,將需要調(diào)用的其他服務(wù)的方法定義成抽象方法即可, 不需要自己構(gòu)建http請(qǐng)求阅悍。
SpringCloud對(duì)Feign進(jìn)?了增強(qiáng)好渠,使Feign?持了SpringMVC注解(OpenFeign)
簡(jiǎn)單總結(jié)下:
ribbon 是用來負(fù)載均衡的
feign 是基于ribbon的封裝,主要作用是讓接口的調(diào)用更加優(yōu)雅(接口+注解)
因此可以這樣理解: feign的很多配置其實(shí)也是對(duì)ribbon的配置
- hystrix說明
具體說明和使用可以參考: https://www.cnblogs.com/xfeiyun/p/16221024.html
主要功能
1、服務(wù)降級(jí)
服務(wù)器繁忙节视,讓客戶稍后在試兜底的方法拳锚,另外的解決方案、哪些原因走兜底的方法呢寻行?
1超時(shí)霍掺,2程序異常,3熔斷觸發(fā)降級(jí)拌蜘,線程池太高
2杆烁、服務(wù)熔斷
類比保險(xiǎn)絲,
達(dá)到最大服務(wù)訪問后简卧,直接拒絕訪問兔魂,拉閘斷電。
3举娩、服務(wù)限流
秒殺高并發(fā)等操作析校,嚴(yán)禁一群蜂擁過來,大家排隊(duì)铜涉。有序進(jìn)行
- ribbon,feign和hystrix時(shí)間相關(guān)說明
可以簡(jiǎn)單理解為:
hystrix對(duì)應(yīng)的是斷路器的時(shí)間
feign/ribbon對(duì)應(yīng)的是請(qǐng)求的時(shí)間
?
ribbon,feign和hystrix配置說明
關(guān)于ribbon和Feign默認(rèn)超時(shí)時(shí)間,查了資料,網(wǎng)上主要有2個(gè)版本
- ribbon和Feign默認(rèn)超時(shí)時(shí)間都是1s
- ribbon和Feign默認(rèn)的connectTimeout時(shí)長(zhǎng)是10s,readTimeout時(shí)長(zhǎng)是60s
經(jīng)過實(shí)際測(cè)試,無任何配置的情況下,1s后就超時(shí)了
源碼分析過程可以參考 https://blog.csdn.net/u011523825/article/details/120819416
image.png
關(guān)于ribbon和Feign超時(shí)時(shí)間配置說明
- Feign 和 Ribbon 的超時(shí)時(shí)間只會(huì)有一個(gè)生效
- 當(dāng)我們沒有顯式配飾feign的超時(shí)時(shí)間的是時(shí)候智玻,如果配置了ribbon的超時(shí)時(shí)間,則只有這個(gè)配置會(huì)生效骄噪,feign默認(rèn)的1s超時(shí)無效
- 如果我們feign和ribbon的超時(shí)時(shí)間都配置了尚困,會(huì)以feign配置的為準(zhǔn)
關(guān)于hystrix默認(rèn)超時(shí)時(shí)間與配置說明
如果配置了hystrix功能,那么它的超時(shí)時(shí)間默認(rèn)就是開啟的链蕊,且該時(shí)間是1秒事甜,這個(gè)時(shí)間和ribbon的超時(shí)時(shí)間會(huì)同時(shí)起作用,不像上面的feign的超時(shí)時(shí)間和ribbon超時(shí)時(shí)間二選一滔韵,我們可以通過上面的配置hystrix的超時(shí)時(shí)間讓它更長(zhǎng)逻谦,或者顯式禁用hystrix的超時(shí)時(shí)間:
hystrix:
command:
default:
execution:
timeout:
#這里表示禁用hystrix的超時(shí)時(shí)間限制
enabled: false
?
時(shí)間配置規(guī)則案例分析
- 這里分開啟/不開啟hystrix情況分別分析,開啟方式
feign:
hystrix:
enabled: true
- 沒有開啟hystrix情況
看下下面的配置案例
// 下面的配置,read-timeout是5秒
feign:
client:
config:
default:
connect-timeout: 200 #連接超時(shí)時(shí)間
read-timeout: 5000
// 下面的配置,read-timeout也是5秒(feign-5秒,ribbon-8秒)
feign:
client:
config:
default:
connect-timeout: 200 #連接超時(shí)時(shí)間
read-timeout: 5000
ribbon:
ReadTimeout: 10000 #單位ms,請(qǐng)求處理的超時(shí)時(shí)間
ConnectTimeout: 8000 #單位ms,請(qǐng)求連接超時(shí)時(shí)間
- 開啟hystrix情況
看下下面的配置案例
// 下面超時(shí)時(shí)間是5秒(feign-5秒,ribbon-8秒,hystrix-12秒)
feign:
hystrix:
enabled: true
client:
config:
default:
connect-timeout: 200 #連接超時(shí)時(shí)間
read-timeout: 5000
ribbon:
ReadTimeout: 8000 #單位ms,請(qǐng)求處理的超時(shí)時(shí)間
ConnectTimeout: 200 #單位ms,請(qǐng)求連接超時(shí)時(shí)間
hystrix:
threadpool:
default:
#設(shè)置feign的核心線程池的數(shù)量
coreSize: 200
command:
default:
execution:
isolation:
thread:
#斷路器超時(shí)設(shè)置和請(qǐng)求的超時(shí)
timeoutInMilliseconds: 12000
isolation:
semaphore:
#設(shè)置回退的最大線程數(shù)
maxConcurrentRequests: 10
日志
19:30:08.146 [http-nio-8273-exec-5] [587c47b639050fc3,587c47b639050fc3] INFO OrderTestController.testTimeOut[21]- timeout test start
19:30:13.165 [hystrix-JIU-USER-2] [587c47b639050fc3,faf7c02d6b08ad0c] INFO UserFeign$UserFeignFallBackFactory.testTimeOut[29]- testTimeOut fallback
?
feign、ribbon陪蜻、hystrix設(shè)置單個(gè)接口的超時(shí)時(shí)間
上面的配置主要是針對(duì)全局的配置,另外,我們也可以針對(duì)方法級(jí)別做配置,可以參考
https://blog.csdn.net/qq_35388010/article/details/125448911
單接口配置說明
- feign設(shè)置單個(gè)接口超時(shí):通過指定的contextId
- ribbon不能指定單個(gè)接口超時(shí)時(shí)間邦马,可以用feign配置單個(gè)接口超時(shí),feign和ribbon配置超時(shí)同時(shí)存在時(shí)宴卖,feign的配置生效滋将。要實(shí)現(xiàn)ribbon的單個(gè)接口超時(shí),需要重寫ribbon源碼症昏。
- Hystrix默認(rèn)支持:全局(default )或 方法級(jí)(類名#方法名(參數(shù)類型) )配置随闽。類名#方法名(參數(shù)類型) 的方式配置不夠方便,可重寫feign.hystrix.SetterFactory肝谭,自定義CommandKey掘宪,使支持類名配置