Spring Cloud實戰小貼士:Ribbon的飢餓載入(eager-load)模式
阿新 • • 發佈:2018-12-15
我們在使用Spring Cloud的Ribbon或Feign來實現服務呼叫的時候,如果我們的機器或網路環境等原因不是很好的話,有時候會發現這樣一個問題:我們服務消費方呼叫服務提供方介面的時候,第一次請求經常會超時,而之後的呼叫就沒有問題了。下面我們就來說說造成這個問題的原因,以及如何解決的方法。
問題原因
造成第一次服務調用出現失敗的原因主要是Ribbon進行客戶端負載均衡的Client並不是在服務啟動的時候就初始化好的,而是在呼叫的時候才會去建立相應的Client,所以第一次呼叫的耗時不僅僅包含傳送HTTP請求的時間,還包含了建立RibbonClient的時間,這樣一來如果建立時間速度較慢,同時設定的超時時間又比較短的話,很容易就會出現上面所描述的顯現。
從日誌中我們也能知道這一點細節,在第一次發起呼叫的時候我們可以從日誌中看到如下資訊:
2017-09-25 08:29:54,201 INFO [main] com.netflix.loadbalancer.DynamicServerListLoadBalancer - DynamicServerListLoadBalancer for client hello-service initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=hello-service,current list of Servers=[192.168.99.176:9901],Load balancer stats=Zone stats: {unknown=[Zone:unknown; Instance count:1; Active connections count: 0; Circuit breaker tripped count: 0; Active connections per server: 0.0;] },Server stats: [[Server:192.168.99.176:9901; Zone:UNKNOWN; Total Requests:0; Successive connection failure:0; Total blackout seconds:0; Last connection made:Thu Jan 01 08:00:00 CST 1970; First connection made: Thu Jan 01 08:00:00 CST 1970; Active Connections:0; total failure count in last (1000) msecs:0; average resp time:0.0; 90 percentile resp time:0.0; 95 percentile resp time:0.0; min resp time:0.0; max resp time:0.0; stddev resp time:0.0] ]}ServerList:ConsulServerList{serviceId='hello-service', tag=null} |
而Feign的實現基於Ribbon,所以它也有一樣的問題,下面就來看看如何解決這個問題。
解決方法
解決的方法很簡單,既然第一次呼叫時候產生RibbonClient耗時,那麼就讓它提前建立,而不是在第一次呼叫的時候建立。
在Spring Cloud的Dlaston版本中提供了幾個新的引數,它們可以很方便的幫我們實現這樣的功能。
ribbon.eager-load.enabled=true ribbon.eager-load.clients=hello-service, user-service |
引數說明:
- ribbon.eager-load.enabled:開啟Ribbon的飢餓載入模式
- ribbon.eager-load.clients:指定需要飢餓載入的客戶端名稱、服務名
通過上面的配置完成之後,我們嘗試重啟一下服務消費者,這個時候我們會發現,我們沒有開始呼叫服務介面,但是上面初始化負載均衡的日誌就已經打印出來了。這就說明我們對ribbon的飢餓載入模組設定已經生效了。