Ribbon
- 1. 什么是Ribbon
- 1.1 客户端的负载均衡
- 1.2 服务端的负载均衡
- 1.3 常见负载均衡算法
- 2. Nacos使用了Ribbon
- 2.1 🎯 @LoadBalanced 做了什么?
- 3. Ribbon负载均衡策略与支持的算法
- 3.1 修改默认负载均衡策略
- 4. 自定义负载均衡策略
- 5. 使用LoadBalancer替换Ribbon
- 5.1 RestTemplate整合LoadBalancer
1. 什么是Ribbon
目前主流的负载均衡方案可以分为以下两种:
- 集中式负载均衡器,在消费者和服务提供方中间使用独立的代理方式进行负载,有应该的(比如F5)还有软件的如Nginx
- 客户端根据自己的请求情况做负载均衡,Ribbon就属于客户端自己做负载均衡
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端的负载均衡工具,Ribbon客户端组件提供一系列的完善的配置,如超时,重试等。通过Load Balancer获取到服务提供的所有机器实例,Ribbon会自动基于某种规则(轮询,随机)去调用这些服务。Ribbon也可以实现我们自己的负载均衡算法。
1.1 客户端的负载均衡
例如Spring Cloud中的Ribbon,客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,这是客户端负载均衡;即在客户端就进行负债均衡算法分配。
1.2 服务端的负载均衡
例如Nginx,通过Nginx进行负载均衡,先发送请求,然后通过负载均衡算法,在多个服务器直接按选择一个进行访问;即在服务器端再进行负载均衡算法分配。
1.3 常见负载均衡算法
- 随机,通过随机选择服务进行执行
- 轮询,负载均衡默认的实现方式,请求之后排队处理
- 加权轮询,通过对服务器新能分型,给高配置,低负载的服务器分配更高的权重,均衡各个服务器的压力
- 地址hash,通过客户端请求的地址的HASH值取模映射进行服务器调度。ip hash
- 最小链接数,即使请求均衡,压力不一定会均衡,最小连接数法就是根据服务器的情况,比如请求积压数等参数,将请求分配到当前压力最小的服务器上。
2. Nacos使用了Ribbon
Nacos中默认就集成了Ribbon,如下图所示
如下使用@LoadBalanced就开启了负载均衡
@ConfigurationpublicclassRestConfig{@Bean@LoadBalancedpublicRestTemplaterestTemplate(){returnnewRestTemplate();}}2.1 🎯 @LoadBalanced 做了什么?
它会给 RestTemplate自动注入一个 LoadBalancerInterceptor,让 RestTemplate 支持:
✔️服务名调用(自动从注册中心获取实例)
例如调用:
restTemplate.getForObject("http://user-service/api/user/1",String.class);其中 user-service 并不是域名,而是服务名。
🎯Spring Cloud 会:
- 从注册中心(Nacos/Eureka)获取 user-service 的所有实例列表
- 使用 Load Balancer(Ribbon、Spring Cloud LoadBalancer)根据策略 轮询 / 随机 / 权重选择一个实例
- 将最终 URL 转换为:
http://192.168.1.10:8080/api/user/1- 发起真实请求
3. Ribbon负载均衡策略与支持的算法
3.1 修改默认负载均衡策略
全局配置:调用其他微服务,一律使用指定的负载均衡算法。
1.配置类
========补充图===============
2.配置文件
调用指定微服务提供的服务时,使用对应的负载均衡算法。
修改application.yml
4. 自定义负载均衡策略
只需要我们都来实现IRule或者实现AbstractLoadBalancerRule
实现基于Nacos权重的负载均衡策略
5. 使用LoadBalancer替换Ribbon
Spring Cloud LoadBalancer是Spring Cloud官方自己提供的客户端负载均衡器,用来替代Ribbon。
Spring官方提供了两种负载均衡的客户端:
1. Rest Template
RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Htp服务的方法,能够大大提高客户端的编写效率。默认情;况下,RestTemplate默认依赖jdk的HTTP连接工具。
2. WebClient
Webclient是从Spring WebFlux 5.0版本开始提供的一个非阻塞的基于响应式编程的进行Http请求的容户端工具。它的响应式编程的基于Reactor的。WebClient中提供了标准Http请求方式对应的get、post、put、delete等方法,可以用来发起相应的请求。
5.1 RestTemplate整合LoadBalancer
1. 引入依赖
注意这里的父,也需要加上spring-cloud的版本
然后自定义一个LoadBalance的配置类
@ConfigurationpublicclassRestTemplateConfig{@Bean@LoadBalanced// 核心,一行开启 Spring LoadBalancerpublicRestTemplaterestTemplate(){returnnewRestTemplate();}}⭐ Bonus:如果你想换成随机策略
加一个自定义配置即可:
@ConfigurationpublicclassMyLoadBalancerConfig{@BeanReactorLoadBalancer<ServiceInstance>randomLoadBalancer(Environmentenv,LoadBalancerClientFactoryfactory){StringserviceName=env.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);returnnewRandomLoadBalancer(factory.getLazyProvider(serviceName,ServiceInstanceListSupplier.class),serviceName);}}application.yml:
spring:cloud:loadbalancer:configurations:provider-service:myLoadBalancerConfig