【你好Ribbon】五:Ribbon负载均衡组件服务列表-ServerList

每日一句

努力和收获,都是自己的,与他人无关。最大的成就感,就是一直在朝着自己想要的方向前进

从这篇文章开始进入Ribbon的负载均衡模块的介绍。提到客户端负载 那么对服务列表的获取以及维护是一块很重要的内容,因为这是基础 负载策略是建立在服务列表的基础上。服务列表我们可以通过配置文件配置,当然也可以从Eureka中获取。获取来的服务列表我们也可以根据一定的策略来过滤。今天就来介绍一下最最基础 同时也比较重要的接口ServerList。

ServerList

用于获取服务列表的方法。接口很简单 只有两个需要实现的方法。

    //返回初始状态的服务列表
  	public List<T> getInitialListOfServers();
  	//返回更新过的服务器列表
    public List<T> getUpdatedListOfServers();  

继承关系

在这里插入图片描述
上述的继承图是在SpringCloud2.x环境下类继承图。

  • ConfigurationBasedServerList: 基于读取Archaius配置文件来维护ServerList
  • DiscoveryEnabledNiWSServerList: 从Eureka客户端获取服务器信息的服务器列表类
  • StaticServerList: 静态的服务列表维护类。说白了就是写死的。
  • DomainExtractingServerList: 这是一个代理类 服务列表获取逻辑是由DiscoveryEnabledNiWSServerList来实现,旨在从其服务列表中提取zone,是SpringCloud默认的获取服务列表的类。

上面继承图 是springcloud环境下的类的继承图。可以看到Ribbon提供了ConfigurationBasedServerList 和DiscoveryEnabledNiWSServerList两个实现类。而SpringCloud只是在提供了StaticServerList和DomainExtractingServerList。DomainExtractingServerList是SpringCloud中默认的服务管理类

AbstractServerList

public abstract class AbstractServerList<T extends Server> implements ServerList<T>, IClientConfigAware {   
    public AbstractServerListFilter<T> getFilterImpl(IClientConfig niwsClientConfig) throws ClientException{
        try {
            
            //可以通过NIWSServerListFilterClassName来配置服务过滤器  ZoneAffinityServerListFilter是默认的服务列表过滤器 
            String niwsServerListFilterClassName = niwsClientConfig
                    .getProperty(
                            CommonClientConfigKey.NIWSServerListFilterClassName,
                            ZoneAffinityServerListFilter.class.getName())
                    .toString();

            AbstractServerListFilter<T> abstractNIWSServerListFilter = 
                    (AbstractServerListFilter<T>) ClientFactory.instantiateInstanceWithClientConfig(niwsServerListFilterClassName, niwsClientConfig);
            return abstractNIWSServerListFilter;
        } catch (Throwable e) {
            throw new ClientException(
                    ClientException.ErrorType.CONFIGURATION,
                    "Unable to get an instance of CommonClientConfigKey.NIWSServerListFilterClassName. Configured class:"
                            + niwsClientConfig
                                    .getProperty(CommonClientConfigKey.NIWSServerListFilterClassName), e);
        }
    }
}
  • AbstractServerList 继承IClientConfigAware子类具有获取IClientConfig的能力。
  • 还提供了一个getFilterImpl方法来获取服务列表过滤器 不配置的默认是 ZoneAffinityServerListFilter。可以通过 <clientName>.<nameSpace>.NIWSServerListFilterClassName 属性来配置
  • 自定义的配置可以继承IClientConfigAware来获取IClientConfig

ConfigurationBasedServerList

看名字就知道 这个是基于Configuration配置来获取服务列表的。配置的格式如下:

<clientName>.<nameSpace>.listOfServers= host1:port1,host2:port2

多个服务以英文逗号隔开。

示例:

    IClientConfig config = new DefaultClientConfigImpl();
    config.loadProperties("coredy");
    ConfigurationBasedServerList serverList = new ConfigurationBasedServerList();
    serverList.initWithNiwsConfig(config);
    List<Server> initialListOfServers = serverList.getInitialListOfServers();
    System.out.println(initialListOfServers);

源码:

public class ConfigurationBasedServerList extends AbstractServerList<Server>  {
	private IClientConfig clientConfig;
	//使用这个配置 getInitialListOfServers和getUpdatedListOfServers是一样的
	@Override
	public List<Server> getInitialListOfServers() {
	    return getUpdatedListOfServers();
	}
	@Override
	public List<Server> getUpdatedListOfServers() {
        String listOfServers = clientConfig.get(CommonClientConfigKey.ListOfServers);
        return derive(listOfServers);
	}
	@Override
	public void initWithNiwsConfig(IClientConfig clientConfig) {
	    this.clientConfig = clientConfig;
	}
	protected List<Server> derive(String value) {
	    List<Server> list = Lists.newArrayList();
		if (!Strings.isNullOrEmpty(value)) {
			for (String s: value.split(",")) {
				list.add(new Server(s.trim()));
			}
		}
        return list;
	}
}

源码也很简单 就是从Configuration加载配置的过程。如果对此过程不了解可以参考 你好Archaius专栏文章!

StaticServerList

这个类是SpringCloud提供的一种静态的服务列表。如果我们有需要写死的配置可以使用这个类。但感觉还是概率比较小。

public class StaticServerList<T extends Server> implements ServerList<T> {
	private final List<T> servers;
	public StaticServerList(T... servers) {
		this.servers = Arrays.asList(servers);
	}
	@Override
	public List<T> getInitialListOfServers() {
		return servers;
	}
	@Override
	public List<T> getUpdatedListOfServers() {
		return servers;
	}
}

DiscoveryEnabledNiWSServerList

这个不说了 和Eureka有关 放在后面

ServerList内容到这就结束了,内容比较简单,就是定义了对服务器的获取方式。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值