微服务架构之均衡组件 Ribbon解析:服务列表
继续上一篇的文章,我们来介绍服务列表是如何获取与实现的。
在RibbonClientConfiguration
中默认配置的ServerList
是ConfigurationBasedServerList
。它是通过配置文件中的listOfServers
属性来获取所有的服务器列表的。
而DomainExtractingServerList
类则是从Eureka
服务注册中心中获取所有的server列表。EurekaRibbonClientConfiguration
是针对Eureka
自定义的Ribbon相关的配置类。包括了DomainExtractingServerList
和我们之前讲解的NIWSDiscoveryPing
。
我们具体看下服务列表的实现。
服务列表
DomainExtractingServerList
的getInitialListOfServers
的实现十分简单,就是直接返回从Eureka
中获取的服务器列表。
@Override
public List<DiscoveryEnabledServer> getInitialListOfServers() {
List<DiscoveryEnabledServer> servers = setZones(this.list
.getInitialListOfServers());
return servers;
}
@Override
public List<DiscoveryEnabledServer> getUpdatedListOfServers() {
List<DiscoveryEnabledServer> servers = setZones(this.list
.getUpdatedListOfServers());
return servers;
}
//添加zone相关的信息
private List<DiscoveryEnabledServer> setZones(List<DiscoveryEnabledServer> servers) {
List<DiscoveryEnabledServer> result = new ArrayList<>();
//判断是否secure和是否使用ip地址
boolean isSecure = this.clientConfig.getPropertyAsBoolean(
CommonClientConfigKey.IsSecure, Boolean.TRUE);
boolean shouldUseIpAddr = this.clientConfig.getPropertyAsBoolean(
CommonClientConfigKey.UseIPAddrForServer, Boolean.FALSE);
for (DiscoveryEnabledServer server : servers) {
result.add(new DomainExtractingServer(server, isSecure, shouldUseIpAddr,
this.approximateZoneFromHostname));
}
return result;
}
服务列表过滤
ServerListFilter
接口定义了可根据配置去过滤或者根据特性动态获取符合条件的server列表的方法,代码如下:
/**
* 这个接口运行过滤候选的server
*/
public interface ServerListFilter<T extends Server> {
public List<T> getFilteredListOfServers(List<T> servers);
}
ZonePreferenceServerListFilter
是默认的ServerListFilter
实现,它会优先选择本地的zone。
public List<Server> getFilteredListOfServers(List<Server> servers) {
List<Server> output = super.getFilteredListOfServers(servers);
if (this.zone != null && output.size() == servers.size()) {
List<Server> local = new ArrayList<>();
// 遍历整个server列表,只添加和本地zone相同的server
for (Server server : output) {
if (this.zone.equalsIgnoreCase(server.getZone())) {
local.add(server);
}
}
if (!local.isEmpty()) {
return local;
}
}
return output;
}
Ribbon
的ServerList
是定义生成server列表的接口,用来通过各种途径获取负载均衡中的所有server列表。
小结
在RibbonClientConfiguration
中默认配置的ServerList
是ConfigurationBasedServerList
。它是通过配置文件中的listOfServers
属性来获取所有的服务器列表的。
- 点赞
- 收藏
- 关注作者
评论(0)