Spring Cloud實戰:Ribbon的飢餓加載(eager-load)模式

我們在使用Spring Cloud的Ribbon或Feign來實現服務調用的時候,如果我們的機器或網絡環境等原因不是很好的話,有時候會發現這樣一個問題:我們服務消費方調用服務提供方接口的時候,第一次請求經常會超時,而之後的調用就沒有問題了。下面我們就來說說造成這個問題的原因,以及如何解決的方法。

 問題原因

造成第一次服務調用出現失敗的原因主要是Ribbon進行客戶端負載均衡的Client並不是在服務啓動的時候就初始化好的,而是在調用的時候纔會去創建相應的Client,所以第一次調用的耗時不僅僅包含發送HTTP請求的時間,還包含了創建RibbonClient的時間,這樣一來如果創建時間速度較慢,同時設置的超時時間又比較短的話,很容易就會出現上面所描述的顯現。

從日誌中我們也能知道這一點細節,在第一次發起調用的時候我們可以從日誌中看到如下信息:

2020-05-10 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=[IP: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:IP: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的飢餓加載模塊設置已經生效了。

本文由 程序猿DD-翟永超 創作

原文地址:http://blog.didispace.com/spring-cloud-tips-ribbon-eager/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章