SpringCloud Ribbon-负载均衡¶
1.Ribbon介绍¶
1.1Ribbon是什么?¶
- SpringCloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端负载均衡的工具
- Ribbon 主要功能是提供客户端负载均衡算法和服务调用
- Ribbon 客户端组件提供一系列完整的配置项如连接超时,重试等
- Ribbon 会基于某种规则(如简单轮询,随机连接等)去连接指定服务
- 程序员很容易使用 Ribbon 的负载均衡软法实现负载均衡
一句话:Ribbon = 负载均衡 + RestTemplate 调用
Ribbon 目前进入维护模式,未来替换方案 是 Spring Cloud LoadBalancer
1.2LB(Load Balance)-负载均衡¶
负载均衡(LB)的分类:
- 集中式LB
即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5,也可以是软件,如Nginx),由该设施负责把访问的请求通过某种策略转发至服务的提供方。
- 进程内LB
将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后再从这些地址中选择出一个合适的服务地址。Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址。
前面 member-consumer 轮询负载访问 10000/10002 底层就是 Ribbon 默认的轮询负载算法
2.Ribbon原理¶
2.1Ribbon架构图&机制¶
Ribbon 机制: 1. 消费者先选择 EurekaServer,它优先选择在同一个区域内负载较少的 server 2. 再根据程序员指定的策略,在从 server 取到的服务注册列表中选择一个地址 3. Ribbon 提供了多种策略∶ 比如轮询、随机和根据响应时间加权。
2.2Ribbon常见负载算法¶
策略名 | 描述 |
---|---|
BestAvailableRule | 选择一个最小并发请求的server。逐个考察server,如果server被tripped(跳闸)了,则忽略,再选择其中ActiveRequestsCount最小的Server |
AvailabilityFilteringRule | 过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的后端server(active connections超过配置的阈值) |
WeightedResponseTimeRule | 根据响应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低 |
RetryRule | 对选定的负载均衡策略机上重试机制。在一个配置时间段内当选择Server不成功,则一直尝试使用subRule的方式选择一个可用的server |
RoundRobbinRule | 轮询index,选择index对应位置的server |
RandomRule | 随机选择一个server,在index上随机,选择index对应位置的server |
ZoneAvoidanceRule | 复合判断server所在区域的性能和server的可用性,来选择server |
3.切换负载均衡算法-应用实例¶
需求:将默认的轮询算法改为随机算法RandomRule,浏览去访问消费方,要求消费方访问服务方端口是随机的
(1)创建消费方的RibbonRule.java,指定负载均衡的策略
package com.li.springcloud.config;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author 李
* @version 1.0
* 配置自己的负载均衡算法
*/
@Configuration
public class RibbonRule {
//注入指定的均衡算法
@Bean
public IRule myRibbonRule(){
//这里指定RandomRule
return new RandomRule();
}
}
(2)在主程序中使用注解指定Ribbon的配置
在上面RibbonRule的配置是全局的,不在主程序中配置也可以使用,这里在主程序中指定只是更加明确