SpringCloud Ribbon组成和负载均衡规则

### Ribbon饥饿加载
> 默认情况下Ribbon是懒加载的。当服务起动好之后,第一次请求是非常慢的,第二次之后就快很多。

#### 解决方式:开启饥饿加载
```yml
ribbon:
eager-load:
enabled: true #开启饥饿加载
clients: server-1,server-2,server-3 #为哪些服务的名称开启饥饿加载,多个用逗号分隔
```

### Ribbon组成
| 接口 | 作用 | 默认值 |
| ------------ | ------------ | ------------ |
| `IclientConfig` | 读取配置 | `DefaultClientConfigImpl` |
| `IRule` | 负载均衡规则,选择实例 | `ZoneAvoidanceRule` |
| `IPing` | 筛选掉ping不通的实例 | `DumyPing`(该类什么不干,认为每个实例都可用,都能ping通) |
| `ServerList` | 交给Ribbon的实例列表 | **Ribbon:**`ConfigurationBasedServerList`
**Spring Cloud Alibaba:**`NacosServerList` |
| `ServerListFilter` | 过滤掉不符合条件的实例 | `ZonePreferenceServerListFilter` |
| `ILoadBalancer` | Ribbon的入口 | `ZoneAwareLoadBalancer` |
| `ServerListUpdater` | 更新交给Ribbon的List的策略 | `PollingServerListUpdater` |

**这里的每一项都可以自定义**
`IclientConfig`Ribbon支持非常灵活的配置就是由该组件提供的
`IRule`为Ribbon提供规则,从而选择实例、该组件是最核心的组件
**举例:**
代码方式
```java
@Configuration
public class RibbonRuleConfig {
@Bean
public IRule ribbonRulr() {
return new RandomRule();
}
@Bean
public IPing iPing(){
return new PingUrl();
}
}
```
配置属性方式
```yml
:
ribbon:
NFLoadBalancerClassName: #ILoadBalancer该接口实现类
NFLoadBalancerRuleClassName: #IRule该接口实现类
NFLoadBalancerPingClassName: #Iping该接口实现类
NIWSServerListClassName: #ServerList该接口实现类
NIWSServerListFilterClassName: #ServiceListFilter该接口实现类
```
**在这些属性中定义的类优先于使用`@RibbonClient(configuration=RibbonConfig.class)`Spring 定义的bean 以及由Spring Cloud Netflix提供的默认值。描述:配置文件中定义ribbon优先代码定义**

### Ribbon负载均衡的八种算法,其中~~`ResponseTimeWeightedRule`~~已废除
| 规则名称 | 特点 |
| ------------ | ------------ |
| `AvailabilityFilteringRule` | 过滤掉一直连接失败的被标记为circuit tripped(电路跳闸)的后端Service,并过滤掉那些高并发的后端Server或者使用一个AvailabilityPredicate来包含过滤Server的逻辑,其实就是检查status的记录的各个Server的运行状态 |
| `BestAvailableRule` | 选择一个最小的并发请求的Server,逐个考察Server,如果Server被tripped了,则跳过 |
| `RandomRule` | 随机选择一个Server |
| ~~`ResponseTimeWeightedRule`~~ | 已废弃,作用同WeightedResponseTimeRule |
| `RetryRule` | 对选定的负责均衡策略机上充值机制,在一个配置时间段内当选择Server不成功,则一直尝试使用subRule的方式选择一个可用的Server |
| `RoundRobinRule` | 轮询选择,轮询index,选择index对应位置Server |
| `WeightedResponseTimeRule` | 根据相应时间加权,相应时间越长,权重越小,被选中的可能性越低 |
| `ZoneAvoidanceRule` | (默认是这个)负责判断Server所Zone的性能和Server的可用性选择Server,在没有Zone的环境下,类似于轮询(`RoundRobinRule`) |

### 实现负载均衡配置-随机

#### 方式一:JAVA代码方式
首先定义RestTemplate,并且添加注解`@LoadBalanced`,这样RestTemplate就实现了负载均衡
```java
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
//template.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));//解决中文乱码
return new RestTemplate();
}
```

在SpringBootApplication主类下添加配置类。该类主要作用于为哪个服务做负载均衡。默认的是轮训
```java
@Configuration
@RibbonClient(name = "${服务名称}", configuration = GoodsRibbonRuleConfig.class)//configuration: 指向负载均衡规则的配置类
public class GoodsRibbonConfig {
}
```

添加Ribbon的配置类,注意该类必须配置在`@SpringBootApplication`主类以外的包下。不然的话所有的服务都会按照这个规则来实现。会被所有的RibbonClient共享。主要是主类的主上下文和Ribbon的子上下文起冲突了。父子上下文不能重叠。相关连接:https://blog.csdn.net/qq_32588349/article/details/52097943
```java
@Configuration
public class GoodsRibbonRuleConfig {
@Bean
public IRule ribbonRulr() {
return new RandomRule();
}
}
```
或者使用自定义注解排除该类

#### 方式一:配置属性方式
```yml
server-1: # 服务名称 Service-ID
ribbon:
# 属性配置方式【推荐】
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 配置文件配置负载均衡算法-我这里使用的是自定义的Ribbon的负载均衡算法,默认
```
**优先级:配置(不会影响其他服务)>(大于) 硬编码(类得写在SpringBoot启动类包外,不然会影响其他服务)**

#### 总结:
| 配置方式 | 有点 | 缺点 |
| ------------ | ------------ | ------------ |
| 代码配置 | 基于代码,更加灵活 | 有坑(父子上下文)
线上修改得重新打包,发布 |
| 属性配置 | 易上手 配置更加直观
线上修改无需重新打包,发布
**优先级更高** | 极端场景下没有配置配置方式灵活 |

