避坑指南(〇):ribbon超時配置不生效


轉載請注明作者及出處:

作者:銀河架構師

原文鏈接:https://www.cnblogs.com/luas/p/12089578.html

​前段產品自測階段,發現了一個令人頭疼的問題,服務啟動之后,總是在一段時間之內time out。扒拉了許久代碼,發現是網關中ribbon的超時配置不管用,還是默認配置,而本地環境啟動訪問太多,總是時不時就超時了。於是,決定深入研究一下。

配置如下:

ribbon:  
    httpclient:    
        enabled: true  
    max-connections-per-host: 500  
    max-total-connections: 2000 
    connect-timeout: 60000  
    read-timeout: 60000        

 

發現無論如何都不生效,總是超時。手動黑人問號臉!!!

無奈,翻源碼吧。

得益於idea的強大,沒多久就找到了DefaultClientConfigImpl,進而找到了IClientConfig、CommonClientConfigKey、RibbonProperties、HttpClientRibbonConfiguration等類。

首先,DefaultClientConfigImpl各種邏輯,就一段最重要:

怎么辦?打上個斷點,調戲一番。咳咳,錯了錯了,是調試,調試,粗魯了。

進入其取值方法,進一步跟蹤:

一番調試(*&.~<>,差點又沒忍住!!!),果然發現是默認值50,而不是預先配置的500。(二營長,你他娘的意大利炮呢?)
算了,忍一時風平浪靜。經過一番探秘,好像發現了一點門道。CommonClientConfigKey中對這些配置項的定義都是UpperCamel,如圖所示:

難道不支持自動轉換嗎?又去cloud源碼spring-cloud-starter-netflix-ribbon、spring-cloud-netflix-ribbon中找了一通,發現了一段邏輯:

都是從原生配置類中獲取參數值,而原生ribbon獲取配置邏輯如下:

至於ConfigurationManager是個什么鬼,看下代碼:

不管是啥,反正是獲取系統配置。獲取完配置以后,再設置到系統變量中。

看到這里,應該就明白了,這貨竟然使用的是自己CommonClientConfigKey配置類的原始UpperCamel格式的property name,WTF?改改試試吧:

ribbon:  
    httpclient:      
        enabled: true  
    MaxConnectionsPerHost: 500  
    MaxTotalConnections: 2000  
    ConnectTimeout: 60000  
    ReadTimeout: 60000    

再次調試(這次忍住了,哈哈哈哈!)

大功告成!!!另外,稍微解釋一下ribbon的配置格式,借用ribbon原生默認配置類DefaultClientConfigImpl的注釋,說的很明白:

--------------------------------------------------------------------------------------------------------------------------------------------    END    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

微信搜索【銀河架構師】,發現更多精彩內容。

 技術資料領取方法:關注公眾號,回復微服務,領取微服務相關電子書;回復MK精講,領取MK精講系列電子書;回復JAVA 進階,領取JAVA進階知識相關電子書;回復JAVA面試,領取JAVA面試相關電子書,回復JAVA WEB領取JAVA WEB相關電子書。

image.png


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM