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