Ribbon学习记录

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自带负载均衡策略比较

策略名策略声明策略描述实现说明
BestAvailableRulepublic class BestAvailableRule extends ClientConfigEnabledRoundRobinRule选择一个最小的并发请求的server逐个考察Server,如果Server被tripped了,则忽略,在选择其中ActiveRequestsCount最小的server
AvailabilityFilteringRulepublic class AvailabilityFilteringRule extends PredicateBasedRule过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值)使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个server的运行状态
WeightedResponseTimeRulepublic class WeightedResponseTimeRule extends RoundRobinRule根据相应时间分配一个weight,相应时间越长,weight越小,被选中的可能性越低。一个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。Weight的计算也比较简单responsetime 减去每个server自己平均的responsetime是server的权重。当刚开始运行,没有形成statas时,使用roubine策略选择server。
RetryRulepublic class RetryRule extends AbstractLoadBalancerRule对选定的负载均衡策略机上重试机制。在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server
RoundRobinRulepublic class RoundRobinRule extends AbstractLoadBalancerRuleroundRobin方式轮询选择server轮询index,选择index对应位置的server
RandomRulepublic class RandomRule extends AbstractLoadBalancerRule随机选择一个server在index上随机,选择index对应位置的server
ZoneAvoidanceRulepublic 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 轮询算法原理:使用请求次数%该微服务下的实例数量

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值