资讯专栏INFORMATION COLUMN

sping-cloud-ribbon原理解析

MartinHan / 2641人阅读

摘要:是一个客户端负载均衡器,它可以很好地控制和客户端的行为。根据响应时间分配一个,响应时间越长,越小,被选中的可能性越低。

Ribbon是一个客户端负载均衡器,它可以很好地控制HTTP和TCP客户端的行为。Feign已经默认使用了Ribbon(参考文章)

一、先来看看ribbon的几个核心类

1、IClientConfig 默认实现类DefaultClientConfigImpl,主要用来配置ribbon客户端的相关属性配置

2、ServerListUpdater默认实现类PollingServerListUpdater,主要负责动态更新服务器列表

start方法调用后会启动一个定时任务,延时1s开始执行,以每30s的时间间隔周期执行

周期时间间隔可以通过ribbon.ServerListRefreshInterval=1000或者ribbonClientName.ribbon.ServerListRefreshInterval=1000来设置

start方法的启动由DynamicServerListLoadBalancer初始化的时候执行调用

3、ServerList获取服务器列表

默认实现类ConfigurationBasedServerList,默认是从配置文件取服务器列表,这样配置[ribbonClinetName].ribbon.listOfServers=xxx,xxx

ConsulServerList引入consul作服务发现的实现类,主要负责获取注册中心的服务器列表

备注:可以通过配置来扩展自己的ServerList实现,像这样:[ribbonClient].ribbon.NIWSServerListClassName=类名

4、ServerListFilter服务器列表过滤器

默认实现类ZonePreferenceServerListFilter主要根据分区来过滤服务器列表

HealthServiceServerListFilter引入consul服务发现的实现类,主要负责过滤consul健康检查通过的服务器列表(在ConsulServerList中会获取所有的服务器列表,包括健康检查没有通过的服务器)

备注:可以通过配置来扩展自己的ServerList实现,像这样[ribbonClient].ribbon.NIWSServerListFilterClassName=类名

5、IPing检查服务器是否或者

默认实现DummyPing,这是一个假的检测着,永远返回是true

ConsulPing,引入consul服务发现的实现类,主要根据consul返回的checks参数来判断服务器是否活着,跟HealthServiceServerListFilter的过滤判断一样

备注:可以通过配置来扩展自己的ServerList实现,像这样:[ribbonClient].ribbon.NFLoadBalancerPingClassName=类名

6、IRule负载均衡选择器

默认实现ZoneAvoidanceRule,复合判断server所在区域的性能和server的可用性选择server

RandomRule:随机选择一个server

RoundRobinRule:roundRobin方式轮询选择server

RetryRule:对选定的负载均衡策略机上重试机制。

WeightedResponseTimeRule:根据响应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低。

AvailabilityFilteringRule:过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值)

BestAvailableRule:选择一个最小的并发请求的server

7、ILoadBalancer负载均衡总控制器,默认实现类ZoneAwareLoadBalancer,其启动了整个负载均衡客户端

可以通过配置来扩展自己的ServerList实现,像这样:[ribbonClient].ribbon.NFLoadBalancerClassName=类名

负载均衡器启动时序图:

初始化时首先会初始化一个定时任务,每隔30s执行一次,缓存里面会保存所有从注册中心获取实例列表allServerList和经过ping成功的实例列表upServerList,但是负载均衡的时候拿到的列表是allServerList而非upServerList,不明白这个ping的意义在哪里

启动一个定时任务,定时从注册中心拉取服务列表,每个30s执行一次

初始化获取服务列表,拉取到的服务列表经过ServiceFilter过滤后保存在缓存里面

当客户端发起调用的时候会调用ILoadBalancer的chooseServer方法,根据IRule的负载均衡算法选择一个实例返回给调用者.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76593.html

相关文章

  • 浏览器工作原理整理

    摘要:每种可被解析的格式必须具有由词汇及语法规则组成的特定的文法,称为上下文无关文法。解析解析器,每个标识都有特定的正则进行解析。开发者可以将脚本标识为,以使其不阻塞文档解析,并在文档解析结束后执行。 浏览器组成 用户界面-地址栏、按钮之类的 浏览器引擎-用来查询及操作渲染引擎的接口 渲染引擎-显示请求的内容 网络-进行网络请求 ui后端-用来沪指选择框、对话框的基本组件 js解析器 数据...

    hqman 评论0 收藏0
  • 浏览器工作原理整理

    摘要:每种可被解析的格式必须具有由词汇及语法规则组成的特定的文法,称为上下文无关文法。解析解析器,每个标识都有特定的正则进行解析。开发者可以将脚本标识为,以使其不阻塞文档解析,并在文档解析结束后执行。 浏览器组成 用户界面-地址栏、按钮之类的 浏览器引擎-用来查询及操作渲染引擎的接口 渲染引擎-显示请求的内容 网络-进行网络请求 ui后端-用来沪指选择框、对话框的基本组件 js解析器 数据...

    Dionysus_go 评论0 收藏0
  • CDN工作原理

    摘要:通过以上四个步骤,浏览器完成从用户处接收用户要访问的域名到从域名服务主机处获取数据的整个过程。概念解析指别名记录也被称为规范名字可以理解为对域名设置别名。详细可以参考一些名词解释 传统的网络访问形式为: showImg(http://segmentfault.com/img/bVcqjG); 由上图可见,用户访问未使用CDN缓存网站的过程为: 用户向浏览器提供要访问的域名; 浏...

    zhonghanwen 评论0 收藏0
  • 【进阶3-5期】深度解析 new 原理及模拟实现

    摘要:使用指定的参数调用构造函数,并将绑定到新创建的对象。由构造函数返回的对象就是表达式的结果。情况返回以外的基本类型实例中只能访问到构造函数中的属性,和情况完全相反,结果相当于没有返回值。 定义 new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。 ——(来自于MDN) 举个栗子 function Car(color) { this.color = co...

    Baaaan 评论0 收藏0

发表评论

0条评论

MartinHan

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<