轉載請注明作者及出處:
作者:銀河架構師
原文鏈接: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相關電子書。