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

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

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

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

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

ribbon的实现的继承图上可以看到除了介绍的基本实现LoadBalancer外,还有DynamicServerListLoadBalancer的实现,可以动态的加载后[......]

阅读全文

Tags: , , , ,

Comments { 1 }

Netflix源码解析之Ribbon:看Spring-cloud怎样使用Ribbon

关注下spring cloud是如何进行客户端负责均衡。 看怎么调用到负载均衡的,怎么定义负载均衡的,然后是怎么实现的?

第一个其实可以不用关心,调用的地方应该很多,找到一个地方来说明怎么调用的即可。 第二个,可以猜下,最主要的应该是一个类似 serviceInstance get(string serviceId)这样的方法吧。 第三个问题,明摆着,使用netflix的ribbon呗。

发起一个调用时,LB对输入的serviceId,选择一个服务实例。

??关键代码看到调用的是一个LoadBalancerClient的choose方法,对一个serviceId,选择一个服务实例。看下LoadBalancerClient是一个接口:

LoadBalancerClient_outline

足够简单,只定义了三个方法,根据一个serviceId,由LB[......]

阅读全文

Tags: , , , ,

Comments { 0 }

Netflix源码解析之Ribbon:看客户端如何使用Ribbon

前面描述了netfix的ribbon基本功能和其实现方式。这里从调用的地方入手跟踪下ribbon使用的过程,了解下ribbon是如何被使用的。

关注下AbstractLoadBalancerAwareClient,一个集成了一个ribbon,因而具备客户端负载均衡功能的客户端抽象父类。下面的com.netflix.niws.client.http.RestClient和org.springframework.cloud.netflix.feign.ribbon.FeignLoadBalancer都是在继承这个抽象类的基础上实现一个有负载均衡功能的客户端。 如SampleApp.java提供的这个例子中,就是使用了RestClient。

调用的入口是com.netflix.client.AbstractLoadBalancerAwareClient.executeWithLoad[......]

阅读全文

Tags: , , , ,

Comments { 1 }

Netflix源码解析之Ribbon:客户端负载均衡器Ribbon的设计和实现

1. LB的基本功能要求

想想一个LB是怎么工作的,不管是硬件的还是软件的,我们要求它有哪些能力,提个最精简的需求清单出来:好像能想到的也就两个吧:

  • ?设置添加和读取后端的服务(器)列表
  • 能从中选择一个服务(器)

Netflix的LoadBalancer也是这样被要求的。通过ILoadBalancer来要求的。

iloadbalancer_outline

可以看到主要有:对应配置后端服务;读取后端服务;标记一个服务不可用;当然最主要的是选择一个后端服务来提供服务。

这是2.1.0版本的方法列表,2.1.3开始版本也就是把getServerList (boolean availableOnly)分成了两个getReachableServers和getAllServers(解释是in favor of the cleaner),一个分成俩,clean了吗,好像一点点。一个是得到所有的后端ser[......]

阅读全文

Tags: , , ,

Comments { 4 }

Netflix源码解析之Eureka:Eureka client 注册过程

记录下eureka client如何将本地服务的注册信息发送到远端的注册服务器eureka server上。不像上文中讲到的get操作,服务需要自己发起读取注册信息来进行自己后续的服务调用。服务注册可以认为是Eureka client自己完成,不需要服务来费心。

实现思路其实也挺简单,在com.netflix.discovery.DiscoveryClient启动的时候,会初始化一个定时任务,定时的把本地的服务配置信息,即需要注册到远端的服务信息自动刷新到注册服务器上。

客户端
1. 在DiscoveryClient中初始化一个InstanceInfoReplicator,其实里面封装了以定时任务。

2. 以initialDelayMs为间隔调用
[crayon-59c52c7a1952b73514149[......]

阅读全文

Tags: , , ,

Comments { 2 }