SpringCloud之Ribbon负载均衡器介绍

AbstractLoadBalance

AbstractLoadBalance是ILoadBalancer接口的抽象实现。在该抽象类中定义了一个关于服务实例的分组枚举类ServerGroup,它包含了三种不同类型。

  • ALL:所有服务实例。
  • STATUS_UP:正常服务实例。
  • STATUS_NOT_UP:停止服务实例。
    另外还实现了一个chooseServer()函数,该函数通过调用接口中的chooseServer(Object key)实现,其中参数为null,表示在选择具体的服务实例的时候忽略key的条件判断。
    最后还定义了两个抽象函数:
  • getServerList(ServerGroup serverGroup):定义了根据分组类型来获取不同的服务实例的列表。
  • getLoadBalancerStats():定义了获取LoadBalancerStats对象的方法,LoadBalancerStats对象用来存储负载均衡器中各个服务实例当前的属性和统计信息。我们可以利用这些信息来观察负载均衡器的运行情况,同事这些信息也是用来制定负载均衡器策略的重要依据。
public abstract class AbstractLoadBalancer implements ILoadBalancer {
    
    public enum ServerGroup{
        ALL,
        STATUS_UP,
        STATUS_NOT_UP        
    }
        
    /**
     * delegate to {@link #chooseServer(Object)} with parameter null.
     */
    public Server chooseServer() {
    	return chooseServer(null);
    }

    
    /**
     * List of servers that this Loadbalancer knows about
     * 
     * @param serverGroup Servers grouped by status, e.g., {@link ServerGroup#STATUS_UP}
     */
    public abstract List<Server> getServerList(ServerGroup serverGroup);
    
    /**
     * Obtain LoadBalancer related Statistics
     */
    public abstract LoadBalancerStats getLoadBalancerStats();    
}

BaseLoadBalancer

BaseLoadBalancer类是Ribbon负载均衡器的基础实现类,在该类中定义了很多关于服务在均衡器相关的基础内容。

  • 定义并维护了两个存储服务实例的server对象的列表。一个用于存储所有服务实例的列表,一个用于存储正常服务的实例列表。
    @Monitor(name = PREFIX + "AllServerList", type = DataSourceType.INFORMATIONAL)
    protected volatile List<Server> allServerList = Collections
            .synchronizedList(new ArrayList<Server>());
    @Monitor(name = PREFIX + "UpServerList", type = DataSourceType.INFORMATIONAL)
    protected volatile List<Server> upServerList = Collections
            .synchronizedList(new ArrayList<Server>());
  • 定义了用来存储负载均衡器各服务实例属性和统计信息的LoadBalancerStats对象。
  • 定义了检车服务实例是否正常服务的IPing对象。在BaseLoadBalancer中默认为null,需要在构造时注入它的具体实现。
  • 定义了检查服务实例操作的执行策略对象IPingStrategy,在BaseLoadBalancer中默认使用了该类中定义的静态内部类SerialPingStrategy实现。
  • 定义了负载均衡的处理规则IRule对象,从BaseLoadBalancer中chooseServer(Object key)的实现源码可以看出,负载均衡器实际将服务实例选择任务委托给了IRule实例中的choose函数来实现,而在这里默认初始化了RoundRobinRule为IRule的实现对象。RoundRobinRule实现了最基本且常用的线性负载均衡规则。
    public Server chooseServer(Object key) {
        if (counter == null) {
            counter = createCounter();
        }
        counter.increment();
        if (rule == null) {
            return null;
        } else {
            try {
                return rule.choose(key);
            } catch (Exception e) {
                logger.warn("LoadBalancer [{}]:  Error choosing server for key {}", name, key, e);
                return null;
            }
        }
    }
  • 启动ping任务:在BaseLoadBalancer的默认构造函数中,会直接启动一个用于定时检查Server是否健康的任务。该任务默认的执行时间是10秒。
  • 实现了ILoadBalancer接口定义的负载均衡器应具备以下一系列基本操作。
    • addServers:想负载均衡器中增加新的服务实例列表,该实现将原本已经维护着的所有服务实例清单allServerList和新传入的服务实例清单newServers都加入到newList中,然后通过调用setServersList函数对newList进行处理,在BaseLoadBalancer中实现的时候会使用新的列表覆盖旧的列表。
    public void addServer(Server newServer) {
        if (newServer != null) {
            try {
                ArrayList<Server> newList = new ArrayList<Server>();

                newList.addAll(allServerList);
                newList.add(newServer);
                setServersList(newList);
            } catch (Exception e) {
                logger.error("LoadBalancer [{}]: Error adding newServer {}", name, newServer.getHost(), e);
            }
        }
    }
  • chooseServer(Object key):挑选一个具体的服务实例。
  • markServerDown(Server server):标记某个服务实例暂停服务。
    public void markServerDown(Server server) {
        if (server == null || !server.isAlive()) {
            return;
        }

        logger.error("LoadBalancer [{}]:  markServerDown called on [{}]", name, server.getId());
        server.setAlive(false);
        // forceQuickPing();

        notifyServerStatusChangeListener(singleton(server));
    }
  • getReachableServers():获取可用的服务实例列表。
    public List<Server> getReachableServers() {
        return Collections.unmodifiableList(upServerList);
    }
  • getAllServers():获取所有的服务实例列表。
    public List<Server> getAllServers() {
        return Collections.unmodifiableList(allServerList);
    }

DynamicServerListLoadBalancer

DynamicServerLIstLoadBalancer类继承于BaseLoadBalancer类,它是对基础负载均衡器的扩展。在该负载均衡器中,实现了服务实例清单在运行期的动态更新能力;同时它还具备了对服务实例清单的过滤功能,也就是说,我们可以通过过滤器来选择性的获取一批服务实例清单。

ServerList

从DynamicServerListLoadBalancer的成员定义中,可以发现增加了一个服务列表的操作对象ServerList<T> serverListImpl。其中泛型T从类名中对于T的限定DynamicServerListBalancer<T extends Server> 可以看出它是一个Server的子类,即代表了一个具体的服务实例的扩展类。

public interface ServerList<T extends Server> {

    public List<T> getInitialListOfServers();
    
    /**
     * Return updated list of servers. This is called say every 30 secs
     * (configurable) by the Loadbalancer's Ping cycle
     * 
     */
    public List<T> getUpdatedListOfServers();   

}
  • getInitialListOfServers():用于获取初始化的服务实例清单。
  • getUpdatedListOfServers():用于获取更新的服务实例清单。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值