### 实现负载均衡配置-随机

#### 方式一:Ribbon的配置类定义在主类下
~~让ComponentScan上下文重叠(**强烈不建议使用**)~~
#### 方式二:
```java
@Configuration
@RibbonClients(defaultConfiguration = GoodsRibbonRuleConfig.class)//Ribbon负载均衡全局粒度配置(所有服务都按照这个配置)
public class RibbonConfig {
}
```
[赵小胖个人博客](https://zc.happyloves.cn:4443/wordpress/)

原文地址:https://www.cnblogs.com/Sky0914/p/11651354.html

时间: 2024-07-29 21:19:14

SpringCloud Ribbon组成和负载均衡规则的相关文章

撸一撸Spring Cloud Ribbon的原理-负载均衡策略

在前两篇<撸一撸Spring Cloud Ribbon的原理>,<撸一撸Spring Cloud Ribbon的原理-负载均衡器>中,整理了Ribbon如何通过负载均衡拦截器植入RestTemplate,以及调用负载均衡器获取服务列表,如何过滤,如何更新等的处理过程. 因为,负载均衡器最终是调用负载均衡策略的choose方法来选择一个服务,所以这一篇,整理Ribbon的负载均衡策略. 策略类 RandomRule RoundRobinRule RetryRule WeightedR

Ribbon自带负载均衡策略比较

Ribbon自带负载均衡策略比较 策略名 策略声明 策略描述 实现说明 BestAvailableRule public class BestAvailableRule extends ClientConfigEnabledRoundRobinRule 选择一个最小的并发请求的server 逐个考察Server,如果Server被tripped了,则忽略,在选择其中ActiveRequestsCount最小的server AvailabilityFilteringRule public clas

Spring Cloud Ribbon实现客户端负载均衡

1.构建microservice-consumer-movie-ribbon项目,在pom.xml中引入ribbon依赖 在引入Eureka依赖的时候,默认里面含有ribbon依赖 2.添加@LoadBalanced注解,实现负载均衡 ribbon负载均衡策略默认为轮循方式 @SpringBootApplication @EnableEurekaClientpublic class ConsumeMovieRibbonApplication { public static void main(S

springcloud的两种负载均衡策略

前言: 之前写了通过Ribbon+RestTemplate实现调用服务,此处我再系统的说一下两者的区别 一.springcloud的负载均衡策略 1.Ribbon 是基于Netflix Ribbon实现的一套客户端 负载均衡的工具,类似Nginx主要功能时提供客户端的软件负载均衡算法LB就是负载均衡,集中式(F5),进程内(Nginx),消费者可以自动看从Eureka中拿到对应的服务列表,默认进行轮询RoundRobinRule 下图是RestTemplate的自带的7中均衡策略 我们在之前通过

SpringCloud学习系列-Feign负载均衡(2)

Feign使用步骤 1.参考microservicecloud-consumer-dept-80   新建microservicecloud-consumer-dept-feign 修改主启动类名字DeptConsumer80_Feign_App 2.microservicecloud-consumer-dept-feign工程pom.xml修改,主要添加对feign的支持 <dependency> <groupId>org.springframework.cloud</gr

(05)SpringCloud实战之Feign负载均衡

一.概述 1.官方解释 Feign是一个声明式WebService客户端.使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解.Feign也支持可拔插式的编码器和解码器.Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters.Feign可以与Eureka和Ribbon组合使用以支持负载均衡. 通俗的说,Feign是一个声明式的Web

SpringCloud学习(5)——Feign负载均衡

Feign概述 Feign是声明式的Web服务客户端, 使得编写Web服务客户端变的非常容易, 只需要创建一个接口, 然后在上面添加注解即可. Feign旨在使编写Java Http客户端变的更容易. 在使用Ribbon+RestTemplate时, 利用RestTemplate对http请求的封装处理, 形成了一套模板化的调用方法.但是在实际开发中, 由于对服务依赖的调用可能不止一处, 往往一个接口会被多出调用, 所以通常都会针对每个微服务自行封装一些客户端类来包装这些以来服务的调用.所以Fe

Spring Cloud(十四):Ribbon实现客户端负载均衡及其实现原理介绍

年后到现在一直很忙,都没什么时间记录东西了,其实之前工作中积累了很多知识点,一直都堆在备忘录里,只是因为近几个月经历了一些事情,没有太多的经历来写了,但是一些重要的东西,我还是希望能坚持记录下来.正好最近公司用到了一些本篇文章的知识点,所以就抽空记录一下. 本文代码github地址:https://github.com/shaweiwei/RibbonTest/tree/master 简介 ribbon 是一个客户端负载均衡器,它和nginx的负载均衡相比,区别是一个是客户端负载均衡,一个是服务

SpringCloud系列五:Ribbon 负载均衡(Ribbon 基本使用、Ribbon 负载均衡、自定义 Ribbon 配置、禁用 Eureka 实现 Ribbon 调用)

1.概念:Ribbon 负载均衡 2.具体内容 现在所有的服务已经通过了 Eureka 进行了注册,那么使用 Eureka 注册的目的是希望所有的服务都统一归属到 Eureka 之中进 行处理,但是现在的问题,所有的微服务汇集到了 Eureka 之中,而客户端的调用也应该通过 Eureka 完成.而这种调用就可以利用 Ribbon 技术来实现. Ribbon 是一个服务调用的组件,并且是一个客户端实现负载均衡处理的组件.服务器端实现负载均衡可以使用 Nginx. HAProxy.LVS 等. 2