在分布式系统开发中,SpringBoot 整合 Zookeeper(ZK)和 Kafka是常见场景。但很多开发者在配置连接时,常会疑惑:明明配置了多个节点地址,框架到底是如何决定访问哪个节点的?不同组件的节点选择逻辑有何差异?今天我们就从底层原理到实际配置,拆解这两个组件的节点选择机制,帮你彻底搞懂“背后的逻辑”。
一、先明确核心前提:为什么需要“节点选择”?
无论是 ZK 还是 Kafka,都是分布式架构,多节点部署的核心目的是高可用和负载均衡。SpringBoot 作为上层框架,连接分布式组件时,不能“随机瞎选”节点,必须遵循组件自身的协议和逻辑,才能保证连接稳定性、数据一致性,同时避免单节点压力过大。
简单说:节点选择的本质,是“遵循分布式组件的底层协议,在高可用和负载均衡之间找最优解”。
二、SpringBoot 整合 ZK:节点选择靠“ZK 自身的选举与连接机制”
Zookeeper 作为分布式协调工具,自身有一套成熟的“主从架构”和“连接协议”,SpringBoot 整合时,并不主动“选节点”,而是将选择权交给 ZK 客户端(如 Curator),由客户端遵循 ZK 协议完成节点选择。
1. ZK 的节点角色:先搞懂“该连谁”
ZK 集群有三种节点角色,不同角色的功能不同,决定了客户端的连接优先级:
- Leader 节点:集群的“主节点”,负责处理所有写请求(如创建节点、修改数据),同时同步数据给从节点;不直接处理客户端的读请求(除非特殊配置)。
- Follower 节点:“从节点”,负责处理客户端的读请求,同时参与 Leader 选举(Leader 挂了之后,Follower 会竞选新 Leader)。
- Observer 节点:功能类似 Follower,但不参与 Leader 选举,仅用于扩展读能力(适合读请求极多的场景)。
核心结论:ZK 客户端的核心诉求是“稳定读+能提交写”,因此优先连接 Follower/Observer(读请求直接处理),写请求则由 Follower 转发给 Leader。
2. SpringBoot 中 ZK 节点选择的3步逻辑
SpringBoot 整合 ZK 通常依赖 Curator(官方推荐客户端),节点选择完全遵循 Curator 与 ZK 集群的交互逻辑,具体分3步:
步骤1:配置“种子节点列表”,建立初始连接
我们在 application.yml
中配置的 ZK 地址,本质是“种子节点列表”(不是全部节点,也不是固定要连的节点):
spring:
zookeeper:
connect-string: zk-node1:2181,zk-node2:2181,zk