Author Archive | douba

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-5a0f99ed2bc3c14533807[......]

阅读全文

Tags: , , ,

Comments { 2 }

Netflix源码解析之Eureka:Eureka 服务注册发现接口

本文关注下Eureka作为服务注册发现对外提供的主要操作。

首先关注下netflix eureka server 原生提供的接口。https://github.com/Netflix/eureka/wiki/Eureka-REST-operations?这是对非java的服务使用eureka时可以使用的rest接口。对于java应用,直接使用java的接口就可以

Netxflix 提供的主要操作定义在com.netflix.discovery.EurekaClient中。主要操作有:

eurekaclient_outline

其实现类是 com.netflix.discovery.DiscoveryClient。

Spring cloud中对其进行了封装,定义在org.springframework.cloud.client.discovery.DiscoveryClient中,

spring_cloud_eureka_client

可以[......]

阅读全文

Tags: , , ,

Comments { 2 }