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 ...
随机推荐
- Spring.NET学习笔记6——依赖注入(应用篇)
1. 谈到高级语言编程,我们就会联想到设计模式:谈到设计模式,我们就会说道怎么样解耦合.而Spring.NET的IoC容器其中的一种用途就是解耦合,其最经典的应用就是:依赖注入(Dependeny I ...
- 2018.08.31 bzoj3566: [SHOI2014]概率充电器(概率dp+容斥原理)
传送门 概率dp好题啊. 用f[i]" role="presentation" style="position: relative;">f[i] ...
- hdu-1173(最短距离)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1173 思路:最短距离:就是现将x,y从小到大排序,然后去中间点就行了.(注意:本题答案不唯一) #in ...
- Intelj IDEA的pom.xml显示错误can not reconnect
从GitHub上边down下来的开源项目,报错莫名其妙,后来发现是跟本地hosts文件有关系 hosts文件加上 127.0.0.1 localhost 然后pom文件reload一下就
- 【Unity】2.2 Unity编辑器中的常用菜单项
分类:Unity.C#.VS2015 创建日期:2016-03-26 Unity 5.3.4编辑器共提供了7个主菜单项,这一节主要学习其中的常用项. 一.File 1.基本功能 New Scene:新 ...
- springboot问题,没有主清单属性
在pom.xml中添加 <build> <plugins> <plugin> <groupId>org.apache.maven.plugins< ...
- Java生成HTML文件
实例HTML文件<html> <head> <title>###title###</title> <meta http-equiv="C ...
- 201709013工作日记--Android消息机制HandlerThread
1.首先来看一个常规的handler用法: 在主线程中建立一个handler: private Handler mHandler = new Handler() { @Override public ...
- (KMP)Oulipo -- poj --3461
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=92486#problem/B http://poj.org/problem?id=3461 ...
- (线段树)Balanced Lineup --POJ --3264
链接: 对于POJ老是爆,我也是醉了, 链接等等再发吧! http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82832#problem/G 只 ...