• 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
  • 相关阅读:
    DB2保存图片并读取动态显示图片
    DIV布局之position详解
    dojo之配置dojoconfig
    JAVA虚拟机内存架构
    UrlConnection的代理和返回状态码的问题
    自定义网站的icon和收藏夹图标
    DB2建库简单例子
    python学习笔记之函数(方法)
    python学习笔记之基础数据和控制
    MVC3学习:实现文章上一篇下一篇链接
  • 原文地址:https://www.cnblogs.com/liconglong/p/13294916.html
Copyright © 2020-2023  润新知