说的多,也要做的多,这样才踏实多。
1.基础知识2.Netflix Ribbon主要组件2.1 ServerList 服务列表2.2 ServerListFilter服务筛选2.3 ServerListUpdater 服务列表的更新2.4 IPing 服务存活检查2.5 IRule 根据算法选择一个服务2.6 ILoadBalancer:统筹者,总管2.7 配置组件组合方式3.SC-Ribbon主要组件(脱离Eureka)3.1 (配置)默认的配置RibbonClientConfiguration3.2 (配置)自定义配置3.2.1 注解式配置类3.2.1 配置文件里配置:3.3 (使用) SpringClientFactory3.4 (使用) LoadBalancerClient3.SC-Ribbon与eureka一起使用又发生了什么4.Resttemplate 如何具有负载均衡能力5.总结
1.基础知识
首先要明白一个基础知识点:
- Netfix公司开源了一系列微服务组件。项目地址github.com/Netflix。里面有
eureka
,Ribbon
等等 - SpringCloud 集成了Netfix开源的套件的几个套件,也组成了一个项目,项目地址github.com/spring-clou…。我们熟悉 eureka,ribbon就在这里。
- Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法
- Spring Cloud Ribbon模块是
封装
了Netflix公司开发的这个Ribbon项目。
也就是说
- Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡工具。
- 核心功能是在Netflix Ribbon项目中
本文基于Brixton版本,springboot环境下直接看的源码
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Brixton.SR4</version> <type>pom</type> <scope>import</scope> </dependency>ml
2.Netflix Ribbon主要组件
先从Netflix Ribbon
项目的角度去看
2.1 ServerList 服务列表
存储服务列表,也就是被负载均衡的对象
主要实现
- ConfigurationBasedServerList: 静态服务列表,也就是我们通常所说的写死,项目启动前配置好。
- DiscoveryEnabledNIWSServerList:动态服务列表,从
Eureka Client
中获取服务列表。
2.2 ServerListFilter服务筛选
筛选特定条件的服务列表,对ServerList服务器列表进行二次过滤
主要实现
:
- AbstractServerListFilter
负责从负载均衡器中过滤出当前可用的服务器列表的类 - ZoneAffinityServerListFilter: 过滤掉所有的不和客户端在相同zone的服务(注意:如果和客户端相同的zone不存在,才不过滤不同zone有服务)
- ZonePreferenceServerListFilter:
- ServerListSubsetFilter
2.3 ServerListUpdater 服务列表的更新
定义关于更新动作,根据策略执行更新操作,更新ServerList列表,一般用于动态ServerList
主要实现
:
- PollingServerListUpdater
默认的实现策略。此对象会启动一个定时线程池,定时执行更新策略 - EurekaNotificationServerListUpdater
当收到缓存刷新的通知,会更新服务列表。
2.4 IPing 服务存活检查
检查一个服务是否存活,
主要实现
:
- DummyPing : 总是认为存活
- NoOpPing:什么都不做
- PingConstant:通过配置参数设置指定服务器存活状态
- NIWSDiscoveryPing: 如果服务实例在本地的Eureka缓存中存在,则返回true(默认配置)。ribbon-eureka包中提供的类,结合eureka使用时,如果Discovery Client在线,则认为心跳检测通过
- PingUrl:用HttpClient调用服务的一个URL,如果调用成功,则认为本次心跳成功,表示此服务活着
IPing检查的是当个服务的存活性。
IPingStrategy
:服务列表检查策略接口,
唯一实现:SerialPingStrategy
:采用线性遍历的策略方式,使用IPing检查每个服务的存活性。
2.5 IRule 根据算法选择一个服务
根据算法中从服务列表中选取一个要访问的服务
主要实现
:
- RandomRule:随机算法
- RoundRobinRule : 轮训策略(`默认策略`)
- RetryRule: 轮询 + 重试,在RoundRobinRule基础上,增加重试功能
- WeightedResponseTimeRule: (
非常好
) 刚启动时,统计数据不足,先使用RoundRobinRule
策略。有个DynamicServerWeightTask
定时任务,默认每隔30秒会计算一次各个服务实例响应时间,等统计信息足够,切换到WeightedResponseTimeRule
. - BestAvailableRule: 先过滤到断路器处于打开的服务,然后选择并发请求最小的服务实例来使用。刚启动时,如果统计信息不足,则使用RoundRobinRule策略,等统计信息足够,会切换到BestAvailableRule。
- PredicateBasedRule: 过滤+轮训
- AvailabilityFilteringRule: (1)由于多次访问故障而处于断路器跳闸状态;(2)并发的连接数量超过阈值. (3)对剩余的服务列表,进行轮询
小结:我们可以看出上述组件是对 服务列表(
待负载对象
)的定义
,与操作
。但是要想让他们协同起来干活。这就需要ILoadBalancer
2.6 ILoadBalancer:统筹者,总管
负载均衡器,负责负载均衡调度的管理,总管级别。
调度其他组件,完成从服务列表里获取一个服务的目标
对外提供一个方法,选择出一个Server来。
public Server chooseServer(Object key);
抽象类:AbstractLoadBalancer 主要定义了服务的分组
主要实现
:
1.BaseLoadBalancer: 基本负载均衡器实现.维护
(1)维护一个所有服务列表+当前存活服务列表
(2)默认使用轮训选择一个服务
(3)定义一个定时器,根据SerialPingStrategy策略定时检活
2.DynamicServerListLoadBalancer动态升级版
(1)DomainExtractingServerList 动态从EurekaClient获取UP状态服务列表
(2)ZoneAffinityServerListFilter对列表进行过滤
(3)PollingServerListUpdater定时对服务进行更新
3.ZoneAwareLoadBalancer: 在DynamicServerListLoadBalancer基础上增加了zone策略。
(1)此类使用ZoneStats存储每个Zone的状态和平均请求情况。区域指标作为选择服务的影响因素
2.7 配置组件组合方式
组件有了,到底采用哪种组合方式呢?Ribbon为使用者提供了可配置化。
通过不同的组件组合,配置不同的负载均衡效果。
配置的方式有哪些呢:
- IClientConfig 接口:默认实现
DefaultClientConfigImpl
。你不配置任何属性,则默认会使用这里面定义的组件。当然这里还有其他各种属性的配置
默认配置的组件有:
- 文件配置: 当我们更换默认的配置时,我们可以在配置文件里配置各种属性
属性格式配置如下
<clientName>.<nameSpace>.<propertyName>=<value> api-user.ribbon.listOfServers=localhost:8099
这样:Netfix-Ribbon的大概组件,以及工作原理也就一目了然了
3.SC-Ribbon主要组件(脱离Eureka)
SpringCloud-Ribbon集成了Netflix Ribbon
,使其融入springcloud体系。
核心的功能都在Netflix Ribbon
项目中了。SC-Ribbon封装Netflix Ribbon
,主要做了一些集成工作。
为此,SpringCloud-Ribbon又增加了哪些组件,干了哪些事呢?
思考
:既然核心功能在Netflix Ribbon
项目中了。此项目干的事,无非就是从以下几方面入手
- 配置层面:符合Spring体系的配置习惯
- 使用层面: 如何使用Ribbon的负载均衡
!!!!!注意注意: 此处说的是脱离Eureka使用SpringCloud-Ribbon
下面我们来看为此做出的工作:
配置层面的工作: