springcloudnetflixribbonLoadBalance之ServerListFilter
用处: 筛选出合适的server 。
拿ZonePreferenceServerListFilter 说事,因为实际使用的是这个。
注入bean, 在RibbonClientConfiguration 定义。
@Bean@ConditionalOnMissingBean@SuppressWarnings("unchecked")public ServerListFilter<Server> ribbonServerListFilter(IClientConfig config) {
if (this.propertiesFactory.isSet(ServerListFilter.class, name)) {
return this.propertiesFactory.get(ServerListFilter.class, config, name);
}
ZonePreferenceServerListFilter filter = new ZonePreferenceServerListFilter();
filter.initWithNiwsConfig(config);
return filter;
}
@Data@EqualsAndHashCode(callSuper = false)public class ZonePreferenceServerListFilter extends ZoneAffinityServerListFilter<Server> {
private String zone;
@Override
public void initWithNiwsConfig(IClientConfig niwsClientConfig) {
super.initWithNiwsConfig(niwsClientConfig);
if (ConfigurationManager.getDeploymentContext() != null) {
this.zone = ConfigurationManager.getDeploymentContext().getValue(
ContextKey.zone);
}
}
@Override
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>();
for (Server server : output) {
if (this.zone.equalsIgnoreCase(server.getZone())) {
local.add(server);
}
}
if (!local.isEmpty()) {
return local;
}
}
return output;
}
}
优先选择zone相同的server 。 网上有理解说zone 指的是机房,优先调用同机房server 。
ZoneAffinityServerListFilter 不太好理解, 基于ZoneStats和ServerStats做出选择。
ServerStats 见博客 https://my.oschina.net/qidis/blog/4386690 , 是Filter 和 Rure 的基础。
以上是 springcloudnetflixribbonLoadBalance之ServerListFilter 的全部内容, 来源链接: utcz.com/z/518891.html