一、自動化配置
在Robbin定義的每一個接口都有多個實現類,但是在引入Spring Cloud Ribbon后,會默認加載相應的實現類,那么默認的實現類及實現效果如下表格所示:
特殊說明:以下默認實現類時只有Ribbon的時候的默認實現類
自動化配置接口 | 描述 | 默認實現 | 說明 |
IClientConfig | Ribbon的客戶端配置 | com.netflix.client.config.DefaultClientConfigImpl | |
IRule | Ribbon的負載均衡策略 | com.netflix.loadbalancer.ZoneAvoidanceRule | 該策略能在多區域環境下選出最佳區域的實例進行訪問 |
IPing | Ribbon的實例檢查策略 | com.netflix.loadbalancer.NoOpPing | 該檢查策略是一個特殊的實現,實際上它並不會檢查實例是否可用,而是始終返回true,默認所有的實例都是可用的 |
ServerList<Server> | 服務實例清單維護機制 | com.netflix.loadbalancer.ConfigurationBasedServerList | |
ServerListFilter<Server> |
服務實例清單過濾機制 | org.springframework.cloud.netflix.ribbon.ZonePreferenceServerListFilter | 該策略能夠優先過濾出與請求調用方處於同一個區域的服務清單 |
ILoadBalancer | 負載均衡器 | com.netflix.loadbalancer.ZoneAwareLoadBalancer | 該策略具備服務感知能力 |
通過上述自動化配置,我們可以輕松的實現客戶端的負載均衡,如果我們想自己實現個性化的配置,那么我們可以使用自己的配置覆蓋上述的配置
(1)配置方式一:使用配置類粗粒度控制
如下代碼所示,可以直接寫一個自己的配置類,里面加載自己要使用的接口實現即可
@Configuration public class MyRibbonConfiguration { @Bean public IPing ribbonPing(){ return new PingUrl(); } }
(2)配置方式二:使用配置類細粒度控制
如下代碼所示,可以針對服務來做配置
@Configuration public class HelloRibbonConfiguration { @Bean public IPing ribbonPing(){ return new PingUrl(); } }
@Configuration @RibbonClient(name = "EUREKA-CLIENT",configuration = HelloRibbonConfiguration.class) public class RibbonConfiguration { }
(3)使用配置文件控制
可以使用 <clientName>.ribbon.<key>=<value>的形式配置,例如:
EUREKA-CLIENT:
ribbon:
NFLoadBalancerClassName: com.netflix.loadbalancer.ZoneAwareLoadBalancer
在上述樣例中,EUREKA-CLIENT是服務名稱,NFLoadBalancerClassName是負載均衡器的key,而com.netflix.loadbalancer.ZoneAwareLoadBalancer是負載均衡器的實現類,那么key都有哪些呢?可以查看org.springframework.cloud.netflix.ribbon.PropertiesFactory
public PropertiesFactory() { classToProperty.put(ILoadBalancer.class, "NFLoadBalancerClassName"); classToProperty.put(IPing.class, "NFLoadBalancerPingClassName"); classToProperty.put(IRule.class, "NFLoadBalancerRuleClassName"); classToProperty.put(ServerList.class, "NIWSServerListClassName"); classToProperty.put(ServerListFilter.class, "NIWSServerListFilterClassName"); }
通過名稱就能看出來,從上至下分別為:ILoadBalancer實現、IPing實現、IRule實現、ServerList實現、ServerListFilter實現
二、參數配置
對於Ribbon的配置一般有兩種配置方式:全局配置和指定客戶端配置
全局配置使用 ribbon.<key>=<value> 的形式配置,例如全局配置連接超時時間:
ribbon: ConnectTimeout: 250
指定客戶端配置方式采用 <client>.ribbon.<key>=<value>,使用樣例如下所示,同時,如果同時配置了全局配置和指定客戶端配置,那么以指定客戶端的配置為准。
EUREKA-CLIENT: ribbon: listOfServers: localhost:8001,localhost:8002
全量的配置項可以參考com.netflix.client.config.CommonClientConfigKey中的配置,由於配置項太多,就不一一說明。
三、與Eureka集成
當在Spring Cloud中同時引入Spring Cloud Eureka 和 Spring Cloud Ribbon 時,會觸發Eureka對於Ribbon的自動化配置,那么Ribbon的相關默認實現類就會有所變化。
自動化配置接口 | 描述 | 默認實現 | 說明 |
IPing | Ribbon的實例檢查策略 | com.netflix.niws.loadbalancer.NIWSDiscoveryPing | 該實現將實例檢查的任務交給服務治理框架來進行維護 |
ServerList<Server> | 服務實例清單維護機制 | com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList | 該實現會將服務清單列表交給Eureka來維護 |
在與Spring Cloud Eureka結合使用時,我們的配置會更簡單,例如上一步中提到的客戶端配置EUREKA-CLIENT.ribbon.listOfServers,就不需要再這么麻煩的進行配置,因為Eureka會為我們維護所有實例的清單。
我們也可以通過參數配置來近用Eureka對Ribbon服務實例的維護實現
ribbon.eureka.enabled=false
四、重試機制
眾所周知,分布式服務治理有CAP原則(一致性、可用性、可靠性),其中代表性的Eureka保證了AP(可用性和可靠性),而Zookeeper保證了CP(一致性、可靠性)。
由於Eureka保證了可用性而舍去了一致性,因此無論是觸發了保護機制還是服務剔除延遲,最終導致調用到故障的實例的時候,我們還是希望增強對這類問題的容錯,因此Ribbon就提供了充實策略。
對於重試機制的參數配置如下代碼所示,具體含義描述已在代碼中注釋
# 開啟重試機制,默認為關閉 spring: cloud: loadbalancer: retry: enable: true #斷路器的超時時間需要大於Ribbon的超時時間,不然不會觸發重試 hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 10000 EUREKA-CLIENT: ribbon: #請求鏈接的超時時間 ConnectTimeOut: 250 #請求處理的超時時間 ReadTimeOut: 1000 #對所有操作都重試 OkToRetyrOnAllOperations: true #切換實例的重試次數 MaxAutoRetyiesNextServer: 2 #對當前實例的重試次數 MaxAutoRetries: 1