# Ribbon学习(一)——Ribbon负载均衡、基础使用、负载均衡策略
[TOC]
## 什么是负载均衡
负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,而我们常见的负载均衡分为**服务器负载均衡**和**客户端负载均衡**
**服务器负载均衡**:
- ⽐如Nginx、F5这些,请求到达服务器之后由这些负载均衡器根据⼀定的算法将请求路由到目标服务器处理。
**客户端负载均衡**:
- 例如Ribbon,服务消费者客户端会有⼀个服务器地址列表,调用方在请求前通过⼀定的负载均衡算法选择⼀个服务器进行访问,负载均衡算法的执行是在请求客户端进行。

## Ribbon基本使用
在Eureka的基础上,我们使用Ribbon是不需要引入其他依赖的,因为Eureka中已经引入了Ribbon的依赖,如下图:

而使用Ribbon也很简单,在对应的RestTemplate上标上注解:@LoadBalanced 即可
```java
@Bean
// Ribbon负载均衡
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
```
之前我们使用eureka访问服务端,是需要手工指定一个服务端地址的,现在我们使用了Ribbon,可以直接用服务名称指定服务端地址,Ribbon会自动为我们选择一个服务端实例

结果:

### Ribbon中的负载策略
Ribbon内置了多种负载均衡策略,内部负责复杂均衡的顶级接口为 com.netflix.loadbalancer.IRule类树如下

| 负载均衡策略 | 负载均衡描述 |
| --------------------------------------------- | ------------------------------------------------------------ |
| RoundRobinRule:轮询策略 | 默认循环超过10次都获取不到server实例的话,则返回一个空的实例 |
| BestAvaiableRule:最小存活数策略 | 遍历从Eureka中获取的服务端列表,选取出可用的且连接数最小的一个server。该算法中有一个LoadBalancerStats的成员变量,会存储所有的server的运行状况和连接数,如果选取到的server为null,那么会调用RoundRobinRule重新选取server |
| ZoneAvoidanceRule(**默认策略**):区域权衡策略 | 自动过滤超时和连接数过多的server,过滤掉不符合zone区域里面的节点,因为netflix以前是多机房跨区域的,为了提升效率,就会默认使用区域权衡策略,但是国内基本上都是只有一个区域。 |
| RandomRule:随机策略 | 如果随机到的server正好为null或者不可用的时候,会无线循环while进行选取server |
| RetryRule:重试策略 | 一定时限内循环重试,RetryRule会在每次选取之后,对选举的server进⾏判断,是否为null,是否alive,并且在500ms内会不停的选取判断。⽽RoundRobinRule失效的策略是超过10次,RandomRule是没有失效时间的概念,只要serverList没都挂。 |
| | |
#### 修改负载均衡策略
```yaml
#针对的被调⽤⽅微服务名称,不加就是全局⽣效
lagou-service-resume:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载策略调整
```
Ribbon学习(一)——Ribbon负载均衡、基础使用、负载均衡策略