【Spring Cloud】详解 Ribbon:负载均衡、多种负载均衡算法的选取、自定义负载均衡算法

声明:本文学习自视频教程:https://www.bilibili.com/video/BV1jJ411S7xr?p=10,此文为学习视频后的图文总结,因视频不便于之后的快速回顾与复习,便写成图文形式,如有侵权,立即设为私密。

1 Ribbon 是什么

在这里插入图片描述

2 Ribbon 能做什么

在这里插入图片描述

3 项目实战

3.1 项目搭建

我们以【Spring Cloud】RestTemplate:学习总结、项目实战:服务提供者与服务消费者 中的服务消费者 springcloud-consumer-dept-8002 模块为基础,在此项目的基础上进行内容的改造和 Ribbon 的学习。

添加红框中的依赖
在这里插入图片描述
同时,因为 Ribbon 要去注册中心或者说是服务中心去获取信息,而注册中心由 Eureka 担任,因此自然也要导入 Eureka 的依赖

<!--ribbon-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-ribbon</artifactId>
    <version>1.4.6.RELEASE</version>
</dependency>

<!--eureka-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
    <version>1.4.6.RELEASE</version>
</dependency>

在 8002 项目的 yml 中增加 Eureka 的配置
在这里插入图片描述
在主启动类中开启 Eureka 的自动配置
在这里插入图片描述
配置类需加一个注解 @LoadBalanced
在这里插入图片描述
修改控制器中的地址,让它基于 Application 名(微服务名)去访问,而不是写死为某个特定的主机ip和端口,这样便可以通过 Ribbon 的负载均衡机制来进行当前服务提供者的获取。
在这里插入图片描述

在这里插入图片描述

接下来启动 7001,7002,7003 三个注册中心,再启动服务提供者 8001,再启动服务消费者 8002,让此服务消费者通过 RestTemplate 来通过 Ribbon 的负载均衡机制去注册中心来获取 服务提供者 8001 的服务

访问成功
在这里插入图片描述

因此,Ribbon和Eureka整合后Consumer可以直接调用服务而不用再关心地址和端口号。

3.2 Ribbon 架构图示

Ribbon 的架构思路如下:
在这里插入图片描述
在这里插入图片描述

3.3 Ribbon 负载均衡:轮询方式

下面就直接用视频教程里的截图来写了,我电脑配置较低,在启动多个微服务项目时实在太卡了,而且一有问题,调试可能又要重启各项目,实在心累,视频截图中的 8002 项目是一个 8001 的复制品,也是一个服务提供者模块,80 项目为消费者,而我的项目中 8002 是消费者模块,只需区分好这一点区别即可)

部署三个服务提供者的微服务:
在这里插入图片描述
为上述三个服务提供者的微服务项目配置各自的数据库,实体信息中唯一不同的是字段 data_source,这个字段是根据数据库名生成的:
在这里插入图片描述
修改配置
在这里插入图片描述
启动服务消费者模块 springcloud-consumer-dept-ribbon-80 ,客户端通过Ribbon完成负载均衡并访问上一步的 Dept 微服务 http://localhost/consumer/dept/list

多刷新几次注意观察结果!为1、2、3 在轮询这个三个服务名一样的模块,即一种微服务项目的三个部署轮询被请求的服务消费者使用(通过数据库中 data_source 字段的不同来直观看出负载均衡对同一种微服务项目的使用情况),同时轮询也是 Ribbon 的默认选择算法(也可以自定义,此部分内容安排的下文)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

3.4 Ribbon 各种负载均衡算法

自定义负载均衡算法涉及到一个叫做 IRule 的接口:
在这里插入图片描述

译:为 LoadBalancer 定义“规则”的接口。规则可以被认为是负载均衡的策略。众所周知的负载平衡策略包括循环、基于响应时间等。

IRule 接口有多种实现类,Ribbon 根据某个预先选取的负载均衡算法从服务列表中选取一个要访问的服务。
在这里插入图片描述
几种实现类的介绍:
在这里插入图片描述

查看分析源码:

  • IRule
  • ILoadBalancer
  • AbstractLoadBalancer
  • AbstractLoadBalancerRule:这个抽象父类十分重要!
  • 核心5. RoundRobinRule

3.5 源码分析:RoundRobinRule 负载均衡算法

其中 RoundRobinRule 是默认的负载均衡实现,即轮询方式的负载均衡算法,此类中核心的源码是 choose 方法

public Server choose(ILoadBalancer lb, Object key) {
   if (lb == null) {
        log.warn("no load balancer");
        return null;
    }

    Server server = null;
    int count = 0;
    while (server == null && count++ < 10) {
        List<Server> reachableServers = lb.getReachableServers();
        List<Server> allServers = lb.getAllServers();
        int upCount = reachableServers.size();
        int serverCount = allServers.size();

        if ((upCount == 0) || (serverCount == 0)) {
            log.warn("No up servers available from load balancer: " + lb);
            return null;
        }

        int nextServerIndex = incrementAndGetModulo(serverCount);
        server = allServers.get(nextServerIndex);

        if (server == null) {
            /* Transient. */
            Thread.yield();
            continue;
        }

        if (server.isAlive() && (server.isReadyToServe())) {
            return (server);
        }

        // Next.
        server = null;
    }

    if (count >= 10) {
        log.warn("No available alive servers after 10 tries from load balancer: "
                + lb);
    }
    return server;
}

choose 方法先检查 ILoadBalancer 是否为 null,而 ILoadBalancer 是在此类的父类中定义的:
在这里插入图片描述
choose 方法之后又获取已注册的微服务,并用 server = allServers.get(nextServerIndex); 来获取服务列表中的下一个服务,达到轮询的目的,之后又是在当前获取的服务如果为空时需进行线程礼让,如果当前获取的服务是存活的并且可以提供服务,那么就选取返回这个服务给 Ribbon相关机构,如果当前循环执行次数超过 10 次,那就要在日志中提示此问题。

3.6 Ribbon 选取其他负载均衡算法

返回相应实现类的 Bean 到 Spring 容器中即可:
在这里插入图片描述

3.7 Ribbon 自定义负载均衡算法

写在前面:注意配置细节
在这里插入图片描述
中文文档的相关警告:
在这里插入图片描述

具体步骤:
在这里插入图片描述
2. 在这里新建一个自定义规则的Rubbion类,此处以 RandomRule 类做测试,在公司中可能会要求自定义负载均衡算法,到时候返回自定义的那个负载均衡类即可。
在这里插入图片描述

3. 在主启动类上配置我们自定义的Ribbon,主启动类添加@RibbonClient注解
在这里插入图片描述
3. 启动所有项目,访问测试,看看我们编写的随机算法,现在是否生效即可。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超周到的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值