基於Zuul,Feign的請求重試及全域性冪等方案

2021-09-27 11:32:40 字數 2163 閱讀 6076

概念解釋

請求重試,主要用來解決以下幾方面問題:

專案發布公升級,服務單個節點重啟時,部分經閘道器路由的請求出現連線拒絕、服務不可用的情況

某個服務節點因記憶體溢位、硬體故障等原因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這樣子就可以在...