spring cloud ribbon源码解析(二)
在上一篇文章中主要梳理了ribbon的执行过程,这篇主要讲讲ribbon的负载均衡,ribbon的负载均衡是通过ILoadBalancer来实现的,对ILoadBalancer有以下几个类
1、AbstractLoadBalancer
AbstractLoadBalancer是对ILoadBalancer的具体实现,通过枚举类定义了ALL:所有服务、STATUS_UP正常服务、STATUS_NOT_UP停止的服务。通过getServerList传入不同的分组获取不同的服务列表。
2、BaseLoadBalancer
BaseLoadBalancer继承AbstractLoadBalancer,是ribbon负载均衡的基础实现类,定义并维护了两个服务实例列表,一个是所有服务,一个维护了正常的服务,定义了检查服务是否正常的IPing,定义了负载均衡的处理规则IRule,执行策略IPingStrategy。IPing的默认执行间隔为10秒。
实现了ILoadBalancer的方法:
- addServers向负载均衡加入新的服务实例
- markServerDown标记服务实例不可用
- getReachableServers获取可用的服务实例
- getAllServers获取所有服务实例
3、DynamicServerListLoadBalancer
DynamicServerListLoadBalancer是对BaseLoadBalancer的扩展,实现了服务实例运行中动态更新的能力,同时也具有对服务实例过滤的功能
- 更新服务实例
进入serverListUpdater服务更新器,其中定义了一些控制和获取信息的操作
- 过滤服务实例
4、ZoneAwareLoadBalancer
ZoneAwareLoadBalancer是对DynamicServerListLoadBalancer的扩展,在之前几个负载均衡类中没有重写chooseServer,都是使用BaseLoadBalancer的RoundRobbinRule,采用轮询的方式,并没有zone的概念,这样会导致跨区域的时候导致延迟,产生性能问题,ZoneAwareLoadBalancer则可以避免这个问题。
- 当zone小于等于1还是按原来的方式,只有大于1才会执行接下来的策略;
- 调用createSnapshot为所有区域创建快照;
- 使用getAvailableZones获取可用区域;
- randomChooseZone随机选择某个区域;
- 区域确定后获取到负载均衡器,并调用chooseServer来选择具体服务实例。
spring cloud ribbon源码解析(二)的更多相关文章
- spring cloud ribbon源码解析(一)
我们知道spring cloud中restTemplate可以通过服务名调接口,加入@loadBalanced标签就实现了负载均衡的功能,那么spring cloud内部是如何实现的呢? 通过@loa ...
- Feign 系列(05)Spring Cloud OpenFeign 源码解析
Feign 系列(05)Spring Cloud OpenFeign 源码解析 [TOC] Spring Cloud 系列目录(https://www.cnblogs.com/binarylei/p/ ...
- api网关揭秘--spring cloud gateway源码解析
要想了解spring cloud gateway的源码,要熟悉spring webflux,我的上篇文章介绍了spring webflux. 1.gateway 和zuul对比 I am the au ...
- Spring Cloud Ribbon 源码分析---负载均衡算法
上一篇分析了Ribbon如何发送出去一个自带负载均衡效果的HTTP请求,本节就重点分析各个算法都是如何实现. 负载均衡整体是从IRule进去的: public interface IRule{ /* ...
- Spring Cloud Ribbon源码分析---负载均衡实现
上一篇结合 Eureka 和 Ribbon 搭建了服务注册中心,利用Ribbon实现了可配置负载均衡的服务调用.这一篇我们来分析Ribbon实现负载均衡的过程. 从 @LoadBalanced入手 还 ...
- Spring Security 解析(七) —— Spring Security Oauth2 源码解析
Spring Security 解析(七) -- Spring Security Oauth2 源码解析 在学习Spring Cloud 时,遇到了授权服务oauth 相关内容时,总是一知半解,因 ...
- 十、Spring之BeanFactory源码分析(二)
Spring之BeanFactory源码分析(二) 前言 在前面我们简单的分析了BeanFactory的结构,ListableBeanFactory,HierarchicalBeanFactory,A ...
- Mybatis源码解析(二) —— 加载 Configuration
Mybatis源码解析(二) -- 加载 Configuration 正如上文所看到的 Configuration 对象保存了所有Mybatis的配置信息,也就是说mybatis-config. ...
- spring boot @Value源码解析
Spring boot 的@Value只能用于bean中,在bean的实例化时,会给@Value的属性赋值:如下面的例子: @SpringBootApplication @Slf4j public c ...
随机推荐
- 记录pytorch的几个问题
1.Variable里面的creator没有,网上博客上面说有,奇怪??
- 用Notepad++在文本文件里快速在每行头尾都加上指定的内容(转载)
- 日历时间选择控件---3(支持ie、火狐)
效果展示: 源代码: <script language=javascript ><!--/* 调用方法:不能用onfocus,要用onclick <input onclic ...
- 基础的linux学习
学习了这几个命令分享一下: 文本文件内搜索数据 grep -n -e pattern1 -e pattern2 file1 -n 搜索到的数据显示行号展示 -e pattern1 多个匹配模式下可以通 ...
- 201709021工作日记--Volley源码详解(五)
学习完了CacheDispatcher这个类,下面我们看下NetworkDispatcher这个类的具体细节,先上代码: /** * 提供一个线程执行网络调度的请求分发 * Provides a th ...
- C语言中线程和进程的区别
线程是指进程内的一个执行单元也是进程内的可调度的实体,与进程的区别 1) 调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位 2) 并发性:不仅进程之间可以并发执行,同一个进程之间的多个线 ...
- OpenNI检测不到Kinect Camera和Kinect Audio了
?? 只有检测到了Kinect Motor(马达)而马达是微软开发的. 那么PrimeSense出了什么问题呢? 我的系统是Win7 64位的. 是由于电源供电出错.
- (二叉树)Elven Postman -- HDU -- 54444(2015 ACM/ICPC Asia Regional Changchun Online)
http://acm.hdu.edu.cn/showproblem.php?pid=5444 Elven Postman Time Limit: 1500/1000 MS (Java/Others) ...
- HDU6029 Happy Necklace 2017-05-07 19:11 45人阅读 评论(0) 收藏
Happy Necklace Time Limit: ...
- POJ 2462 / HDU 1154 Cutting a Polygon
就这样莫名其妙的过了,不过可以确定之前都是被精度卡死了.真心受不了精度问题了. 题意:一条直线在一个不规则多边形内的长度,包括边重合部分. 首先计算出所有交点,然后按想x,y的大小进行二级排序. 然后 ...