1. LB的基本功能要求
想想一个LB是怎么工作的,不管是硬件的还是软件的,我们要求它有哪些能力,提个最精简的需求清单出来:好像能想到的也就两个吧:
- ?设置添加和读取后端的服务(器)列表
- 能从中选择一个服务(器)
Netflix的LoadBalancer也是这样被要求的。通过ILoadBalancer来要求的。
可以看到主要有:对应配置后端服务;读取后端服务;标记一个服务不可用;当然最主要的是选择一个后端服务来提供服务。
这是2.1.0版本的方法列表,2.1.3开始版本也就是把getServerList (boolean availableOnly)分成了两个getReachableServers和getAllServers(解释是in favor of the cleaner),一个分成俩,clean了吗,好像一点点。一个是得到所有的后端server,一个是只返回可用的后端server。
2 主要实现
观察ILoadBalancer最基础的实现类com.netflix.loadbalancer.BaseLoadBalancer可以了解主要行为。LB的主要实现都在里面,DynamicServerListLoadBalancer和ZoneAwareLoadBalancer不过是扩展了他的功能而已。
虽然从ribbon默认提供的是一种ZoneAwareLoadBalancer的LB.
|
@Bean
@ConditionalOnMissingBean
publicILoadBalancer ribbonLoadBalancer(IClientConfig config,
ServerList<Server>serverList,ServerListFilter<Server>serverListFilter,
IRule rule,IPing ping){
ZoneAwareLoadBalancer<Server>balancer=LoadBalancerBuilder.newBuilder()
.withClientConfig(config).withRule(rule).withPing(ping)
.withServerListFilter(serverListFilter).withDynamicServerList(serverList)
.buildDynamicServerListLoadBalancer();
returnbalancer;
}
|
3 主要组件
可以看到一个LB中包含的几个重要的属性(工具),正是这几个工具为LB的功能提供支持。 他们是:
IRule |
负载均衡策略,可以插件化的为LB提供各种适用的负载均衡算法 |
Iping |
?判断目标服务是否存活 对应不同的协议不同的方式去探测,得到后端服务是否存活。如有http的,还有对于微服务框架内的服务存活的NIWSDiscoveryPing是通过eureka client来获取的instanceinfo中的信息来获取。 |
LoadBalancerStats |
LB运行信息 记录LB的实时运行信息,这些运行信息可以被用来作为LB策略的输入。 |
观察下几个主要方法。首先是最重要的的服务选择方法:
|
publicServer chooseServer(Objectkey){
if(counter==null){
counter=createCounter();
}
counter.increment();
returnrule.choose(key);
}
|
有点失望,啥也没有,除了个计数,就一句,可以看到将该功能委托给包含的负载均衡策略rule来实现。 可以通过使用不同的负载均衡策略的choose方法来达到LB的不同行为,这个将在另一篇文章中介绍。
其他的也没有什么特别的,维护后端的服务列表实现了getServerList和addServers方法如下:
|
publicList<Server>getServerList(booleanavailableOnly)
return(availableOnly?Collections.unmodifiableList(upServerList):Collections.unmodifiableList(allServerList));
}
publicvoidaddServers(List<Server>newServers){
ArrayList<Server>newList=newArrayList<Server>();
newList.addAll(allServerList);
newList.addAll(newServers);
setServersList(newList);
}
|
关于IPing的使用,在初始化LB的时候会启动一个timer来根据配置的周期pingIntervalSeconds,使用配置的IPing方式类判断后端的server哪些是不可用的。
另外重要一点,IRule和IPing两个LB中使用的重要逻辑的东西都可以在配置中配置一个类名来动态生成。
|
publicvoidinitWithNiwsConfig(IClientConfig clientConfig){
StringruleClassName=(String)clientConfig.getProperty(CommonClientConfigKey.NFLoadBalancerRuleClassName);
StringpingClassName=(String)clientConfig.getProperty(CommonClientConfigKey.NFLoadBalancerPingClassName);
IRule rule;
IPing ping;
rule=(IRule)ClientFactory.instantiateInstanceWithClientConfig(ruleClassName,clientConfig);
ping=(IPing)ClientFactory.instantiateInstanceWithClientConfig(pingClassName,clientConfig);
}
|
这也是LB最灵活的地方,用户可以根据自己的server的协议和判断标准写一个ping方法。 如ribbon提供了常用的http的ping,还提供了用于于微服务框架内的服务存活的NIWSDiscoveryPing,通过eureka client来获取的instanceinfo中的信息来获取服务的状态。 当然更常用的是用户自己要写适合应用场景的负载均衡策略。这将在另一篇文章详细的说明。
4 Server 后端服务
Ribbon的后端服务的描述封装在com.netflix.loadbalancer.Server中,主要信息也就两个host和port。但实现上比这个却看上去要复杂,看到里面定义了这样一个内部接口的实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
privateMetaInfo simpleMetaInfo=newMetaInfo(){
@Override
publicStringgetAppName(){
returnnull;
}
@Override
publicStringgetServerGroup(){
returnnull;
}
@Override
publicStringgetServiceIdForDiscovery(){
returnnull;
}
@Override
publicStringgetInstanceId(){
returnid;
}
};
|
怎么还有getServiceIdForDiscovery?看下Server的子类com.netflix.niws.loadbalancer.DiscoveryEnabledServer,应该就全明白了。
|
this.serviceInfo=newMetaInfo(){
@Override
publicStringgetAppName(){returninstanceInfo.getAppName();}
@Override
publicStringgetServerGroup(){returninstanceInfo.getASGName();}
@OverridepublicStringgetServiceIdForDiscovery(){returninstanceInfo.getVIPAddress();}
@Override
publicStringgetInstanceId(){returninstanceInfo.getId();}
};
|
看到引用到的com.netflix.appinfo.InstanceInfo就理解了,这里的服务正是eureka发现和注册的服务,ribbon作为一个通用的客户端负载均衡,只要把请求转发到一个host+port上,但在netflix的微服务框架里,ribbon常用的的后端也就是服务框架中注册的服务。 能猜到getASGName这个ASG是什么意思不?AWS Service Group? 怎么还说有aws的东西。
完。
相关推荐
Ribbon则是Netflix开源的一套客户端负载均衡器,它可以集成在Spring Cloud中,用于在客户端进行服务的发现和负载均衡。Ribbon会根据配置的策略,自动选择一个微服务实例来处理请求,这样可以分散负载,提高系统的...
客户端负载均衡器Ribbon是Netflix开发的一个开源组件,主要用于实现微服务架构中的客户端负载均衡功能。在本实验代码中,我们将深入理解Ribbon的工作原理及其在实际应用中的配置与使用。 Ribbon是一个轻量级的库,...
具体来说,Ribbon是一个客户端负载均衡器,可以在配置文件中列出所有的服务提供方机器,然后Ribbon会自动基于某种规则(如简单轮询、随机连接等)去连接这些机器。同时,Ribbon也提供了一系列完善的配置项,如连接...
而Ribbon是Netflix开源的客户端负载均衡器,它与Spring Cloud结合,可以自动地在多个服务器实例间分配请求,提高系统的可用性和可靠性。 首先,我们要了解Ribbon的工作原理。Ribbon是一个客户端负载均衡器,它驻留...
在微服务架构中, Ribbon 是 Netflix 提供的一个客户端负载均衡器,它可以帮助我们在客户端实现对服务的请求分发,从而实现服务之间的负载均衡。Ribbon 不仅可以与 Eureka(服务发现组件)配合使用,也可以独立工作...
Spring Cloud Ribbon 实现客户端负载均衡的方法 ...本篇文章主要介绍了使用 Spring Cloud Ribbon 实现客户端负载均衡的方法,并详细地讲解了相关的知识点和注意事项,以帮助读者更好地理解和使用 Spring Cloud Ribbon。
Netflix Ribbon是Netflix公司开源的一款客户端负载均衡器,它主要用于Netflix微服务架构中的服务发现和请求分发。在本文中,我们将深入探讨Ribbon的核心概念、功能以及源码分析,帮助你更好地理解和应用这一强大的...
在Spring Cloud生态系统中,Spring Cloud Ribbon是一个至关重要的组件,它主要负责实现客户端的负载均衡,以确保服务间的调用能够均匀地分散到各个实例上,从而提高系统的整体可用性和性能。Ribbon是Netflix开发的一...
Ribbon是Netflix开源的一个Java客户端,主要功能是在客户端实现负载均衡。与传统的在服务器端进行负载均衡不同,Ribbon将负载均衡逻辑放到消费服务的客户端,使得每个客户端都能根据策略选择合适的服务实例进行调用...
Spring Cloud是构建微服务架构的一套工具集,其中Ribbon是它提供的一个客户端负载均衡器,可以帮助我们实现服务间的智能路由。本篇文章将详细探讨如何在Spring Cloud中使用Ribbon实现负载均衡。 首先,我们要理解...
在微服务架构中,Eureka 和 Ribbon 是两个关键组件,它们是 Spring Cloud 生态系统的重要部分,用于实现服务发现和客户端负载均衡。本教程将基于提供的 "eureka基于ribbon的负载均衡demo" 来深入理解这两个组件的...
要集成Ribbon到Spring Cloud项目中,需引入相应依赖并配置`@LoadBalanced`注解到`RestTemplate`,使其实现客户端负载均衡能力。此外,Ribbon还提供了多种扩展功能,如修改默认策略、创建自定义策略以及饥饿加载。 ...
Ribbon 是 Netflix 提供的客户端负载均衡器,它作为一个客户端的负载均衡中间件,实现了基于 Java 的客户端负载均衡算法。Ribbon 默认集成了 Eureka,可以从 Eureka Server 获取服务列表并进行负载均衡。Ribbon 提供...
Spring Cloud Netflix:核心组件,可以对多个Netflix OSS开源套件进行整合,包括以下几个组件: Eureka:服务治理组件,包含服务注册与发现 Hystrix:容错管理组件,实现了熔断器 Ribbon:客户端负载均衡的服务调用...
本节将深入探讨两种主要的负载均衡实现方式:服务端负载均衡和服务端负载均衡,并重点讲解Spring Cloud Ribbon作为客户端负载均衡器的应用。 1. **服务端负载均衡(Nginx)** - Nginx 是一种广泛应用的服务端负载...
在Spring Cloud生态中,Ribbon是一个重要的客户端负载均衡器,它与Netflix的Eureka服务注册中心结合,使得微服务间的调用能够实现智能路由和负载均衡。本篇将深入探讨Spring Cloud Ribbon的工作原理、功能特性以及...
Ribbon 是 Netflix 提供的客户端负载均衡器,它作为一个库内嵌在客户端,负责从服务注册表中选择一个合适的服务实例进行调用。Ribbon 内置了多种负载均衡策略,如轮询(RoundRobin)、随机(Random)等。默认情况下...
Ribbon是Netflix开源的一个客户端负载均衡器,它可以在客户端进行服务请求时自动分发请求到不同的服务器,从而提高系统的可用性和容错性。Ribbon提供了一些内置的负载均衡策略,比如轮询、随机等,可以根据实际需求...
其中,Spring Cloud Ribbon是一个客户端负载均衡器,它可以与Spring Cloud Netflix Eureka结合使用,实现服务间的智能路由和负载均衡。在这个"springcloud-ribbon负载均衡demo"中,我们将探讨Ribbon的基本概念、工作...