Spring Cloud Ribbon 是基于Netflix Ribbon 实现的一套客户端,负载均衡的工具。
Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。
LB(Load Balance)负载均衡是什么?
负载均衡就是将用户的请求平摊分配到多个服务上,从而达到系统的高可用。常见的负载均衡有软件Nginx,LVS,硬件 F5等。
Ribbon负载均衡与Nginx负载均衡区别
Ribbon是本地负载均衡,在调用微服务接口时,会在注册中心上获取可用注册信息服务列表之后缓存到本地,然后再根据自己的策略从中选择一个合适的服务器。从而在本地实现RPC远程服务调用。
Nginx是是服务器负载均衡,客户端所有请求都会交给Nginx,然后由Nginx负责将访问请求通过某种策略转发至服务的提供方。即负载均衡是有服务端实现的。
SpringCloud 使用Ribbon
1.引入jar包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>2.2.1.RELEASE</version>
<scope>compile</scope>
</dependency>
2.在RestTemplate上添加注解 @LoadBalanced ,发送请求时就会启用负载均衡,默认是轮询的方式。
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
RestTemplate中的getForEntity 与getForObject 区别。
ForObject 返回JSON字符串 ,ForEntity返回RestPonseEntity,RestPonseEntity具备更复杂的信息,例如请求头,状态码,响应体等信息,可使用RestPonseEntity.getBody() 获取请求体
Ribbon的七种负载均衡算法:
1.RoundRobinRule -轮询 #默认算法
2.RandomRule -随机选择
3.RetryRule -先按照RoundRobinRule 的策略获取服务,如果获取服务失败则在指定时间内进行重试。直至获取可用的服务
4.WeightedResponseTimeRule -对 RoundRobinRule 的扩展,服务实例响应速度越快,权重越大,越容易被选择。
5.BestAvailableRule -会先过滤掉由多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量小的服务。
6.AvailabilityFilteringRule -先过滤掉故障实例,再选择并发较小的实例。
7.ZoneAvoidanceRule 复合判断server所在区域的性能和server的可用性选择服务器
Ribbon自带负载均衡策略比较
策略名 | 策略声明 | 策略描述 | 实现说明 |
BestAvailableRule | public class BestAvailableRule extends ClientConfigEnabledRoundRobinRule | 选择一个最小的并发请求的server | 逐个考察Server,如果Server被tripped了,则忽略,在选择其中ActiveRequestsCount最小的server |
AvailabilityFilteringRule | public class AvailabilityFilteringRule extends PredicateBasedRule | 过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值) | 使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个server的运行状态 |
WeightedResponseTimeRule | public class WeightedResponseTimeRule extends RoundRobinRule | 根据相应时间分配一个weight,相应时间越长,weight越小,被选中的可能性越低。 | 一个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。Weight的计算也比较简单responsetime 减去每个server自己平均的responsetime是server的权重。当刚开始运行,没有形成statas时,使用roubine策略选择server。 |
RetryRule | public class RetryRule extends AbstractLoadBalancerRule | 对选定的负载均衡策略机上重试机制。 | 在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server |
RoundRobinRule | public class RoundRobinRule extends AbstractLoadBalancerRule | roundRobin方式轮询选择server | 轮询index,选择index对应位置的server |
RandomRule | public class RandomRule extends AbstractLoadBalancerRule | 随机选择一个server | 在index上随机,选择index对应位置的server |
ZoneAvoidanceRule | public class ZoneAvoidanceRule extends PredicateBasedRule | 复合判断server所在区域的性能和server的可用性选择server | 使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的Server。 |
参考https://www.cnblogs.com/softidea/p/11000930.html
Ribbon 指定负载均衡算法
1.自定义配置了类
这个配置类不能放在被@ComponentScan扫描的当前包以及子包下(扫描范围一般为主启动类所在包以及子包),否则该配置会被所有Ribbon客户端所共享,达不到定制化的目的。
在@ComponentScan 注解扫描范围外新建配置类 package.RibbonRule
@Configuration
public class RibbonRule {
@Bean
public IRule randomRule() {
return new RandomRule(); //随机算法
}
}
在主启动类上加入@RibbonClient注解
@RibbonClient(name = ("cloud-service"),configuration = RibbonRule.class)
name = 服务名称,configuration = 配置类的类模板
到此Ribbon默认负载算法已替换为随机
Ribbon 轮询算法原理:使用请求次数%该微服务下的实例数量