文章目录
- 1 Ribbon 是什么
- 2 Ribbon 能做什么
- 3 项目实战
- 3.1 项目搭建
- 3.2 Ribbon 架构图示
- 3.3 Ribbon 负载均衡:轮询方式
- 3.4 Ribbon 各种负载均衡算法
- 3.5 源码分析:RoundRobinRule 负载均衡算法
- 3.6 Ribbon 选取其他负载均衡算法
- 3.7 Ribbon 自定义负载均衡算法
1 Ribbon 是什么
2 Ribbon 能做什么
3 项目实战
3.1 项目搭建
我们以【Spring Cloud】RestTemplate:学习总结、项目实战:服务提供者与服务消费者 中的服务消费者 springcloud-consumer-dept-8002 模块为基础,在此项目的基础上进行内容的改造和 Ribbon 的学习。
添加红框中的依赖
同时,因为 Ribbon 要去注册中心或者说是服务中心去获取信息,而注册中心由 Eureka 担任,因此自然也要导入 Eureka 的依赖
在 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 方法:
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. 启动所有项目,访问测试,看看我们编写的随机算法,现在是否生效即可。