Spring Cloud LoadBalancer 教程

ReactorLoadBalancer 接口

在 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 接口。

继承关系图如下图:

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);

	}

}

更多信息请参考官方文档。

  

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号