概述
Ribbon提供了软件负载均衡器来与服务器集群通信。负载均衡器提供以下基本功能:
- 向通信客户端提供单个服务器的公共DNS名称或IP
- 根据特定逻辑在服务器列表之间进行轮换
某些负载平衡器还可以提供以下高级特性:
- 通过将客户端和服务器划分为多个区域(如数据中心中的机架)来建立它们之间的亲缘关系,并支持位于同一区域的服务器,以减少延迟
- 保持服务器的统计数据,避免服务器出现高延迟或频繁故障
- 对区域进行统计,并避免可能处于停机状态的区域
利用这些高级特性需要使用Ribbon中提供的一个客户端,因为它与负载均衡器集成,并向负载均衡器统计信息提供输入。
负载均衡器组件
- Rule - 用于确定从列表中返回哪个服务器的逻辑组件
- Ping - 在后台运行的组件,以确保服务器的活性
- ServerList - 这可以是静态的,也可以是动态的。如果它是动态的(正如DynamicServerListLoadBalancer所使用的那样),后台线程将在特定的时间间隔刷新和筛选列表
这些组件可以通过编程方式设置,也可以作为客户端配置属性的一部分,并通过反射创建。这些是相关的属性名:
NFLoadBalancerClassName
NFLoadBalancerRuleClassName
NFLoadBalancerPingClassName
NIWSServerListClassName
NIWSServerListFilterClassName
通过通过Archaius更改属性,这些组件的行为通常在运行时是可更改的。
通常的规则
RoundRobinRule
这个规则只是通过轮询来选择服务器。它通常用作更高级规则的默认规则或回退。
AvailabilityFilteringRule
此规则将跳过那些被认为是“电路跳闸”或具有高并发连接计数的服务器。
默认情况下,如果RestClient在过去三次都没有连接到实例,那么实例就会发生电路跳闸。一旦一个实例电路跳闸,它将保持这个状态30秒,然后再认为电路是关闭的。然而,如果它继续连接失败,它将再次成为“电路跳闸”,它成为“电路关闭”的等待时间将成倍地增加到连续故障的数量。
可以通过Archaius ConfigurationManager设置以下属性:
# 连续连接失败阈值,使服务器处于电路跳闸状态,默认3
niws.loadbalancer.<clientName>.connectionFailureCountThreshold
# 实例可以保持在“不可用”状态的最大周期,无论指数增加多少,缺省值为30
niws.loadbalancer.<clientName>.circuitTripMaxTimeoutSeconds
# 要跳过服务器的并发连接计数阈值,默认是Integer.MAX_INT
<clientName>.<clientConfigNameSpace>.ActiveConnectionsLimit
WeightedResponseTimeRule
对于这个规则,每个服务器都根据其平均响应时间获得一个权重。响应时间越长,得到的权重就越小。该规则随机选择一个服务器,其中的可能性由服务器的权重决定。
要启用WeightedResponseTimeRule,可以通过API用负载均衡器设置它,或者设置以下属性:
<clientName>.<clientConfigNameSpace>.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.WeightedResponseTimeRule
服务列表
临时静态服务器列表
您总是可以使用BaseLoadBalancer或它的子类使用API baseloadbalker . setserverslist()以编程方式设置服务器的静态列表。
ConfigurationBasedServerList
这是负载均衡器的默认ServerList实现。
您可以使用Archaius ConfigurationManager将服务器列表设置为属性。例如:
sample-client.ribbon.listOfServers=www.microsoft.com:80,www.yahoo.com:80,www.google.com:80
如果属性是动态更改的,负载均衡器的服务器列表也会更改。
DiscoveryEnabledNIWSServerList
这个ServerList实现从Eureka客户机获取服务器列表。必须通过属性中的VipAddress标识服务器集群。例如:
myClient.ribbon.NIWSServerListClassName=com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList
# 服务器必须使用VipAddress“myservice”在Eureka服务器注册
myClient.ribbon.DeploymentContextBasedVipAddresses=myservice
ServerListFilter
ServerListFilter是DynamicServerListLoadBalancer用来过滤从ServerList实现返回的服务器的组件。在Ribbon中有两个ServerListFilter实现:
ZoneAffinityServerListFilter
过滤掉与客户机不在同一区域的服务器,除非客户机区域中没有可用的服务器。该过滤器可以通过指定以下属性来启用(假设客户端名称为“myclient”,客户端属性名称空间为“ribbon”):
myclient.ribbon.EnableZoneAffinity=true
ServerListSubsetFilter
这个过滤器确保客户机只看到ServerList实现返回的全部服务器的一个固定子集。它还可以周期性地用新服务器替换低可用性子集中的服务器。要启用此筛选器,请指定以下属性:
myClient.ribbon.NIWSServerListClassName=com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList
# the server must register itself with Eureka server with VipAddress "myservice"
myClient.ribbon.DeploymentContextBasedVipAddresses=myservice
myClient.ribbon.NIWSServerListFilterClassName=com.netflix.loadbalancer.ServerListSubsetFilter
# only show client 5 servers. default is 20.
myClient.ribbon.ServerListSubsetFilter.size=5