Netflix源码解析之Ribbon:负载均衡器通过Eureka获取动态后端服务列表

Ribbon是一种客户端的负载均衡,本质上是跑在服务消费者的进程里。服务消费者要访问服务时,通过ribbon向一个服务注册的列表查询,然后以配置的负载均衡策略选择一个后端服务发起请求。

前面ribbon的实现,讲到LB的定义的两个主要方法,分别是后端服务相关的调用:

在netflix中这个服务注册列表其实就是eureka服务端集中管理的注册服务列表。获取这个列表应该就是是通过eureka的client来完成的。

也就是ribbon中应该在某个地方集成了eureka client来维护服务列表。这里尝试追踪细这个过程,确认下猜想。

ribbon的实现的继承图上可以看到除了介绍的基本实现LoadBalancer外,还有DynamicServerListLoadBalancer的实现,可以动态的加载后端服务列表。正如名所示,可以动态的加载后端的服务列表。

DynamicServerListLoadBalancer中使用一个ServerListRefreshExecutorThread任务线程定期的更新后端服务列表。

其实是通过com.netflix.loadbalancer.ServerList.getUpdatedListOfServers() 方法加载后端服务列表。ServerList这个接口正是用来获取加载后端服务列表。(这么一个名词来做动作,有一点点别扭!)可以看到有这么多加载的方式。

netflix_ribbon_serverlis

看到ConfigurationBasedServerList是从配置中(可以是通过Archaius这样的集中配置)加载的。 而DiscoveryEnabledNIWSServerList这个实现中包含DiscoveryEnabled猜想应该就是服务发现框架里的服务吧。看进去果然是通过eureka client 从eureka server获取服务列表进而在ribbon中可以动态的加载。 从声明

能看到管理的服务不是一般的服务,是DiscoveryEnabledServer的服务。观察List<DiscoveryEnabledServer> com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList.obtainServersViaDiscovery() 的实现可以了解整个过程。

可以看到就是通过一个com.netflix.discovery.EurekaClient作为一个句柄来获取eureka中注册的服务列表。获取活的服务,并根据instanceInfo 构造成ribbon需要的DiscoveryEnabledServer并加到服务列表中。

完。

?

原创文章。为了维护文章的版本一致、最新、可追溯,转载请注明: 转载自idouba

本文链接地址: Netflix源码解析之Ribbon:负载均衡器通过Eureka获取动态后端服务列表


, , , ,

Trackbacks/Pingbacks

  1. Netflix源码解析之Ribbon:Ribbon的区域亲和性(Zone Affinity) | idouba - 2016年4月14日

    […] 前面文章介绍了通过ribbon集成eurekaclient来获取注册的服务列表。 其实仔细观察DynamicServerListLoadBalancer更新server的方法updateListOfServers会发现,在动态的从erueka 获取注册服务器后,还会用一个filter对得到的server列表再进行过滤。这个filter从配置获取,如果没有,默认是ZoneAffinityServerListFilter。根据配置会选择和服务消费者在一个zone的服务(术语区域感知,Zone Affinity),这样一般可以降低延迟。 […]

发表评论