一 ZoneAwareLoadBalancer在类图中的位置

二 引入原因
DynamicServerListLoadBalancer,采用的是线性轮询的方式来选择调用服务实例,该算法实现简单并没有区域Zone的概念,所以它会把所有实例视为一个Zone下的节点来看待,这样就会周期性地产生跨区域访问的情况,由于跨区域会产生更高的延迟,这些实例主要以防止区域故障实现高可用的目的而不能作为常规访问的实例。所以在多区域部署的情况下会有一定的性能问题。ZoneAwareLoadBalancer可用避免这样的问题。
三 ZoneAwareLoadBalancer源码解读
//下面是父类DynamicServerListLoadBalancer的关键代码
@Override
public void setServersList(List lsrv) {
super.setServersList(lsrv);
List<T> serverList = (List<T>) lsrv;
Map<String, List<Server>> serversInZones = new HashMap<String, List<Server>>();
for (Server server : serverList) {
// make sure ServerStats is created to avoid creating them on hot
// path
getLoadBalancerStats().getSingleServerStat(server);
String zone = server.getZone();
if (zone != null) {
zone = zone.toLowerCase();
List<Server> servers = serversInZones.get(zone);
if (servers == null) {
servers = new ArrayList<Server>();
//按区域Zone分组实例列表
serversInZones.put(zone, servers);
}
servers.add(server);
}
}
setServerListForZones(serversInZones);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//下面三个函数实现的功能是为负载均衡器中的LoadBalancerStats对象创建ZoneStats并放入zoneStatsMap
//集合中,每个Zone对应一个ZoneStats,它用于存储每个Zone的一些状态和统计信息
protected void setServerListForZones(
Map<String, List<Server>> zoneServersMap) {
LOGGER.debug("Setting server list for zones: {}", zoneServersMap);
getLoadBalancerStats().updateZoneServerMapping(zoneServersMap);
}
public void updateZoneServerMapping(Map<String, List<Server>> map) {
upServerListZoneMap = new ConcurrentHashMap<String, List<? extends Server>>(map);
// make sure ZoneStats object exist for available zones for monitoring purpose
for (String zone: map.keySet()) {
ge

最低0.47元/天 解锁文章
2903

被折叠的 条评论
为什么被折叠?



