在 Spring Cloud LoadBalancer 中,LoadBalancerClient 是核心接口之一,定义了负载均衡客户端的基础操作,封装了服务实例选择、请求执行、URI 转换等核心能力,是实现服务间负载均衡调用的关键组件,是负载均衡逻辑的核心入口。
LoadBalancerClient 接口继承自 ServiceInstanceChooser 接口。如下图:

LoadBalancerClient 接口主要作用是:
根据服务名从服务发现组件(如 Eureka、Nacos)获取可用服务实例列表。
基于配置的负载均衡策略(如轮询、随机等)从实例列表中选择一个最优实例。
提供对服务实例的元数据查询、请求转换(如替换服务名为具体实例地址)等辅助功能。
📢注意:LoadBalancerClient 与 Spring Cloud Commons 模块深度集成,默认实现为 BlockingLoadBalancerClient(阻塞式客户端),同时支持与反应式编程模型(如 WebFlux)配合的 ReactiveLoadBalancerClient。
下面将从该接口的定义进行分析:
ServiceInstanceChooser 是 Spring Cloud 负载均衡体系中的核心接口,专注于服务实例选择逻辑,是实现客户端负载均衡的基础组件。它定义了从可用服务实例列表中筛选合适实例的标准方法,为服务间调用提供 “选哪个实例” 的决策能力。
ServiceInstanceChooser 作为负载均衡流程的“实例选择器”,负责基于服务标识和请求上下文,从服务发现组件(如 Eureka、Nacos)提供的实例列表中,选择一个最优实例用于后续请求。
ServiceInstanceChooser 是 LoadBalancerClient 的父接口,LoadBalancerClient 在此基础上扩展了请求执行和 URI 转换能力(即“选完实例后如何调用”)。
ServiceInstanceChooser 还解耦“实例选择”与“请求执行”逻辑,让负载均衡策略(如轮询、随机)的实现更灵活。
接口定义如下:
package org.springframework.cloud.client.loadbalancer;
import org.springframework.cloud.client.ServiceInstance;
/**
* 服务实例选择器接口,定义了从负载均衡器中选择服务实例的核心方法。
* 作为负载均衡流程的 "实例选择" 环节入口,它负责基于服务ID和请求上下文,
* 从可用服务实例列表中筛选出合适的实例,供后续请求调用使用。
*
* 该接口是 LoadBalancerClient 的父接口,专注于实例选择逻辑,
* 与负载均衡策略(如轮询、随机、加权等)紧密配合,为客户端负载均衡提供基础能力。
*
* @author Ryan Baxter
* @author Olga Maciaszek-Sharma
* @since Spring Cloud Commons 2.2.0
* @see LoadBalancerClient 扩展此接口,增加了请求执行和URI转换能力
* @see org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer 负载均衡策略的核心接口,与本接口协同工作
*/
public interface ServiceInstanceChooser {
/**
* 根据服务ID从负载均衡器中选择一个可用的服务实例。
* 注意:
* 1、选择逻辑依赖于当前配置的负载均衡策略(如默认的轮询策略),
* 2、会自动过滤不可用实例(如健康检查失败的实例)。
*
* @param serviceId 服务唯一标识,用于定位对应的负载均衡器和实例列表
* @return 选中的服务实例(包含host、port、元数据等信息);若无可可用实例,返回 null
*/
ServiceInstance choose(String serviceId);
/**
* 根据服务ID和请求上下文从负载均衡器中选择服务实例。
* 相比无参重载方法,本方法支持基于请求特征(如请求头、参数、上下文信息)的动态选择,
* 适用于灰度发布、按请求参数路由等场景(需负载均衡策略支持请求上下文解析)。
*
* @param serviceId 服务唯一标识
* @param request 包含请求上下文的对象,可携带额外信息供负载均衡策略决策使用
* @param <T> 请求上下文的数据类型
* @return 选中的服务实例;若无可可用实例,返回 null
*/
<T> ServiceInstance choose(String serviceId, Request<T> request);
}LoadBalancerClient 是客户端负载均衡器核心接口,定义了基于服务实例的负载均衡选择、请求执行及URI转换能力。源码如下:
package org.springframework.cloud.client.loadbalancer;
import java.io.IOException;
import java.net.URI;
import org.springframework.cloud.client.ServiceInstance;
/**
* 客户端负载均衡器核心接口,定义了基于服务实例的负载均衡选择、请求执行及URI转换能力。
* 作为 Spring Cloud LoadBalancer 的核心入口,它整合了服务发现与负载均衡策略,
* 为服务间调用提供实例选择和路由支持,替代了传统的Netflix Ribbon组件。
*
* 该接口继承自 ServiceInstanceChooser,扩展了对选中实例的请求执行能力,
* 支持阻塞式调用场景(默认实现为 BlockingLoadBalancerClient)。
*
* @author Spencer Gibb
* @since Spring Cloud Commons 1.0.0
* @see BlockingLoadBalancerClient 默认阻塞式实现类
* @see ReactiveLoadBalancerClient 响应式编程模型对应的负载均衡客户端
*/
public interface LoadBalancerClient extends ServiceInstanceChooser {
/**
* 基于负载均衡策略选择服务实例,并在该实例上执行请求。
* <p>流程说明:
* 1. 根据serviceId从服务发现组件获取可用实例列表
* 2. 应用负载均衡策略选择最优实例(如轮询、随机等)
* 3. 在选中的实例上执行传入的{@link LoadBalancerRequest}请求
* 4. 支持执行请求前后的拦截逻辑(如 metrics 统计、日志记录)
*
* @param serviceId 服务唯一标识,用于查找对应的负载均衡器和实例列表
* @param request 封装了实际要执行的请求逻辑,包含前置/后置处理能力
* @param <T> 响应数据类型
* @return 请求执行结果(由选中实例返回)
* @throws IOException 当与服务实例通信发生IO异常时抛出
*/
<T> T execute(String serviceId, LoadBalancerRequest<T> request) throws IOException;
/**
* 在指定的服务实例上执行请求(跳过负载均衡选择过程)。
* <p>适用于已通过其他方式选定实例的场景(如手动指定、灰度路由等),
* 直接使用传入的{@link ServiceInstance}执行请求,仍保留负载均衡相关的拦截能力。
*
* @param serviceId 服务唯一标识(主要用于日志和metrics标记,非实例选择依据)
* @param serviceInstance 已选定的服务实例(包含host、port等具体信息)
* @param request 封装了实际要执行的请求逻辑
* @param <T> 响应数据类型
* @return 请求执行结果(由指定实例返回)
* @throws IOException 当与服务实例通信发生IO异常时抛出
*/
<T> T execute(String serviceId, ServiceInstance serviceInstance, LoadBalancerRequest<T> request) throws IOException;
/**
* 将服务名URI转换为具体服务实例的URI。
* 解决微服务调用中 "逻辑服务名" 到 "物理实例地址" 的转换问题,例如:
* 原始URI为 http://user-service/api/v1/users(含服务名),
* 转换后为 http://192.168.1.100:8080/api/v1/users(含实例host:port)。
*
* @param instance 目标服务实例,提供实际的 host 和 port
* @param original 原始URI,host部分通常为服务名(如"user-service")
* @return 转换后的URI,包含具体实例的网络地址,可直接用于HTTP请求
*/
URI reconstructURI(ServiceInstance instance, URI original);
}总之,LoadBalancerClient 是 Spring Cloud LoadBalancer 的核心接口,通过封装 “实例选择”、“请求执行”和“URI 转换” 三大能力,为微服务提供了透明化的负载均衡支持。其默认实现 BlockingLoadBalancerClient 适配同步场景,且支持灵活扩展以满足复杂业务需求(如动态路由、灰度发布)。在实际开发中,通常无需直接操作此接口,而是通过 RestTemplate 或 OpenFeign 间接利用其能力,简化服务间调用的负载均衡配置。