Ribbon(客户端负载均衡器)学习笔记

一、Ribbon简介

Ribbon是一个开源的客户端负载均衡器,由Netflix发布,是SpringCLoud-Netflix中重要的一环,通过他将Netflix的中间层服务连接在一起

Ribbon类似于nginx的负载均衡前移到前端了。

Ribbon的客户端组件提供了一些列完善的配置项,如连接超时、重试等。简单的说,就是在配置文件中列出Load Balancer后面所有的服务,Ribbon会自动的基于某种规则(如轮询、随机等)去连接这些服务,也很容易实现自定义的负载均衡算法。

二、Ribbon能干什么

Ribbon是在客户端来实现负载均衡的访问服务,主要功能点包括:
1、服务发现:发现依赖的服务列表
2、服务选择规则:在多个服务中如何选择一个有效服务。(此功能是Ribbon的核心)
3、服务监听:检测到失效的服务,高效剔除失效服务。

三、Ribbon应用架构

在这里插入图片描述

四、Ribbon的HelloWorld

4.1、添加依赖

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-ribbon</artifactId> 
</dependency>

先不添加Eureka的starter。

4.2、Ribbon的参数配置

4.2.1、概述

对于Ribbon的参数的key及value的类型的定义,可以通过com.netflix.client.config.DefaultClientConfigKey查看。

如果你没有配置任何属性,则Ribbon会使用com.netflix.client.config.DefaultClientConfigImpl里的值。

4.2.2、配置方式

Ribbon的参数配置通常有两种方式:全局配置和指定客户端配置。

4.2.2.1、全局配置

只需要使用

ribbon.<key>=<value>

格式进行配置即可。
其中,<key>代表了Ribbon客户端配置的参数名,<value>则代表了对应参数的值。

比如,可以向项目这样配置Ribbon的超时时间:
ribbon.ConnectTimeout=250
全局配置可以作为默认值进行设置,当指定客户端配置了响应的key的值时,将覆盖全局配置的值。

4.2.2.2、指定客户端的配置

可以使用

<client>.ribbon.<key>=<value>

的格式进行配置。
<client>表示服务名,比如没有服务治理框架(如Eureka)的时候,需要指定实例清单,如userService.ribbon.listOfServers=localhost:8080

五、Ribbon的核心组件

5.1、Ribbon包含如下核心组件

5.1.1、IRule

根据特定算法,从服务列表中选取一个要访问的服务。

5.1.2、IPing

后台运行线程,用来判断服务是否可用

5.1.3、ServerList

服务列表,可以是静态的或动态的,如果是动态的,后续线程将刷新并按一定的时间间隔过滤列表。

5.1.4、ServerListFilter

该接口允许过滤配置,或动态获取具有所需特性的服务器列表

5.1.5、ServerListUpdater

被DynamicServerListLoadBalancer用于动态更新服务列表

5.1.6、IClientConfig

定义各种配置信息,用来初始化Ribbon客户端和负载均衡器。

5.1.7、ILoadBalancer

定义软件负载均衡器操作的接口。动态更新一组服务列表,及根据指定算法从现有服务器列表中选择一个服务。

5.2、配置

这些组件可以以编程的方式设置,也可以是客户端配置属性的一部分,并通过反射创建。

支持的属性如下所示,应以<clientName>.ribbon.为前缀:
NFLoadBalancerClassName:要使用的ILoadBalancer
NFLoadBalancerRuleClassName:要使用的Irule
NFLoadBalancerPingClassName:要使用Iping
NIWSServerListClassName:要使用的ServerList
NIWSServerListFilterClassName:要使用的ServerListFilter

5.3、核心组件之 IRule

IRule都在com.netflix.loadbalancer包下面,常用的实现由下面几种:
1、RoundRobinRule:轮询规则

2、RandomRule:随机获取一个服务

3、AvailabilityFilteringRule:这个负载均衡器规则,会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,还有并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问。

4、WeightedResponseTimeRule
根据平均响应时间,计算所有服务的权重,响应时间越快,服务权重越大,被选中的概率越高。刚启动时,如果统计信息不足,则使用RoundRobinRule策略,等统计信息足够,会切换到WeightedResponseTimeRule。

5、RetryRule
先按照RoundRobinRule的策略获取服务,如果获取服务失败,则在指定时间内会进行重试,获取可用的服务。

6、BestAvailableRule
此负载均衡器会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务。

7、ZoneAvoidanceRule
默认规则,复合判断server所在区域的性能和server的可用性,选择server。

5.4、核心组件之 IPing

IPing都在com.netflix.loadBalancer包下面,重用的实现有以下几种:

1、DummyPing:默认实现,默认返回true,即认为服务永远活着。

