目录如下: 从XXXAutoConfig来追溯Ribbon初始化过程 ZoneAwareLoadBalancer原理分析 说明 原创不易,如若转载 请标明来源!...ZoneAwareLoadBalancer原理分析 我们上面已经知道了Ribbon的大致流程,这里我们可以看到默认的ILoadBalancer 为ZoneAwareLoadBalancer,还是回到之前...execute(serviceId, ribbonServer, request); } 这里第一行代码会获取一个ILoadBalancer 我们其实已经知道了,这里默认的ILoadBalancer 为ZoneAwareLoadBalancer...上面最后图片可以看到,实例化出来的instance是ZoneAwareLoadBalancer , 这个类继承自DynamicServerListLoadBalancer,顺带看下类结构: ?...到了这里就算是分析完了,再深究ZoneAwareLoadBalancer 就到了和Eureka整合相关的了,这一部分放到下一讲继续讲解了。 总结 用一张图做最后的总结: ?
(ILoadBalancer)this.propertiesFactory.get(ILoadBalancer.class, config, this.name) : new ZoneAwareLoadBalancer...serverListUpdater)); } 我们知道,只要没自定义(通过@RibbonClient注解),或者配置(通过ribbon.NFLoadBalancerClassName),默认就是ZoneAwareLoadBalancer...ZoneAwareLoadBalancer的选择Server源码: if (!...Zone avoidance logic is not invoked."); return super.chooseServer(key); } 我们来实现我们自己的LoadBalancer,扩展ZoneAwareLoadBalancer...zoneThreadLocal.remove(); } } } 配置类(注意不能通过文件配置实现类,走IClientConfigAware,上面源代码里说明了原因,ZoneAwareLoadBalancer
均衡策略接口 IPing DummyPing 检查服务可用性接口 ServerList ConfigurationBasedServerList 获取服务列表接口 ILoadBalancer ZoneAwareLoadBalancer...(ILoadBalancer)this.propertiesFactory.get(ILoadBalancer.class, config, this.name) : new ZoneAwareLoadBalancer...即【ZoneAwareLoadBalancer】的实现。实现的原理图为: 在【ZoneAwareLoadBalancer】里面完成了服务地址动态获取和服务地址更新定时任务的配置。...首先会进入【ZoneAwareLoadBalancer】的构造方法中 public ZoneAwareLoadBalancer(IClientConfig clientConfig, IRule rule
默认使用的是ZoneAwareLoadBalancer,这是spring-cloud-netflix-ribbon下的类。...ZoneAwareLoadBalancer是DynamicServerListLoadBalancer的子类,DynamicServerListLoadBalancer封装了服务更新逻辑。 ?...,因此getLoadBalancer方法返回的是ZoneAwareLoadBalancer。...ZoneAwareLoadBalancer的chooseServer方法: @Override public Server chooseServer(Object key) {...return new ZoneAwareLoadBalancer(config, rule, ping, serverList, serverListFilter, serverListUpdater
从这里可以看到,RibbonClientConfiguration类中定义了RibbonLoadBalancerContext这个bean和ZoneAwareLoadBalancer这个bean的初始化...,RibbonLoadBalancerContext包装了ZoneAwareLoadBalancer。...chooseServer方法在ZoneAwareLoadBalancer的父类BaseLoadBalancer中,代码如下: public Server chooseServer(Object key)...从eureka拉取ServerList 从上节的介绍中我们看到,获取server实际上是从ZoneAwareLoadBalancer的getAllServers,这个方法在它的父类BaseLoadBalancer...聊聊rule 上面讲chooseServer时我们知道,代码在ZoneAwareLoadBalancer的父类BaseLoadBalancer中,代码如下: public Server chooseServer
获取到对应的 ILoadBalancer 接口,但这个接口的话,会在 RibbonClientConfiguration 类中,通过 @Bean 进行初始化,所以 ILoadBalancer 对应的实现类是 ZoneAwareLoadBalancer...在构建 ZoneAwareLoadBalancer 的时候,会调用 restOfInit 方法,这个方法中调用的updateListOfServers方法就是获取注册表的方法,这个方法主要是靠 ServerImpl...去执行而Server是在创建 ZoneAwareLoadBalancer 实例的时候从构造方法中传入的,我们可以从EurekaRibbonClientConfiguration 类中发现会对 ServerList...默认的话,在创建 ZoneAwareLoadBalancer 的时候,会传入一个 IPing 组件,它是在 org.springframework.cloud.netflix.ribbon.eureka...在这检查的方法调用的话,主要是在创建 ZoneAwareLoadBalancer 的时候,通过调用父类 BaseLoadBalancer 的 initWithConfig 方法,初始化了一个 PingTask
---- ZoneAwareLoadBalancer 它是最强王者:具有zone区域意识的负载均衡器。...比如你华北区域的服务A调用华南区域的服务B,就会延迟较大,很容易造成超时 ---- 成员属性 ublic class ZoneAwareLoadBalancer extends...因此ZoneAwareLoadBalancer重写了setServerListForZones()方法。...ZoneAwareLoadBalancer: BaseLoadBalancer getLoadBalancer(String zone) { zone = zone.toLowerCase...---- 改进版的chooseServer() ZoneAwareLoadBalancer: @Override public Server chooseServer(Object key
serverListUpdater); } 棕色部分的代码是去application.yml属性值取, 如果有特别指定使用哪个ILoadBalancer类, 那么优先使用配置中的, 如果配置没有, 则使用new ZoneAwareLoadBalancer...好了, 我们找到这里就可以了, 先不看ZoneAwareLoadBalancer的具体实现....而在上一步,我们知道这个LoadBalancer的实现类是ZoneAwareLoadBalancer, 所以, 我们可以直接到ZoneAwareLoadBalancer里面找到chooseServer方法了...应该是有某个地方传入了这个参数, 或者通过某个参数计算得到了服务列表. ---> 这时我们也不知道在哪里, 那就看看构造方法吧, 看谁的构造方法呢, 负载均衡器的构造方法 前面已经知道负载均衡器使用的是ZoneAwareLoadBalancer..., 调用了父类的构造方法 public ZoneAwareLoadBalancer(IClientConfig clientConfig, IRule rule,
serviceId).getMetadata(server)); return execute(serviceId, ribbonServer, request); } 这里的loadBalancer默认是ZoneAwareLoadBalancer...这里的奥秘就在ZoneAwareLoadBalancer中。...public ZoneAwareLoadBalancer(IClientConfig clientConfig, IRule rule, IPing...serverListUpdater) { super(clientConfig, rule, ping, serverList, filter, serverListUpdater); } 在ZoneAwareLoadBalancer
ZoneAwareLoadBalancer ZoneAwareLoadBalancer是DynamicServerListLoadBalancer的子类,ZoneAwareLoadBalancer的出现主要是为了弥补...ZoneAwareLoadBalancer重写了setServerListForZones方法,该方法在其父类中的功能主要是根据区域Zone分组的实例列表,为负载均衡器中的LoadBalancerStats
* @return server chosen */ public Server chooseServer(Object key); ZoneAwareLoadBalancer.../com/netflix/loadbalancer/ZoneAwareLoadBalancer.java /** * Load balancer that can avoid a zone as a...* @author awang * * @param */ public class ZoneAwareLoadBalancer extends...ZoneAwareNIWSDiscoveryLoadBalancer.enabled默认为true 如果关闭这里ZoneAwareNIWSDiscoveryLoadBalancer,或者只有单个zone的话,则走super.chooseServer(key) ZoneAwareLoadBalancer
进行管理 return new ZoneAwareLoadBalancer(config, rule, ping, serverList, serverListFilter, serverListUpdater...); } catch (NoSuchBeanDefinitionException e) { // ignore } return null; } 此时获取到的负载均衡器类型为ZoneAwareLoadBalancer...hint : "default"); } 通过上面的分析,我们知道此事客户端负载均衡器的类型为ZoneAwareLoadBalancer: DynamicServerListLoadBalancer...ZoneAwareLoadBalancer可用避免这样的问题。...ZoneAwareLoadBalancer会将得到的可用服务列表按照zone进行分组: ZoneAwareLoadBalancer的chooseServer方法实现如下: @Override
config = new DefaultClientConfigImpl(namespace); config.loadProperties(serviceName); ZoneAwareLoadBalancer...ruleDefinition.getPingIntervalSeconds()); } return loadBalancer; } public ZoneAwareLoadBalancer... getLoadBalancer(IClientConfig config, IPing ping, IRule rule){ ZoneAwareLoadBalancer
config = new DefaultClientConfigImpl(namespace); config.loadProperties(serviceName); ZoneAwareLoadBalancer...loadBalancer.setPingInterval(ruleDefinition.getPingIntervalSeconds()); } return loadBalancer; } public ZoneAwareLoadBalancer... getLoadBalancer(IClientConfig config, IPing ping, IRule rule){ ZoneAwareLoadBalancer<
com.netflix.loadbalancer.ILoadBalancer; import com.netflix.loadbalancer.RandomRule; import com.netflix.loadbalancer.ZoneAwareLoadBalancer...ClientFactory.getNamedConfig(clientName); ILoadBalancer lb = ClientFactory.getNamedLoadBalancer(clientName); ZoneAwareLoadBalancer...zb = (ZoneAwareLoadBalancer) lb; zb.setRule(new RandomRule()); return LBClient.create(lb, config
com.netflix.client.http.HttpResponse; import com.netflix.config.ConfigurationManager; import com.netflix.loadbalancer.ZoneAwareLoadBalancer...System.out.println("Status for URI:" + response.getRequestedURI() + " is :" + response.getStatus()); } ZoneAwareLoadBalancer...lb = (ZoneAwareLoadBalancer) client.getLoadBalancer(); System.out.println(lb.getLoadBalancerStats())
这里,我们只看默认的ZoneAwareLoadBalancer相关的 AbstractLoadBalancer.java public abstract class AbstractLoadBalancer...利用这些元素实现服务实例列表的更新 ZoneAwareLoadBalancer.java ZoneAwareLoadBalancer则是进一步增加了对于Zone的感知。
: ZoneAwareLoadBalancer是DynamicServerListLoadBalancer的子类所以会进入到子类方法中: com.netflix.loadbalancer.ZoneAwareLoadBalancer...ZoneAwareLoadBalancer 在DynamicServerListLoadBalancer中因为没有chooseServer方法,所以会继续往上找到: com.netflix.loadbalancer.BaseLoadBalancer
return this.propertiesFactory.get(ILoadBalancer.class, config, name); } return new ZoneAwareLoadBalancer...实际上是在ZoneAwareLoadBalancer的父类DynamicServerListLoadBalancer中进行了重新的赋值并且执行了定时任务进行更新。
name)) { return this.propertiesFactory.get(ILoadBalancer.class, config, name); } return new ZoneAwareLoadBalancer...实际上是在ZoneAwareLoadBalancer的父类DynamicServerListLoadBalancer中进行了重新的赋值并且执行了定时任务进行更新。
领取专属 10元无门槛券
手把手带您无忧上云