Archive | microservice RSS feed for this section

Netflix源码解析之Ribbon:Ribbon的区域亲和性(Zone Affinity)

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

 

检查server的zone属性,只是选择本区域的server。

根据配置会选择和服务消费者在一个zo[......]

阅读全文

Tags: , , ,

Comments { 0 }

Netflix源码解析之Ribbon:负载均衡策略的定义和实现

上篇文章说到LB是通过负载均衡策略来实现后端服务的选择的。

Ribbon负载均衡策略定义

IRule其实就只做了一件事情Server choose(Object key),可以看到这个功能是在LB中定义(要求)的,LB把这个功能委托给IRule来实现。不同的IRule可以向LB提供不同的负载均衡算法。

com.netflix.loadbalancer包下面的提供了常用的几种策略。有RoundRobinRule、RandomRule这样的不依赖于Server运行状况的策略,也有AvailabilityFilteringRule、WeightedResponseTimeRule等多种基于收集到的Server运行状况决策的策略。判断运行状况时有,判断单个server的,也有判断整个zone的,适用于各种不同场景需求。[......]

阅读全文

Tags: , , , ,

Comments { 2 }

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 }