SpringCloud--Ribbon--配置詳解


一、自動化配置

在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

 


免責聲明!

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



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