• ribbon源码(2) 负载均衡器


      负载均衡器对外提供负载均衡的功能,本质上是是维护当前服务的服务器列表和服务器状态,通过负载均衡算法选取合适的服务器地址

      用户可以通过实现ILoadBalancer来实现自己的负载均衡器,ribbon也提供了BaseLoadBalancer、DynamicServerListLoadBalancer、ZoneAwareLoadBalancer三个负载均衡器。

    ILoadBalancer

      负载均衡器接口,定义了负载均衡器的相关方法。

    public interface ILoadBalancer {
        /**
         * 向负载均衡器添加服务器实体。
         * 
         * @param newServers new servers to add
         */
        public void addServers(List<Server> newServers);
        /**
         * 选择一台Server*/
        public Server chooseServer(Object key);
        /**
         * 将指定Server标记为down
         * 
         * @param server Server to mark as down
         */
        public void markServerDown(Server server);/**
         * 返回所有启动的服务。*/
        public List<Server> getReachableServers();
        /**
         * 返回所有的服务。*/
        public List<Server> getAllServers();
    }

     BaseLoadBalancer

      ribbon实现的基本负载均衡器。本质上BaseLoadBalancer内部维护了当前服务器的服务器列表,BaseLoadBalancer不会自动更新服务器列表。

      ribbon会定时去检查服务器列表中服务器的存活情况,内部会启动一个定时器,使用IPing来对服务器状态进行检测,使用IPingStrategy来定义检测策略,然后更新upServerList,并调用相应的监听器。通过实现IPing接口来实现单台服务器探测流程,ribbon默认提供了DummyPing实现;使用IPingStrategy来定义检测服务器列表策略,ribbon默认提供了SerialPingStrategy,通过序列化方式探测服务器列表。BaseLoadBalancer会启动线程定时执行服务器探测,当IPing实现为DummyPing时,不会启动探测流程。

      ribbon使用IRule来进行服务器路由,用户可以通过实现IRule来定义路由策略,ribbon也提供了一些路由算法( ribbon源码之负载均衡算法)。

      有很多负载均衡算法需要依据服务器的执行状态进行路由,ribbon使用了LoadBalancerStats来存储服务器列表中每个服务器的运行状态(ribbon源码(4) 服务器状态)。LoadBalancerStats不会自动收集服务器状态,需要在执行服务器调用过程时更新LoadBalancerStats中的状态。

      使用ServerListChangeListener来提供用户监听服务器列表变化。使用ServerStatusChangeListener来提供用户监听服务器状态变化。内部也会启动定时器来定时监听所有服务器的存活状态。使用IClientConfig来读取配置信息。

     

    DynamicServerListLoadBalancer

      可以自动动态更新server的负载均衡器,继承BaseLoadBalancer。本质上就是定义了一个定时器,定时执行拉取服务器列表和更新负载均衡器服务器列表。用户可以通过实现ServerListUpdater接口来实现定时器功能;通过实现ServerList接口实现拉去服务器功能;通过实现ServerListFilter接口实现过滤服务器功能。ConfigurationBasedServerList是ribbon提供的一个服务器列表源类,从配置文件中获取服务器列表;PollingServerListUpdater是ribbon提供的一个定时执行类,内部通过ScheduledThreadPoolExecutor实现定时执行。ZoneAffinityServerListFilter过滤掉与客户端不在同一可用区中的服务,除非同一区中没有可用服务,如果当前zone的请求量、熔断比率、服务器存活比如高于指定指标,就不过滤;否则过滤其他的zone。ServerListSubsetFilter该过滤器确保客户端只能看见所有服务列表中的一个固定子集,它也可以周期性的用新服务替换掉子集中低可用的服务,当服务有大量服务器时非常有用,可以减少网络链接。

    ZoneAwareLoadBalancer

       ZoneAwareLoadBalancer以zone为单位,过滤调那些性能不达标的zone,然后从剩下中随机选择一个zone,当选择了zone后再在这个zone中根据设定rule进行路由选择。

  • 相关阅读:
    selenium批量执行脚本操作
    Monkey压力测试操作步骤说明
    loadrunner整体压测执行操作步骤
    selenium3+python3.6爬页面源码的代码
    unittest_API自动化脚本应用
    Python3.7版本unittest框架添加用例的方法
    python3中报错:TypeError: 'range' object doesn't support item deletion
    构建Hadoop集群在线datanode不在线
    Nomodulenamed pip._internal怎么解决
    模拟登陆京东并访问我的订单
  • 原文地址:https://www.cnblogs.com/zhangwanhua/p/7543412.html
Copyright © 2020-2023  润新知