ribbon源码(2) 负载均衡器
负载均衡器对外提供负载均衡的功能,本质上是是维护当前服务的服务器列表和服务器状态,通过负载均衡算法选取合适的服务器地址。
用户可以通过实现ILoadBalancer来实现自己的负载均衡器,ribbon也提供了BaseLoadBalancer、DynamicServerListLoadBalancer、ZoneAwareLoadBalancer三个负载均衡器。

ILoadBalancer
负载均衡器接口,定义了负载均衡器的相关方法。
public interface ILoadBalancer {
/**
* 向负载均衡器添加服务器实体。
*
* @param newServers new servers to add
*/
public void addServers(List<Server> newServers);
/**
* 选择一台Server*/
public Server chooseServer(Object key);
/**
* 将指定Server标记为down
*
* @param server Server to mark as down
*/
public void markServerDown(Server server);/**
* 返回所有启动的服务。*/
public List<Server> getReachableServers();
/**
* 返回所有的服务。*/
public List<Server> getAllServers();
}
BaseLoadBalancer
ribbon实现的基本负载均衡器。本质上BaseLoadBalancer内部维护了当前服务器的服务器列表,BaseLoadBalancer不会自动更新服务器列表。
ribbon会定时去检查服务器列表中服务器的存活情况,内部会启动一个定时器,使用IPing来对服务器状态进行检测,使用IPingStrategy来定义检测策略,然后更新upServerList,并调用相应的监听器。通过实现IPing接口来实现单台服务器探测流程,ribbon默认提供了DummyPing实现;使用IPingStrategy来定义检测服务器列表策略,ribbon默认提供了SerialPingStrategy,通过序列化方式探测服务器列表。BaseLoadBalancer会启动线程定时执行服务器探测,当IPing实现为DummyPing时,不会启动探测流程。
ribbon使用IRule来进行服务器路由,用户可以通过实现IRule来定义路由策略,ribbon也提供了一些路由算法( ribbon源码之负载均衡算法)。
有很多负载均衡算法需要依据服务器的执行状态进行路由,ribbon使用了LoadBalancerStats来存储服务器列表中每个服务器的运行状态(ribbon源码(4) 服务器状态)。LoadBalancerStats不会自动收集服务器状态,需要在执行服务器调用过程时更新LoadBalancerStats中的状态。
使用ServerListChangeListener来提供用户监听服务器列表变化。使用ServerStatusChangeListener来提供用户监听服务器状态变化。内部也会启动定时器来定时监听所有服务器的存活状态。使用IClientConfig来读取配置信息。

DynamicServerListLoadBalancer
可以自动动态更新server的负载均衡器,继承BaseLoadBalancer。本质上就是定义了一个定时器,定时执行拉取服务器列表和更新负载均衡器服务器列表。用户可以通过实现ServerListUpdater接口来实现定时器功能;通过实现ServerList接口实现拉去服务器功能;通过实现ServerListFilter接口实现过滤服务器功能。ConfigurationBasedServerList是ribbon提供的一个服务器列表源类,从配置文件中获取服务器列表;PollingServerListUpdater是ribbon提供的一个定时执行类,内部通过ScheduledThreadPoolExecutor实现定时执行。ZoneAffinityServerListFilter过滤掉与客户端不在同一可用区中的服务,除非同一区中没有可用服务,如果当前zone的请求量、熔断比率、服务器存活比如高于指定指标,就不过滤;否则过滤其他的zone。ServerListSubsetFilter该过滤器确保客户端只能看见所有服务列表中的一个固定子集,它也可以周期性的用新服务替换掉子集中低可用的服务,当服务有大量服务器时非常有用,可以减少网络链接。

