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-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 重试机制及相关配置。