ribbon 组件
|接口 | 作用 | 默认值 |
| ---- | ---- | ---- |
| IClientConfig | 读取配置 | DefaultclientConfigImpl |
| 工Ru1e | 负载均衡规则,选择实例 | ZoneAvoidancerule |
|工Ping |筛选掉ping不通的实例 |Dummying |
|Serverlist<server> |交给 Ribbon的实例列表|Ribbon: ConfiqurationBasedServerList Spring cloud Alibaba: NacosServerList |
| ServerlistFilter< Server> | 过滤掉不符合条件的实例 |ZonepreferenceserverlistFilter |
| ILoadBalancer | Ribbon的入口 | ZoneAwareloadBalancer |
| ServerListUpdater | 更新交给Ribbon的List的策略 | PollingserverlistUpdater |
IClientConfig 读取配置
读取配置信息。一般都不使用
IRule 负载均衡算法
常用的权重、随机、随机权重、hash等负载均衡算法都能找到。也可以根据自己的实际的业务场景进行自定义的负载均衡算法。
IPing 筛选ping不通的实例
IPing 方式可以也可以根据实际业务场景进行定制开发
Serverlist<server> Ribbon的实例列表
这个接口 有俩个方法
- 一个是获取初始化服务列表
- 获取更新的服务器列表,默认是30S,可设置调整
ServerlistFilter< Server> 过滤掉不符合条件的实例
过滤服务根据ServerStats条件,是否需要筛选。
如果有需要我们也可以定制自己的服务过滤器。
public class ServerListSubsetFilter<T extends Server> extends ZoneAffinityServerListFilter<T> implements IClientConfigAware, Comparator<T> {
····
····
public List<T> getFilteredListOfServers(List<T> servers) {
List<T> zoneAffinityFiltered = super.getFilteredListOfServers(servers);
Set<T> candidates = Sets.newHashSet(zoneAffinityFiltered);
Set<T> newSubSet = Sets.newHashSet(this.currentSubset);
LoadBalancerStats lbStats = this.getLoadBalancerStats();
Iterator var6 = this.currentSubset.iterator();
while(true) {
while(var6.hasNext()) {
T server = (Server)var6.next();
if (!candidates.contains(server)) {
newSubSet.remove(server);
} else {
// 循环调用获取服务状态
ServerStats stats = lbStats.getSingleServerStat(server);
if (stats.getActiveRequestsCount() > this.eliminationConnectionCountThreshold.get() || stats.getFailureCount() > (long)this.eliminationFailureCountThreshold.get()) {
newSubSet.remove(server);
candidates.remove(server);
}
}
}
····
····
}
ILoadBalancer
Ribbon的入口 ,也是真正的业务核心类。罗列了一下 主要工作的职责。
- 维护了存储服务实例Server对象的二个列表。一个用于存储所有服务实例的清单,一个用于存储正常服务的实例清单
- 初始化得到可用的服务列表,启动定时任务去实时的检测服务列表中的服务的可用性,并且间断性的去更新服务列表,结合注册中心。
- 选择可用的服务进行调用(这个一般交给IRule去实现,不同的轮询策略)
ServerListUpdater
循环更新服务器状态。
只有一个实现类 PollingServerListUpdater
配置方式
这使您可以在启动时在不同环境中更改行为。
支持的属性在下面列出,并且应以开头<clientName>.ribbon.:
NFLoadBalancerClassName: ILoadBalancer
NFLoadBalancerRuleClassName: IRule
NFLoadBalancerPingClassName: IPing
NIWSServerListClassName: ServerList
NIWSServerListFilterClassName ServerListFilter
cloud-discovery-client:
ribbon:
NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
注意点
这些属性中定义的类优先于使用定义的bean @RibbonClient(configuration=MyRibbonConfig.class)和Spring Cloud Netflix提供的默认值。
思考
其实Ribbon 用组件的方式给拆解出来。对于有一定了解基础的人。就能猜到,该如何组合这些组件完成整个的流程的操作。这里不会再过多的介绍 Ribbon 如果想探究一下里面实现的细节。可以去看看里面源码。
往期资料、参考资料
摘自参考 spring cloud 官方文档
服务器nacos 地址 http://47.99.209.72:8848/nacos
往期地址 spring cloud alibaba 地址
Spring Cloud Alibaba (nacos 注册中心搭建)
Spring Cloud Alibaba 使用nacos 注册中心
Spring Cloud Alibaba nacos 配置中心使用
Spring Cloud alibaba网关 sentinel zuul 四 限流熔断
Spring Cloud gateway 网关服务二 断言、过滤器
Spring Cloud gateway 三 自定义过滤器GatewayFilter
Spring Cloud gateway 五 Sentinel整合
Spring Cloud gateway 六 Sentinel nacos存储动态刷新
Spring Cloud gateway 七 Sentinel 注解方式使用
如何喜欢可以关注分享本公众号。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。转载请附带公众号二维码
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。