Ribbon 负载均衡介绍

什么是Ribbon:
目前比较主流的负载方案有以下两种:

  • 集中式负载均衡,在消费者和服务提供方中间使用独立的代理方式进行负载,有硬件的(F5),也有软件的(Nginx)
  • 客户端根据自己的请求情况做负载均衡,Ribbon就属于客户端的负载均衡。

Spring Cloud Ribbon是基于Netfix Ribbon实现的一套客户端的负载均衡工具,Ribbon客户端组件提供一系列完善的配置,如超时,重试等。通过LoadBalancer获取到服务提供的所有机器实例,Ribbon会自动机遇某种规则(轮询,随机)去调用这些服务,Ribbon也可以实现我们自己的负载均衡。

客户端的负载均衡

例如spring cloud中的Ribbon。客户端会有一个服务器地址的列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,这是客户端的负载均衡,即在客户端进行负载均衡算法分配
Ribbon - 图1

服务端的负载均衡

例如nginx,通过nginx进行负载均衡,先发送请求,然后通过负载均衡算法,在多个服务器之间选择一个进行访问,即在服务端在进行负载均衡算法的分配。
Ribbon - 图2

常见的负载均衡算法

  • 随机:通过速记选择服务器进行执行,一般这种方式使用的比较少
  • 轮训:负载均衡默认实现方式,请求来之后排队处理
  • 加权轮询:通过对服务器性能的分型,给高配置、低负载的服务器分配更高的权重,均衡各个服务器的压力
  • 地址Hash:通过客户端请求的地址的HASH值取模映射 进行服务器的调度 ip_hash
  • 最小连接数:即使请求均衡了,压力不一定会均衡,最小连接数就是根据服务器的情况,比如请求积压数等参数,将请求分配到当前压力最小服务器上,最小活跃数。

Ribbon 默认的负载均衡器

Nacos-discovery依赖了ribbon,可以不用在引入ribbon依赖
添加@LoadBalanced注解

  1. @Bean
  2. @LoadBalanced //负载均衡器
  3. public RestTemplate restTemplate(RestTemplateBuilder builder){
  4. RestTemplate restTemplate = builder.build();
  5. return restTemplate;
  6. }

修改controller

  1. @Autowired
  2. RestTemplate restTemplate;
  3. @RequestMapping("/add")
  4. public String add(){
  5. System.out.println("下单成功!");
  6. //使用远程工具进行调用
  7. // String message = restTemplate.getForObject("http://localhost:8011/stock/reduce", String.class);
  8. //使用nacos注册服务中心发现调用订单系统
  9. String message = restTemplate.getForObject("http://stock-service/stock/reduce", String.class);
  10. System.out.println(message);
  11. return "Hello World"+message;
  12. }

RandomRule:随机选择一个服务实例
RoundRobinRule:轮询负载均衡策略
RetryRule:在轮询的功能上重试
WeightedResponseTimeRule:权重,nacos的NacosRule,Nacos还扩展了一个机遇自己的机遇配置的权重扩展
ClientConfigEnabledRoundRobbinRule
BestAvalilableRule:过滤掉失效的服务实例功能,然后顺便找出兵伐亲故最小的服务实例来使用
ZoneAvoidanceRule:(默认规则,符合判断server所在的区域的性能和server的可用性能选择器)
AvailabilityFilterringRule:先过滤掉故障实例,在选择并发较小的实例

Ribbon 修改默认均衡策略

  1. 配置类(不建议使用)

    1. @Configuration
    2. public class RibbonConfig{
    3. /**
    4. * 全局配置,指定负载均衡策略
    5. */
    6. @Bean
    7. public IRule iRule(){
    8. //指定使用Nacos提供的负载均衡策略(优先调用统一集群的实例,基于随机权重)
    9. return new NacosRule();
    10. }
    11. }


注意:此处有坑,不能写在@SpringbootAoolication注解的@CompentScan扫描到的地方,否则自定义配置类会被所有的RibbonClients共享,不建议这么使用,推荐yml
利用@RibbonClient指定微服务及区负载均衡策略

  1. 配置文件
    调用指定的微服务提供的服务时,使用对应的负载均衡算法
    修改对应的application.yml
    1. #被调用的服务名
    2. stock-service:
    3. ribbon:
    4. #指定使用Nacos提供的负载均衡策略(优先调用统一集群的实例,基于随机&权重)
    5. NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule

Ribbon 自定义负载均衡策略

通过实现IRule接口可以自定义负载均衡策略,主要的选择服务逻辑在choose方法中
开启ribbon饥饿加载

  1. ribbon:
  2. eager-load:
  3. #开启加载
  4. enable: true
  5. #配置服务名,多个用逗号分隔
  6. clients: stock-order

Ribbon 使用LoadBalancer替换Ribbon(目前替换后无意义)

1. 什么是Spring Cloud LoadBalancer

Spring Cloud LoadBalancer是spring Cloud官方自己提供的客户端负载均衡器,用来代替Ribbon
Spring官方提供了两种负载均衡的客户端:
RestTemplate
RestTemplate是Spring官方提供用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大的提高客户端的编写效率,默认情况下,RestTemplate默认依赖jdk的HTTP连接工具

WebClient
WebClient是从Spring 5.x版本开始提供的一个非阻塞的基于响应式编程的进行Http请求客户端工具,他的响应式编程基于Reactor的。WebClient中提供了标准的HTTP的请求以用来发器相应的请求。

2. RestTemplate整合LoadBalancer

引入依赖
在对应的客户端操作

  1. <!--增加服务注册中心发现-->
  2. <dependency>
  3. <groupId>com.alibaba.cloud</groupId>
  4. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  5. <!--排除ribbon负载均衡方一-->
  6. <exclusions>
  7. <exclusion>
  8. <groupId>org.springframework.cloud</groupId>
  9. <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
  10. </exclusion>
  11. </exclusions>
  12. <!--<version></version>-->
  13. </dependency>
  14. <!--添加LoadBalanced依赖-->
  15. <dependency>
  16. <groupId>org.springframework.cloud</groupId>
  17. <artifactId>spring-cloud-starter-loadbalancer</artifactId>
  18. </dependency>

禁用ribbon负载均衡

  1. # 给对应的服务起一个名称(nacos会将改名称当作服务名称)
  2. spring:
  3. application:
  4. name: order-service
  5. cloud:
  6. nacos:
  7. #server-addr: 111.229.181.158:8848 #配置nacos的服务地址
  8. server-addr: 111.229.181.158:8847 #修改配置nacos的服务地址为nginx的集群地址
  9. discovery:
  10. username: nacos #用户名
  11. password: nacos #密码
  12. namespace: public # 命名空间
  13. loadbalancer:
  14. #设置禁用ribbon
  15. ribbon:
  16. enabled: false

其他

百度网盘链接 密码: f26l