概念解釋
請求重試,主要用來解決以下幾方面問題:
專案發布公升級,服務單個節點重啟時,部分經閘道器路由的請求出現連線拒絕、服務不可用的情況
某個服務節點因記憶體溢位、硬體故障等原因down掉時的請求無響應情況
連線池滿、執行緒死鎖造成的相應緩慢情況
網路波動導致的部分節點無法連線情況
單次請求經由路由**後到達服務節點,如出現上述問題,可採用**至服務集群中的其他節點的方式來提高服務健壯度。
實現方案
由於對於線上環境的應用服務,基本全部採用了多節點部署方式,而在某次請求未能成功時,對單一節點重複請求的成功率低於向其他節點請求,因此該方案使用切換節點重試的方式。zuul
通過引入spring-retry包,並開啟zuul.retryable: true配置開啟重試,由於zuul的route依賴ribbon,需在ribbon配置節點增加對應項。完整配置如下:
zuul:
host:
connect-timeout-millis: 500
socket-timeout-millis: 10000
senderrorfilter:
error:
disable: true
retryable: true
eureka:
client:
registry-fetch-interval-seconds: 3 # 重新整理本地快取時間(30s) dev:3 test:3 pre:3 pro:5
hystrix:
command:
default:
execution:
timeout: #配置命令的執行,是否會超時
enabled: true
isolation:
thread: #命令的執行超時時間 超時將執行回退
timeoutinmilliseconds: 31500
ribbon:
readtimeout: 10000
connecttimeout: 500
maxautoretries: 0 # 當前節點的重試次數
maxautoretriesnextserver: 2 # 其他節點的重試次數
關鍵配置項:maxautoretriesnextserver,此處的2表明一次請求最大可能被處理三次,因此熔斷器的超時時長應設定為單詞時長的三倍。該配置項會在請求失敗時,將請求forward到其他節點,如果當前註冊中心中並未發現該服務的其他節點,則
直接結束請求 (此處與feign有所不同)
切換到其他節點進行重試,還受影響與zuul此時持有的服務節點快取,即便此時註冊中心中存在其他節點,如果zuul持有的服務節點快取中沒有其他節點,請求也會被終止。此處把快取節點的重新整理時間調整為3秒,來提高對於註冊中心的變化相應速度
feign
在同一註冊中心環境下的服務間呼叫,一般採用feignclient的方式,feign預設開啟了重試開關,只需在ribbon配置節點新增對重試方式和次數的宣告,並引入spring-retry依賴包即可使用。
feign的重試策略,經驗證發現,與zuul環境下的效果有所不同。feign會在單詞請求失敗後,隨機**請求到該服務的所有節點,包含已經失敗的當前節點,及時maxautoretries配置項為0。
全域性冪等方案
為避免重複的請求造成多次資料處理,而產生非預期的效果,此處使用redissonlock對請求進行約束,來確保本次請求只會被執行一次。處理流程如下:
在zuul和feigncliient發出請求之前,向requestheader中新增requestid項(毫秒+隨機數組成)
請求到達服務節點時,使用requestid+服務對應serverid建立基於redis的分布式鎖,後執行對應處理流程
請求在超時情況下被**到其他節點時,如果未能獲取到對應規則的分布式鎖,則直接返回請求超時的異常資訊,並終止重試
處理完成,延遲10s(對應單詞ribbon的超時時間)釋放鎖,已避免單次請求超時,重試到其他節點的同時,原節點剛好完成處理並釋放鎖,導致被認為請求未被處理過的情況。
原文:
基於Android Volley的網路請求工具
一 說明 二 volley基本處理流程 1 應用初始化volley。2 volley建立乙個requestqueue networkdispatcher組及network。3 requestqueue即乙個request佇列,requestqueue會建立乙個executordelivery。4 n...
iOS基於Https的網路請求
https簡單說明 https 全稱 hyper text transfer protocol over secure socket layer 是以安全為目標的http通道,簡單講是http的安全版。即http下加入ssl層,https的安全基礎是ssl 安全套接字層 因此加密的詳細內容就需要ss...
簡單的基於Vue axios請求封裝
具體實現思路 封裝之前需要用npm安裝並引入axios,使用乙個單獨的js模組作為介面請輸出物件,然後export dafult 這個物件。1.首先我們需要在vue例項的原型prototype中擴充套件乙個 http的方法取代axios vue.prototype.http axios這樣子就可以在...