Ribbon负载均衡
一、ribbon是什么?
- SpringCloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡工具。
- 简单的说,Ribbon 是 Netflix 发布的开源项目,主要功能是提供 客户端的软件负载均衡算法。 Ribbon 客户端组件提供一系列完善的配置项如超时、重试等。简单的说,就是配置文件中列出 load Balancer (简称 LB 负载均衡)后面所有的机器,Ribbon 会自动的帮助你基于某种规则(如简单轮询,随机链接等)去链接这些机器。我们很容易使用 Ribbon 自定义的负载均衡算法。
- 官方 GitHub:https://github.com/Netflix/ribbon
- 目前已停止维护,但仍然很多公司在用。替代方案 ——Spring Cloud Loadbalancer
二、负载均衡
LB 负载均衡(Load Balance)
简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的 HA(高可用)。
Ribbon本地负载均衡客户端 与 Nginx服务端负载均衡区别。
- Nginx 是服务器负载均衡,客户端所有请求都会交给 nginx, 然后 nginx 实现转发请求。即负载均衡是由服务端实现的。
- Ribbon 本地负载均衡,在调用微服务接口的时候,会在注册中心上获取注册信息服务列表后缓存到 JVM 本地,从而在本地实现 RPC 远程 服务调用技术。
负载均衡简单分类:
- 集中式LB
- 即在服务的消费方和提供方之间使用独立的 LB 设施(可以是硬件,如 F5。也可以是软件如 Nginx ), 由该设置负责把访问请求通过某种策略转发至服务的提供方。
- 进程式LB
- 将 LB 逻辑集成到消费方,消费方从服务注册中心获取有哪些地址可用,然后自己再从这些地址中选择一个适合的服务器。
- Ribbon 就属于进程内 LB,它只是一个类库,集成于消费方进程,消费方通过它阿莱获取服务提供方的地址。
总结:
Ribbon 其实就是一个软负载均衡的客户端组件,他可以和其他所需请求的客户端结合使用,和 eureka 结合只是其中的一个实例。
Ribbon 在工作时分为两步:
- 第一步先选择 EurekaServer, 它优先选择在同一个区域呢负载较少的 Server
- 第二步在根据用户执行的策略,在从 server 取到的服务注册列表中选择一个地址。
其中 Ribbon 提供了多种策略:比如轮询、随机和更具响应时间加权。
在 spring-cloud-starter-netflix-eureka-client 中自带了 spring-cloud-starter-ribbon
负载均衡默认轮询的方式,实际上就是 Ribbon + RestTemplate。
在配置 RestTemplate Bean 时使用 @LoadBalanced 注解,这就是开启了负载均衡。
关于 RestTemplate 这里面有大佬写的详细教程。
三、使用Ribbon
在springcloud-consumer-dept-80项目中(消费者项目,也即客户端项目),设置以下东西
3.1.配置pom文件
1 | <!--Ribbon--> |
3.2.配置文件
1 | server: |
3.3.主启动类开启Eureka
1 |
|
3.4.配置类中配置负载均衡
1 |
|
3.5.Controller层 使用
1 |
|
3.6.启动当前消费者项目, 输入 http://localhost/consumer/dept/get/2 看效果(结果和 章节3中搭建的基础框架输出的内容一样)
四、负债均衡——集群环境搭建
4.1.建立数据库db02、db03。
分别建表dept,表中的数据和db01中的一致(所在的库对应当前库)。
4.2.建立服务提供者springcloud-provider-dept-8002,springcloud-provider-dept-8003
内容与springcloud-provider-dept-8001的内容一样,只是配置文件需要改端口号、对应数据库。
以springcloud-provider-dept-8002为例,修改后如下。
1 | server: |
4.3.结构图如下:
4.4.启动所有项目。
访问Eureka注册中心,以7001注册中心服务器为例子。
访问服务消费者,查询所有的链接:http://localhost/consumer/dept/list(不停刷新链接,会发现结果一直在以下3个页面循环。可以得知,Ribbon默认采用的是轮询算法)
五、自定义负载均衡算法
负载均衡策略IRule接口有以下实现:
- AvailabilityFilteringRule 会先过滤掉崩溃的服务,对剩下的进行轮询
- RoundRobinRule 轮询
- RandomRule 随机
- RetryRule 会先按照轮询获取服务,若某服务获取失败,则会在指定的时间内进行重试。
以随机算法为例:(要在服务消费者端,即springcloud-consumer-dept-80项目中)
5.1.调用Ribbon写好的随机负载均衡算法。
注:自己写的组件,不能放在启动类所在包下。(SpringBoot默认包扫描机制:从启动类所在包开始,扫描当前包,以及当前包的子级包下的所有文件)
1 |
|
5.2.在主启动类下,加载自定义的负载均衡算法。(@RibbonClient)
1 |
|
项目结构: