AddressResolver<ServiceAddress> resolver = KubeResolver.create(new KubeResolverOptions());
Kubernetes 环境下的客户端负载均衡
本指南将向你展示如何在 Kubernetes 环境中利用 Vert.x Service Resolver(服务解析器)实现智能的高性能客户端负载均衡(Client-Side Load Balancing)。
你将构建什么
你将构建一个 Vert.x 微服务:
-
在
/路径监听外部 HTTP 请求; -
使用客户端内置负载均衡器直接向后端集群的多实例 Pod 发起 HTTP 请求;
-
将目标后端 Pod 的物理地址与响应内容透明回传客户端。
为什么需要客户端负载均衡?
在传统的 Kubernetes 架构中,微服务之间的调用通常经过平台提供的 ClusterIP Service(依赖 kube-proxy 或 iptables/IPVS 实现 4 层转发)。而在海量微服务高并发交互场景下,客户端负载均衡能够直接绕过中心化代理转发,带来显著优势:
-
更低网络延迟:客户端直连目标 Pod,减少一次网络跳转;
-
多协议智能流控:在 HTTP/2、gRPC 等长连接多路复用场景下,彻底解决连接级负载不均问题;
-
可定制化调度算法:支持加权轮询、最小连接数、一致性哈希等丰富策略。
前置要求
-
文本编辑器或 IDE
-
Java 11 或更高版本
-
Maven 或 Gradle
-
Minikube 或可用的 Kubernetes 集群
-
kubectl命令行工具
核心架构与服务实现
1. 配置 Kubernetes 服务解析器 (KubeResolver)
Vert.x Service Resolver 允许客户端直接使用 Kubernetes 逻辑服务名称(如 hello-node)发起调用,并在内部透明解析为实时存活的 Pod 物理 IP 端点列表:
src/main/java/io/vertx/howtos/clientsidelb/MicroServiceVerticle.java2. 配置客户端负载均衡策略
配置经典的轮询(Round-Robin)调度策略:
src/main/java/io/vertx/howtos/clientsidelb/MicroServiceVerticle.java LoadBalancer loadBalancer = LoadBalancer.ROUND_ROBIN;
3. 发起负载均衡请求
在发起 HTTP 请求时,直接传入逻辑服务名:
src/main/java/io/vertx/howtos/clientsidelb/MicroServiceVerticle.java ServiceAddress serviceAddress = ServiceAddress.of("hello-node");
Future<HttpClientRequest> fut = client.request(new RequestOptions()
.setMethod(HttpMethod.GET)
.setServer(serviceAddress)
.setURI("/"));
部署至 Kubernetes 并验证效果
1. 部署具有 3 个副本的后端集群
kubectl create deployment hello-node --image=registry.k8s.io/e2e-test-images/agnhost:2.39 -- /agnhost netexec --http-port=8080
kubectl scale deployment hello-node --replicas=3
kubectl expose deployment hello-node --type=LoadBalancer --port=8080
2. 部署 Vert.x 微服务并赋予 Endpoints 观察权限
应用 deployment.yml、service.yml 与 roles.yml(允许 ServiceAccount 监听 Endpoints 变更事件):
kubectl apply -f deployment.yml
kubectl apply -f service.yml
kubectl apply -f roles.yml
3. 测试客户端负载均衡
访问微服务暴露的地址,多次刷新:
Hello from: 10.244.0.48:8080 with: NOW: ... Hello from: 10.244.0.49:8080 with: NOW: ... Hello from: 10.244.0.50:8080 with: NOW: ...
你可以清晰看到,请求由客户端直接精准均匀地分发到了后端 3 个不同的 Pod IP 之上!
本文总结
-
掌握了 Vert.x Service Resolver 在 Kubernetes 上的无缝接入;
-
理解了客户端负载均衡相比传统 Service 代理的性能优势;
-
成功验证了基于 Pod Endpoints 的毫秒级拓扑感知与轮询调度。