本文目录导读:

Java标准库(JDK)没有内置负载均衡API。
Java本身不提供现成的负载均衡工具或API,但好消息是,Java生态体系中(特别是Spring Cloud和Java EE/ Jakarta EE)提供了非常成熟且广泛使用的实现。
以下是几种常见的解决方案:
Spring Cloud(最常用)
这是Java微服务领域事实上的标准,它提供了多种负载均衡器。
-
Spring Cloud LoadBalancer(Spring官方推荐):
- 是 Spring Cloud 自带的负载均衡器(取代了已进入维护状态的 Netflix Ribbon)。
- 支持轮询、随机等算法,也支持自定义算法。
- 使用方式: 在
RestTemplate或WebClient上添加@LoadBalanced注解即可。
@Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } -
Netflix Ribbon(已进入维护状态,不推荐新项目使用):
曾经是 Spring Cloud 的核心组件,提供了客户端负载均衡。
Java EE / Jakarta EE(企业级标准)
- JAX-RS (RESTful Web Services) 和 EJB 通常通过应用服务器(如 Tomcat、WildFly、WebLogic)提供的负载均衡能力来实现,这属于服务端负载均衡,而不是客户端API。
- 应用服务器通常集成粘性会话(Sticky Session)和简单的轮询等机制,但需要依赖于外部的HTTP负载均衡器(如Nginx、HAProxy)或应用服务器集群的配置。
分布式框架(如 Dubbo)
- Dubbo 内置了多种负载均衡策略(如加权随机、最少活跃调用数、一致性哈希等),这属于客户端负载均衡API。
自定义实现(如果不想用框架,可以自己写)
Java 标准库不提供,但你可以利用现有的HTTP客户端(如 HttpURLConnection、Apache HttpClient、OkHttp)结合一个服务列表和负载均衡策略来自己实现。
一个极简的自定义负载均衡器示例:
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
public class SimpleRoundRobinLoadBalancer {
private final List<String> serverList;
private final AtomicInteger index = new AtomicInteger(0);
public SimpleRoundRobinLoadBalancer(List<String> serverList) {
this.serverList = serverList;
}
public String getNextServer() {
int currentIndex = index.getAndIncrement() % serverList.size();
return serverList.get(currentIndex);
}
public static void main(String[] args) {
List<String> servers = List.of("192.168.1.1:8080", "192.168.1.2:8080", "192.168.1.3:8080");
SimpleRoundRobinLoadBalancer lb = new SimpleRoundRobinLoadBalancer(servers);
// 模拟请求
for (int i = 0; i < 6; i++) {
System.out.println("Request " + i + " -> " + lb.getNextServer());
}
}
}
| 场景 | 推荐方案 | 是否内置API |
|---|---|---|
| 微服务(Spring Boot) | Spring Cloud LoadBalancer |
✅ 框架内置,不是JDK内置 |
| 微服务(非Spring) | Dubbo / gRPC |
✅ 各自框架内置 |
| 企业级应用(Java EE) | 应用服务器集群 + 外部HTTP负载均衡器 | ❌ 不是API,是外部组件 |
| 简单命令行/工具程序 | 自己写一个(如上面示例) | ❌ 需要自己实现 |
核心结论:JDK 没有内置,但 Spring Cloud 等主流框架已经提供了非常完善的实现,开箱即用。