Ribbon 概述
Ribbon 是客户端负载均衡器;
Ribbon 核心功能
- 服务发现;
- 服务选择规则;
- 服务监听,可以监听服务列表中哪个服务可用,哪个不可用;
Ribbon 与 Eureka 整合
- Ribbon 天然与 Eureka 无缝整合,引入
spring-cloud-starter-netflix-eureka-client
就引入了 Ribbon; - 通过在
RestTemplate
上加@LoadBalanced
使用 Ribbon 提供的负载均衡功能; - 通过
ribbon.eureka.enabled=false
禁止从 Eureka Server 中获取 server list,一般没人这么干;
Ribbon 核心 | IRule
- IRule 就是配置负载均衡算法的;
- IRule 通常使用的负载均衡算法有两种:
- BestAvailableRule;
- WeightedResponseTimeRule;
IRule 算法实现
IRule 算法 | 算法描述 |
---|---|
RoundRobinRule | 轮询规则 |
RandomRule | 随机规则 |
AvailabilityFilteringRule | 可用过滤规则 |
WeightedResponseTimeRule | 根据平均响应时间计算所有服务的权重 |
RetryRule | 遵循 RoundRobinRule 规则处理,但是会对失败的服务进行重试 |
BestAvailableRule | 结合了可用过滤规则和响应时长规则 |
ZoneAvoidanceRule | 符合判断 server 所在区域性能和可用性选择服务器 |
Ribbon 核心 | IPing
Ribbon 中有 2 个 server list,一个是 allServerList,一个是 upServerList;这两个集合本身可以从 Eureka Server 中获取到,还可以通过 IPing,不断检测服务端是否存活,然后动态修改 2 个集合;
- IPing 是 Ribbon 保证服务可用的基石;
- 常见实现:NIWSDDiscoveryPing,PingUrl;
IPing 算法实现
IPing 算法 | 算法描述 |
---|---|
NIWSDiscoveryPing | 不执行 Ping 操作,以 Eureka Client 从 Eureka Server 中拿到的 server list 为准 |
PingUrl | 使用 HttpClient 对服务进行 Ping 操作 |
DummyPing | “人性本善”流算法,如果不明确的探测出问题,就返回 true |
NoOpPing | 永远返回 true |
Ribbon 核心 | ServerList
- ServerList 是 Ribbon 存储的可用服务列表;
- ServerList 可以手动设置;
- ServerList 常见的数据来源是 Eureka Server;
Ribbon 参数配置
- 默认配置定义在:
com.netflix.client.config.DefaultClientConfigImpl
中; - Ribbon Key 定义在:
com.netflix.client.config.CommonClientConfigKey
中; - Ribbon 参数分为全局配置和指定客户端配置;
- 参数格式:
<client>.ribbon.<key>=<value>
,比如针对客户端 hello-service-provider 的 Ribbon 相关配置,可以定义如下:
hello-service-provider:
ribbon:
MaxTotalTimeToPrimeConnections: 3
- 全局配置举例:
ribbon:
MaxTotalTimeToPrimeConnections: 3
- 在全局配置和指定客户端配置同时配置的情况下,指定客户端配置生效;如果都没配置,那么
com.netflix.client.config.DefaultClientConfigImpl
中的配置生效;