- httpclient–請(qǐng)求方瀏覽器
connectTimeOut:建立連接時(shí)間 三次握手 org.apache.http.conn.HttpHostConnectException: Connect to 1.2.3.4:80 [/1.2.3.4] failed: Connection timed out: connect
socketTimeOut:鏈接建立成功后,數(shù)據(jù)包傳輸之間時(shí)間超時(shí)限制,數(shù)據(jù)包,非此次接口調(diào)用時(shí)間,一定要設(shè)置 否則長(zhǎng)時(shí)間等待
java.net.SocketTimeoutException: Read timed out
connectionRequestTimeOut:從連接池獲取連接的超時(shí)限制,不常用 - nginx–響應(yīng)方服務(wù)器
client_header_timeout:讀取客戶端請(qǐng)求頭超時(shí)時(shí)間,默認(rèn)為60s,如果在此超時(shí)時(shí)間內(nèi)客戶端沒(méi)有發(fā)送完請(qǐng)求頭,則響應(yīng)408(RequestTime-out)
client_body_timeout:同上
send_timeout
keepalive_timeout timeout [header_timeout]:關(guān)聯(lián)httpclient連接池 重要:設(shè)置HTTP長(zhǎng)連接超時(shí)時(shí)間,其中,第一個(gè)參數(shù)timeout是告訴Nginx長(zhǎng)連接超時(shí)時(shí)間是多少,默認(rèn)為75s。第二個(gè)參數(shù)header_timeout是用于設(shè)置響應(yīng)頭“Keep-Alive: timeout=time”,即告知客戶端長(zhǎng)連接超時(shí)時(shí)間。兩個(gè)參數(shù)可以不一樣,“Keep-Alive:timeout=time”響應(yīng)頭可以在Mozilla和Konqueror系列瀏覽器起作用,而MSIE長(zhǎng)連接默認(rèn)大約為60s,而不會(huì)使用“Keep-Alive: timeout=time”。如Httpclient框架會(huì)使用“Keep-Alive: timeout=time”響應(yīng)頭的超時(shí)(如果不設(shè)置默認(rèn),則認(rèn)為是永久)。如果timeout設(shè)置為0,則表示禁用長(zhǎng)連接。
還有各種轉(zhuǎn)發(fā)超時(shí) - Spring Cloud各個(gè)框架超時(shí)配置
feign:default或feignName或contextId:feign 作為最前端暴露給用戶使用的,一般其超時(shí)設(shè)置相當(dāng)于對(duì)用戶的一個(gè)承諾,所以Spring在處理這一塊的時(shí)候,會(huì)有意識(shí)地使用feign的超時(shí)時(shí)間來(lái)設(shè)置后面的ribbon 和http client組件。需要注意的是:hystrix的超時(shí)處理和feign之間在當(dāng)前的Spring Cloud框架規(guī)劃中,并沒(méi)有相關(guān)關(guān)系。
feign.client.config.default.connectTimeout:網(wǎng)絡(luò)連接
feign.client.config.default.readTimeout:數(shù)據(jù)讀取
hystrix:Hystrix的超時(shí)設(shè)置,在于命令執(zhí)行的時(shí)間,一般而言,這個(gè)時(shí)間要稍微比Feign的超時(shí)時(shí)間稍微長(zhǎng)些,因?yàn)镃ommand除了請(qǐng)求調(diào)用之外,還有一些業(yè)務(wù)代碼消耗。Hystrix的超時(shí)時(shí)間是站在命令執(zhí)行時(shí)間來(lái)看的,和Feign設(shè)置的超時(shí)時(shí)間在設(shè)置上并沒(méi)有關(guān)聯(lián)關(guān)系。Hystrix不僅僅可以封裝Http調(diào)用,還可以封裝任意的代碼執(zhí)行片段。Hystrix是從命令對(duì)象的角度去定義,某個(gè)命令執(zhí)行的超時(shí)時(shí)間,超過(guò)此此時(shí)間,命令將會(huì)直接熔斷。假設(shè)hystrix 的默認(rèn)超時(shí)時(shí)間設(shè)置了10000,即10秒,而feign 設(shè)置的是20秒,那么Hystrix會(huì)在10秒到來(lái)是直接熔斷返回,不會(huì)等到feign的20秒執(zhí)行結(jié)束,也不會(huì)中斷尚未執(zhí)行完的feign調(diào)用。
hystrix.command.default.execution.isolation.strategy = THREAD
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds = 10000
hystrix.command.default.execution.timeout.enabled = true
hystrix.command.default.execution.isolation.thread.interruptOnTimeout = true
hystrix.command.default.execution.isolation.thread.interruptOnFutureCancel = false
ribbon:當(dāng)feign設(shè)置了超時(shí)時(shí)間,Ribbon會(huì)依據(jù)feign的設(shè)置同步。Ribbon的這個(gè)超時(shí)時(shí)間,用于指導(dǎo)真正調(diào)用接口時(shí),設(shè)置真正實(shí)現(xiàn)者的超時(shí)時(shí)間。Ribbon和Feign是相對(duì)獨(dú)立的組件,在一個(gè)Spring Cloud框架運(yùn)行環(huán)境中,可以沒(méi)有Feign。那么,在這種場(chǎng)景下,假設(shè)Http Client客戶端使用的是OKHttp,并且通過(guò)ribbon.okhttp.enabled 指定ribbon調(diào)用時(shí),會(huì)使用ribbon的超時(shí)配置來(lái)初始化OkHttp.為了保證整個(gè)組件調(diào)用鏈的超時(shí)關(guān)系,一般Spring Cloud采取的策略是:依賴方的超時(shí)配置覆蓋被依賴方的配置。當(dāng)然這個(gè)也不是絕對(duì)的,實(shí)際上對(duì)于Feign而言,可以直接指定Feign和HttpClient之間的配置關(guān)系
feign.httpclient.maxConnections = 200http //client大連接數(shù),默認(rèn)200
feign.httpclient.maxConnectionsPerRoute= 50 //每個(gè)IP路由大連接數(shù)量
feign.httpclient.timeToLive = 900 //連接存活時(shí)間
feign.httpclient.timeToLiveUnit = SECONDS //連接存活時(shí)間單位
feign.httpclient.connectionTimeout = 2000 //連接超時(shí)時(shí)間
fein.httpclient.connectionTimeout=3000 //連接超時(shí)定時(shí)器的執(zhí)行頻率
Hystrix的超時(shí)時(shí)間和Feign或者Http Client的超時(shí)時(shí)間關(guān)系
Hystrix的超時(shí)意義是從代碼執(zhí)行時(shí)間層面控制超時(shí);而Feign或Http Client 則是通過(guò)Http底層TCP/IP的偏網(wǎng)絡(luò)層層面控制的超時(shí)。
建議是:一般情況下,Hystrix 的超時(shí)時(shí)間要大于Feign或Http Client的超時(shí)時(shí)間;而對(duì)于特殊需求的接口調(diào)用上,為了避免等待時(shí)間太長(zhǎng),需要將對(duì)應(yīng)的Hystrix command 超時(shí)時(shí)間配置的偏小一點(diǎn),滿足業(yè)務(wù)側(cè)的要求。
zuul
zuul.host.socket-timeout-millis=2000 #默認(rèn)1000
zuul.host.connect-timeout-millis=4000 #默認(rèn)2000
others
#斷路器詳細(xì)設(shè)置
#當(dāng)在配置時(shí)間窗口內(nèi)達(dá)到此數(shù)量的失敗后,進(jìn)行短路。默認(rèn)20個(gè))
#hystrix.command.default.circuitBreaker.requestVolumeThreshold=20
#短路多久以后開(kāi)始嘗試是否恢復(fù),默認(rèn)5s)
#hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=5
#出錯(cuò)百分比閾值,當(dāng)達(dá)到此閾值后,開(kāi)始短路。默認(rèn)50%)
#hystrix.command.default.circuitBreaker.errorThresholdPercentage=50%
#重試機(jī)制
#該參數(shù)用來(lái)開(kāi)啟重試機(jī)制,默認(rèn)是關(guān)閉
spring.cloud.loadbalancer.retry.enabled=true
#對(duì)所有操作請(qǐng)求都進(jìn)行重試
ribbon.OkToRetryOnAllOperations=true
#對(duì)當(dāng)前實(shí)例的重試次數(shù)
ribbon.MaxAutoRetries=1
#切換實(shí)例的重試次數(shù)
ribbon.MaxAutoRetriesNextServer=1
#根據(jù)如上配置,當(dāng)訪問(wèn)到故障請(qǐng)求的時(shí)候,它會(huì)再嘗試訪問(wèn)一次當(dāng)前實(shí)例(次數(shù)由MaxAutoRetries配置),如果不行,就換一個(gè)實(shí)例進(jìn)行訪問(wèn),如果還是不行,再換一次實(shí)例訪問(wèn)(更換次數(shù)由MaxAutoRetriesNextServer配置),
zuul請(qǐng)求也是通過(guò)Ribbon負(fù)載均衡客戶端去調(diào)用其他服務(wù)的,ribbon客戶端默認(rèn)是用HttpClient來(lái)發(fā)起http請(qǐng)求調(diào)用,ribbon內(nèi)部又會(huì)構(gòu)造hystrix command來(lái)執(zhí)行請(qǐng)求(所以我們常說(shuō)ribbon的超時(shí)時(shí)間設(shè)置要大于等于hystrix 超時(shí)時(shí)間,不然導(dǎo)致command還沒(méi)執(zhí)行完,ribbon卻超時(shí)了)
創(chuàng)新互聯(lián)提供
成都做網(wǎng)站、成都網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì),
成都品牌網(wǎng)站建設(shè),
廣告投放平臺(tái)等致力于企業(yè)網(wǎng)站建設(shè)與公司網(wǎng)站制作,十余年的網(wǎng)站開(kāi)發(fā)和建站經(jīng)驗(yàn),助力企業(yè)信息化建設(shè),成功案例突破近1000家,是您實(shí)現(xiàn)網(wǎng)站建設(shè)的好選擇.
feign調(diào)用原理
Ribbon有哪些負(fù)載均衡策略:
輪詢策略
權(quán)重策略
隨機(jī)策略
最小連接數(shù)策略
重試策略
可用性敏感策略
區(qū)域敏感策略
Feign和Ribbon的重試機(jī)制相當(dāng)于一個(gè)雙層循環(huán),feign重試機(jī)制在外層,Ribbon的重試機(jī)制在里層,每執(zhí)行一次feign的重試機(jī)制,內(nèi)層的Ribbon的重試機(jī)制都會(huì)全部執(zhí)行一次。Feign和OpenFeign的底層就是Ribbon,所以當(dāng)項(xiàng)目使用了Feign或OpenFeign的重試機(jī)制,就不要開(kāi)啟Ribbon的重試機(jī)制,反之亦然。否則重試配置重疊,實(shí)際重試次數(shù)是二者的笛卡爾積。
ribbon的重試機(jī)制是使用RequestSpecificRetryHandler和LoadBalancerCommand來(lái)處理的,我們可以在配置文件定義參數(shù),Spring框架會(huì)自動(dòng)幫我們加載到RequestSpecificRetryHandler和LoadBalancerCommand的屬性中去
feign的重試機(jī)制的實(shí)現(xiàn)類是Retryer,他的核心參數(shù)含義如下:
maxAttempts-大嘗試次數(shù),默認(rèn)值為5,首次請(qǐng)求也算一次,請(qǐng)求1次,重試4次。
period;-初始時(shí)間,用于參與計(jì)算線程休眠時(shí)間。
maxPeriod;-線程休眠的單次大時(shí)間上限。
attempt;-嘗試次數(shù),每次嘗試+1。
sleptForMillis;-線程累計(jì)休眠總時(shí)間。
Spring Cloud組件那么多超時(shí)設(shè)置,我們?nèi)绾卫斫夂瓦\(yùn)用?
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
分享文章:http各種超時(shí)配置-創(chuàng)新互聯(lián)
本文路徑:
http://weahome.cn/article/djdogc.html