每日一句
努力和收获,都是自己的,与他人无关。最大的成就感,就是一直在朝着自己想要的方向前进
目录
从这篇文章开始进入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内容到这就结束了,内容比较简单,就是定义了对服务器的获取方式。