2、NIWSDiscoveryPing:不执行真正的ping。如果Discovery Client认为是在线,则呈现认为本次心跳成功,服务活着。

3、PingUrl:此组件会使用HttpClient调用服务的一个URL,如果调用成功,则认为本次心跳成功,表示此服务活着。

4、NoOpPing:永远返回true,即认为服务永远活着。

5.5、核心组件之 ServerList

ServerList都在com.netflix.loadbalancer包下,常用的实现有以下几种:

1、ConfigurationBasedServerList:从配置文件中获取所有服务列表,也是静态获取服务列表,配置例子:sample-client.ribbon.listOfServers=

2、DiscoveryEnabledNIWSServerList:从Eureka Client中获取服务列表,此值必须通过属性中的VipAddress来标识服务器集群。
DynamicServerListLoadBalancer会调用此对象来动态获取服务列表。

3、DomainExtractingServerList:代理类,根据ServerList的值实现具体的逻辑。

5.6、核心组件之 ServerListFilter

ServerListFilter都在com.netflix.loadBalancer包下,重用的实现方式入下:

1、ZoneAffinityServerListFilter:过滤掉所有的不合客户端在相同zone的服务,如果和客户端相同的zone不存在,才不过滤不同zone的服务。启用此配置使用以下配置:
<clientName>.ribbon.EnableZoneAffinity=true

2、ServerListSubsetFilter:ZoneAffinityServerListFilter的子类。此过滤器确保客户端仅看到有ServerList实现返回的整个服务器的固定子集。它还可以定期用心服务器替代可用性差的子集中的服务器。要启用此过滤器,可指定以下属性:

myClient.ribbon.NIWSServerListClassName=com.netflix.niws.loadbalancer.DiscoveryEna
bledNIWSServerList
# the server must register itself with Eureka server with VipAddress "myservice" myClient.ribbon.DeploymentContextBasedVipAddresses=myservice myClient.ribbon.NIWSServerListFilterClassName=com.netflix.loadbalancer.ServerListS
ubsetFilter
# only show client 5 servers. default is 20. myClient.ribbon.ServerListSubsetFilter.size=5

5.7、核心组件之 ServerListUpdater

ServerListUpdater都在com.netflix.loadbalancer包下,常用实现方式有几种:
1、PollingServerListUpdater:默认的实现策略。此对象会启动一个定时线程池,定时执行更新策略。

2、EurekaNotiflicationServerListUpdater:当收到缓存刷新的通知,会更新服务列表。

5.8、核心组件之 ILoadBalancer

ILoadBalancer都在com.netflix.loadbalancer包下,常用的实现方式有:

1、DynamicServerListLoadBalancer:组合了Rule, IPing, ServerList, ServerListFilter, ServerListUpdater实现类,实现动态更新和过滤更新服务列表。

2、ZoneAwareLoadBalancer:这是DynamicServerListLoadBalancer的子类,加入了zone的因素。统计每个zone的平均请求情况,保证从所有zone选取对当前客户端服务最好的服务组列表。

六、重试机制

Spring Cloud通过整合Spring retry来增强RestTemplate的重试能力,对于开发者来说,只要简单配置,即可完成重试策略。

配置示例入下:
1、spring.cloud.loadbalancer.retry.enabled=true // 该参数用来开启重试机制,它默认是关闭的。

2、hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000 //断路器的超时时间需要大于Ribbon的超时时间,不然Ribbon不会被触发重试。

3、userService.ribbon.ConnectTimeout=250 // 请求连接超时时间

4、userService.ribbon.ReadTimeout=1000 // 请求处理的超时时间

5、userService.ribbon.OkToRetryOnAllOperations=true // 对所有操作请求都进行重试

6、userService.ribbon.MaxAutoRetriesNextServer=2 // 切换实例的重试次数

7、userService.ribbon.maxAutoRetries=1 // 对当前实例的重试次数

七、@RibbonClient 注解

注解@RibbonClient,目的是为了在启动该微服务的时候就能去加载我们的自动以的Ribbon配置类,从而使配置生效。示例:

@RibbonClient(name="userService",configuration=MyConf2.class)

说明:
1、这个userService不是随便写的,而是注册到Eureka发现组件上的微服务服务端,意思是要对所有工程名为userService的服务提供者进行负载均衡管理。
2、官方文档明确给出了警告:这个测试配置类MyConf2不能放在@ComponentScan所扫描的当前包下以及子包下,否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,也就是我们达不到特殊化定时的目的了。

7.1、自定义负载均衡器

可以直接参考官方的Rule实现来做,比如:
https://github.com/Netflix/ribbon/blob/master/ribbon- loadbalancer/src/main/java/com/netflix/loadbalancer/RandomRule.java

开发好过后,就可以配置来使用了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章