springcloud之Ribbon

springcloud学习笔记,第四章,ribbon负载均衡。

简介:

ribbon翻译:n. (用于捆绑或装饰的)带子;丝带;带状物;狭长的东西;绶带;勋带。

基于Netflix Ribbon实现的一套客户端 负载均衡的工具。主要功能是提供客户端的软件负载均衡算法和服务调用。我们也可以使用自定义的负载均衡算法。

ribbon目前进入了维护模式,估计很难更新了。

LB(load balance)负载均衡是什么?

简单来说就是将用户的请求平摊到多个服务器上,从而达到系统的HA(高可用)。常见的负载均衡软件有Nginx,LVS等。

Ribbon本地负载均衡客户端VS Nginx服务端负载均衡区别:

nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求。即负载均衡是由服务端实现的。

Ribbon本地均衡负载,在调用微服务接口的时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。

进程内LB:

将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择一个合适的服务器。

Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方地址。

一句话就是:ribbon=负载 均衡+RestTemplate调用

Ribbon负载均衡演示:

  • 架构说明:

    Ribbon其实就是一个软负载均衡的客户端组件,他可以和其他所需请求的客户端结合使用,和eureka结合只是其中的一个实例。

  • 之前我们没有引入ribbon,但是仍可以使用eureka实现负载均衡。这是因为spring-cloud-starter-netflix-eureka-client自带了ribbon的引用。

  • 二说RestTemplate的使用:

    • restTemplate里面的getForObject和getForEntity方法返回的是不一样的,但是显示在前端都是一样的。如果想要看到更详细的信息,建议使用getForEntity。如果只是要一个json字符串,那么使用getForObject就可以了。

Ribbon核心组件IRule:

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

  • ribbon自带的7种负载均衡算法,由IRule来负责调用,你还可以自定义:

    1. RoundRobinRule:轮询;
    2. RandomRule:随机;
    3. AvailabilityFilteringRule:会先过滤掉由于多次访问故障而处于断路器状态的服务,还有并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问;
    4. WeightedResponseTimeRule:根据平均响应时间计算所有服务的权重,响应时间越快的服务权重越大被选中的概率越大。刚启动时如果统计信息不足,则使用RoundRobinRule(轮询)策略,等统计信息足够,会切换到WeightedResponseTimeRule;
    5. RetryRule:先按照RoundRobinRule(轮询)策略获取服务,如果获取服务失败则在指定时间内进行重试,获取可用的服务;
    6. BestAvailableRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务;
    7. ZoneAvoidanceRule:复合判断Server所在区域的性能和Server的可用性选择服务器;

Ribbon负载均衡算法如何切换:

  1. 修改cloud-consumer-order80

  2. 注意配置细节

    • 所以要跳出主启动类所在的包com.aaron.springcloud包。
  3. 新建package,com.aaron.myrule

  4. 上面包下新建MySelfRule规则类:

    1
    2
    3
    4
    5
    6
    7
    @Configuration
    public class MySelfRule {
    @Bean
    public IRule myRule(){
    return new RandomRule();
    }
    }
  5. 测试:

    1. eureka注册中心:

    1. 可以看到,之前的轮询算法变成了随机算法。

深刻理解Ribbon负载均衡算法:

负载均衡算法:rest接口第几次请求数%服务器集群总数量=实际调用服务器位置下标,每次服务重启后rest接口数从1开始。

最后两点就是:IRule源码与手写轮询算法。这里我不懂,所以就不写了。。。涉及到JUC、自旋锁和CAS。

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信