Spring Cloud 教程

Spring Cloud 笔记

Spring Cloud 负载均衡详解(策略、配置、算法等)


Spring Cloud 负载均衡(LB)是微服务思想中的重要模块,它的作用是将大量作业合理地分摊到多个操作单元上进行执行,用于解决互联网架构中的高并发高可用的问题。从 Spring Cloud 简介的表格中可知,当前 Spring Cloud 的负载均衡有如下几个主流实现,Netflix 的 Ribbon、官方推出的 Spring Cloud LoadBalancer 以及阿里巴巴的 Dubbo LB 等。

Ribbon

spring cloud ribbon 是 Netflix 实现的一个客户端负载均衡处理的组件。由于 spring-cloud-netflix 整体进入维护模式,spring-cloud-netflix-ribbon 也进入了维护模式,不再进行进一步开发。

负载均衡策略

ribbon 提供了如下 7 种负载均衡策略,它们都继承了抽象类 AbstractLoadBalancerRule,具体如下表:

负载均衡策略
策略类 策略描述
AvailabilityFilteringRule 过滤掉连接失败的服务节点,并且过滤掉高并发的服务节点,然后从健康的服务节点中,使用轮询策略选出一个节点返回。
BestAvailableRule 选择一个并发量最小的服务节点。
RandomRule 在当前可用节点中随机选择一个服务节点。
RetryRule 在基于当前的负载均衡策略加上重试机制。
RoundRobinRule 用轮询的方式选择可用的服务节点。
WeightedResponseTimeRule 根据响应时间,给服务节点分配一个权重 weight,响应时间越长,weight 越小,则被选中的可能性越低。
ZoneAvoidanceRule 综合判断 server 所在区域的性能和 server 的可用性,来选择 server 返回。

ribbon 配置

通过 starter 形式,导入 ribbon 相关的 jar 包,具体如下:

maven 项目:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

gradle 项目:

compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-netflix-ribbon'

ribbon 本身内部源码也分成了几个模块,具体如下:

ribbon 模块
模块 描述
ribbon 内置的负载均衡算法都实现在其中。
ribbon-core 顾名思义,核心且具有通用性的代码,客户端 API 的一些配置和其他 API 的定义。
ribbon-httpclient 基于 Apache HttpClient 封装的 Rest 客户端,集成了负载均衡模块,可以直接在项目中使用来调用接口。
ribbon-loadbalancer 负载均衡模块,可独立使用,也可以和别的模块一起使用。
ribbon-transport 基于 Netty 实现多协议的支持,比如 Http、TCP、UDP 等。

在实际的使用场景中,我们往往会使用重试机制,这种重试机制在使用 ribbon 时,是在 ribbon 的作用范围内,具体使用如下:

在 application.yml 里增加允许重试的设置:

spring:
  cloud:
    loadbalancer:
      retry:
        enabled: true

具体重试策略配置如下:

ribbon:
  ConnectTimeout: 20000
  ReadTimeout: 500
  # 同一实例最大重试次数,不包括首次调用
  MaxAutoRetries: 1
  # 重试其他实例的个数,包括首次调用的 server
  MaxAutoRetriesNextServer: 2
  # 是否所有操作都进行重试(和接口的幂等性有关)
  OkToRetryOnAllOperations: false

关于 ribbon 的具体重试信息可以参考 Spring Cloud Ribbon 重试机制及相关配置