在 Spring Cloud LoadBalancer 中,ReactorLoadBalancer 是响应式负载均衡器的核心接口,定义了基于响应式编程模型(Project Reactor)的服务实例选择逻辑,是实现客户端负载均衡策略(如轮询、随机、加权等)的核心抽象。它与 ServiceInstanceListSupplier 协同工作,从实例列表中选择最优实例,为服务间调用提供负载均衡能力。
作为 “负载均衡策略的执行者”,ReactorLoadBalancer 负责从 ServiceInstanceListSupplier 提供的实例列表中,根据特定策略(如轮询、随机)选择一个实例,供后续请求调用。
ReactorLoadBalancer 基于 Flux/Mono 响应式流,适配异步、非阻塞的服务调用场景(如 WebFlux),支持高并发和低延迟。
📢 注意:用户可以通过实现该接口,可自定义负载均衡策略(如基于权重、健康度、区域的复杂策略),替代默认的轮询策略。
接口定义如下:
package org.springframework.cloud.loadbalancer.core;
import reactor.core.publisher.Mono;
import org.springframework.cloud.client.loadbalancer.Request;
import org.springframework.cloud.client.loadbalancer.Response;
import org.springframework.cloud.client.loadbalancer.reactive.ReactiveLoadBalancer;
public interface ReactorLoadBalancer<T> extends ReactiveLoadBalancer<T> {
/**
* 根据负载均衡算法选择下一个合适的服务实例。
*
* 该方法接收一个请求对象作为参数,负载均衡器可根据请求中的上下文信息(如请求参数、元数据等)
* 进行动态决策,返回一个包含选中服务实例的响应式 Mono 流。
*
* @param request 负载均衡请求对象,包含请求相关的上下文信息
* @return 响应式 Mono 流,发射负载均衡选择结果(Response 中包含选中的服务实例或空值)
*/
@SuppressWarnings("rawtypes")
Mono<Response<T>> choose(Request request);
/**
* 无参重载方法,使用默认请求对象执行负载均衡选择。
*
* 该默认方法调用带参的 choose 方法,并传入一个全局默认的 Request 实例,
* 适用于无需请求上下文信息的场景,简化调用方式。
*
* @return 响应式 Mono 流,发射负载均衡选择结果
*/
default Mono<Response<T>> choose() {
return choose(REQUEST);
}
}从源码可以得知,ReactorLoadBalancer 接口继承了 ReactiveLoadBalancer 接口。
继承关系图如下图:

ReactiveLoadBalancer 是响应式负载均衡器的基础抽象接口,定义了响应式负载均衡逻辑的核心规范,为所有响应式负载均衡实现提供了统一的行为契约。它是 Spring Cloud 响应式生态(如 WebFlux、Reactive Feign 等)中负载均衡能力的顶层接口,其设计聚焦于异步非阻塞场景,与 Reactor 响应式编程模型深度融合。
接口定义如下:
package org.springframework.cloud.client.loadbalancer.reactive;
import java.util.Map;
import org.reactivestreams.Publisher;
import org.springframework.cloud.client.loadbalancer.DefaultRequest;
import org.springframework.cloud.client.loadbalancer.DefaultRequestContext;
import org.springframework.cloud.client.loadbalancer.LoadBalancerProperties;
import org.springframework.cloud.client.loadbalancer.Request;
import org.springframework.cloud.client.loadbalancer.Response;
public interface ReactiveLoadBalancer<T> {
/**
* 默认的请求实例
* 使用 DefaultRequest 包装 DefaultRequestContext 作为上下文。
* 用于无参的 choose() 方法,适用于无需自定义请求上下文的场景。
*/
Request<DefaultRequestContext> REQUEST = new DefaultRequest<>();
/**
* 根据负载均衡算法从可用服务实例中选择合适的节点。
*
* 该方法接收请求对象作为参数,可根据请求中的上下文信息(如服务标识、元数据等)动态决策,
* 返回一个响应式流(Publisher),其中包含选中的服务实例或无可用实例的结果。
*
* @param request 包含请求上下文信息的负载均衡请求对象
* @return 响应式流(Publisher),发射负载均衡选择结果(Response<T>)
*/
@SuppressWarnings("rawtypes")
Publisher<Response<T>> choose(Request request);
/**
* 无参重载方法,使用默认请求实例执行负载均衡选择。
*
* 该默认方法调用带参的 choose(Request) 方法,并传入全局默认的 REQUEST 实例,
* 简化无需自定义请求上下文场景的调用。
*
* @return 响应式流(Publisher),发射负载均衡选择结果
*/
default Publisher<Response<T>> choose() {
return choose(REQUEST);
}
/**
* 响应式负载均衡器的工厂接口,负责创建和管理特定服务的负载均衡器实例。
*
* 提供了根据服务 ID 获取负载均衡器、配置属性及上下文内 Bean 的能力,支持客户端特定的负载均衡配置。
*
* @param <T> 负载均衡器处理的目标类型(同外部接口的泛型参数)
*/
interface Factory<T> {
/**
* 获取指定服务的负载均衡配置属性。
* <p>
* 默认实现返回 null,子类可根据服务 ID 提供对应的配置(如超时时间、重试策略等)。
*
* @param serviceId 服务唯一标识
* @return 该服务对应的负载均衡配置属性,默认返回 null
*/
default LoadBalancerProperties getProperties(String serviceId) {
return null;
}
/**
* 根据服务 ID 获取对应的响应式负载均衡器实例。
*
* 核心方法,用于为特定服务创建或获取已存在的负载均衡器,确保每个服务可独立配置负载策略。
*
* @param serviceId 服务唯一标识
* @return 该服务对应的响应式负载均衡器实例(ReactiveLoadBalancer<T>)
*/
ReactiveLoadBalancer<T> getInstance(String serviceId);
/**
* 允许访问在客户端特定的 LoadBalancer 上下文中注册的多个 Bean。
*
* @param name Bean 的名称(或类型别名)
* @param type 要获取的 Bean 的类型
* @param <X> Bean 的类型泛型
* @return 包含符合条件的 Bean 实例的 Map(键为 Bean 名称)
*/
<X> Map<String, X> getInstances(String name, Class<X> type);
/**
* 允许访问在客户端特定的 LoadBalancer 上下文中注册的 Bean。
*
* @param name Bean 的名称
* @param clazz Bean 的原始类型
* @param generics Bean 类型的泛型参数(如 List<String> 中的 String)
* @return 符合条件的单个 Bean 实例
*/
<X> X getInstance(String name, Class<?> clazz, Class<?>... generics);
}
}更多信息请参考官方文档。