ZoneAwareLoadBalancer
ZoneAwareLoadBalancer以zone为单位,过滤调那些性能不达标的zone,然后从剩下中随机选择一个zone,当选择了zone后再在这个zone中根据设定rule进行路由选择。
ribbon源码(2) 负载均衡器的更多相关文章
- ribbon源码(1) 概述
ribbon的核心功能是提供客户端在进行网络请求时负载均衡的能力.主要有以下几个模块: 负载均衡器模块 负载均衡器模块提供了负载均衡能力,详细参见ribbon源码之负载均衡器. 配置模块 配置模块管理 ...
- 【一起学源码-微服务】Ribbon源码五:Ribbon源码解读汇总篇~
前言 想说的话 [一起学源码-微服务-Ribbon]专栏到这里就已经全部结束了,共更新四篇文章. Ribbon比较小巧,这里是直接 读的spring cloud 内嵌封装的版本,里面的各种config ...
- Ribbon源码分析(二)-- 服务列表的获取和负载均衡算法分析
上一篇博客(https://www.cnblogs.com/yangxiaohui227/p/12614343.html)分享了ribbon如何实现对http://product/info/这个链接重 ...
- 读书笔记-Ribbon源码分析
@LoadBalanced注解用来给RestTemplate做标记,以使用负载均衡的客户端来配置. 通过搜索LoadBalancerClient可以发现,LoadBalancerClient是Spri ...
- Spring Cloud Ribbon 源码分析---负载均衡算法
上一篇分析了Ribbon如何发送出去一个自带负载均衡效果的HTTP请求,本节就重点分析各个算法都是如何实现. 负载均衡整体是从IRule进去的: public interface IRule{ /* ...
- ribbon源码分析
对于ribbon的使用我们只需要在RestTemplate的申明上面加上 @LoadBalanced 注解之后那么这个RestTemplate就具有了负载均衡的功能 ribbon是怎么实现这一功能的? ...
- 超详细的Ribbon源码解析
Ribbon简介 什么是Ribbon? Ribbon是springcloud下的客户端负载均衡器,消费者在通过服务别名调用服务时,需要通过Ribbon做负载均衡获取实际的服务调用地址,然后通过http ...
- Netflix Ribbon源码设计错误的证据(附正确示例)
我在之前一篇博客里https://www.cnblogs.com/yangfeiORfeiyang/p/9644254.html 里对Netflix Ribbon的Loadbalancer类源码设计的 ...
- 【一起学源码-微服务】Ribbon 源码一:Ribbon概念理解及Demo调试
前言 前情回顾 前面文章已经梳理清楚了Eureka相关的概念及源码,接下来开始研究下Ribbon的实现原理. 我们都知道Ribbon在spring cloud中担当负载均衡的角色, 当两个Eureka ...
随机推荐
- Java之Annotation(注解)——注解处理器
如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了.使用注解的过程中,很重要的一部分就是创建于使用注解处理器.Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处 ...
- Javascript模块化编程(二):AMD规范 (转)
原文作者: 阮一峰 日期: 2012年10月30日 这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块. (接上文) 七.模块的规范 先想一想,为什么模块很重要? ...
- 彻底搞懂https原理
我终于彻底理解了https原理!!!激动之下,写一篇博客,搞一波分享!!! 本篇博客比较精彩的地方: 思维方式:也是借鉴一位大佬的,写得很棒.https://blog.csdn.net/guolin_ ...
- Ncdu强大的磁盘查看命令
简介 项目地址: https://dev.yorhel.nl/ncdu Ncdu (NCurses Disk Usage) 是一个基于 Ncurses 库的 du 命令的界面.它通过大家熟知的 du ...
- pytest「conftest、pytest参数化、重运行、出测试报告」
文章总览图 一.conftest问题整理: 1.这个conftest.py分路径吗?如果在TestCases下建这个包可以直接用吗? TestCases这里有ModeA和ModeB,想在ModeA或M ...
- Selenium的WebDriver API元素定位中的XPath和CSS
元素的定位和操作是自动化测试的核心部分,其中操作又是建立在定位的基础上的. 浏览器的常规操作 import time from selenium import webdriver # 打开浏览器 dr ...
- neighbor和neigh_modify(转载)
(转载:http://blog.sina.com.cn/s/blog_b48a7ac30102w4mg.html###) 以下取自:http://simulation.haotui.com/viewt ...
- Java 接口简述
Java 接口 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法. 接口并 ...
- RabbitMQ入门指南
消息队列(Message Queue,以下简称MQ)常用于异步系统的数据传递.若不用MQ,我们只能[在应用层]使用轮询或接口回调等方式处理,这在效率或耦合度上是难以让人满意的.当然我们也可以在系统间保 ...
- 深度优先搜索(DFS)解题总结
定义 深度优先搜索算法(Depth-First-Search),是搜索算法的一种.它沿着树的深度遍历树的节点,尽可能深的搜索树的分支. 例如下图,其深度优先遍历顺序为 1->2->4-&g ...