📖 本章预览
本章为预览版本,展示部分核心内容。完整内容包含详细源码解析、实战代码和面试要点,加入知识星球即可解锁全部章节。
第十一章:Config 配置监听与推送
配置变更后如何实时通知客户端?Nacos 2.x 的主力方案是 gRPC 长连接推送,HTTP 长轮询仅作为 1.x 客户端的兼容机制保留。
11.1 演进历程
Nacos 1.x:HTTP 长轮询(LongPollingService + ClientLongPolling)
│ 客户端发 HTTP 请求 → 服务端 hold 住 → 变更时返回 → 客户端再拉取内容
│ 问题:占用 Tomcat 线程、超时后需重新请求、实时性受限
▼
Nacos 2.x:gRPC 长连接推送(RpcConfigChangeNotifier)【当前主力方案】
│ 客户端通过 gRPC 注册监听 → 服务端变更时主动推送 → 客户端拉取内容
│ 优势:毫秒级推送、不占额外线程、连接复用
11.2 gRPC 配置监听 — 主力方案(深度源码分析)
11.2.1 客户端注册监听
客户端 SDK
│ configService.addListener("app.yaml", "DEFAULT_GROUP", listener)
▼
发送 ConfigBatchListenRequest(携带 dataId+group+md5 列表)
▼
服务端 ConfigChangeBatchListenRequestHandler.handle()
│
├─① 将 connectionId + groupKey 注册到 ConfigChangeListenContext
├─② 立即比对 MD5,如果已有变更,返回变更的 groupKey 列表
└─③ 返回 ConfigChangeBatchListenResponse
关键数据结构 — ConfigChangeListenContext:
ConfigChangeListenContext {
// groupKey → Set<connectionId>
Map<String, Set<String>> groupKeyContext;
// connectionId → Map<groupKey, ConfigListenState>
Map<String, Map<String, ConfigListenState>> connectionIdContext;
}
11.2.2 配置变更推送 — RpcConfigChangeNotifier
@Component("rpcConfigChangeNotifier")
public class RpcConfigChangeNotifier extends Subscriber<LocalDataChangeEvent> {
@Override
public void onEvent(LocalDataChangeEvent event) {
String groupKey = event.groupKey;
String[] strings = GroupKey.parseKey(groupKey);
configDataChanged(groupKey, strings[0], strings[1], strings[2]);
}
public void configDataChanged(String groupKey, String dataId,
String group, String tenant) {
Set<String> listeners = configChangeListenContext.getListeners(groupKey);
if (CollectionUtils.isEmpty(listeners)) return;
for (String connectionId : listeners) {
Connection connection = connectionManager.getConnection(connectionId);
if (connection == null) continue;
// 只推 dataId + group + tenant,不含配置内容
ConfigChangeNotifyRequest notifyRequest =
ConfigChangeNotifyRequest.build(dataId, group, tenant);
RpcPushTask rpcPushRetryTask = new RpcPushTask(
notifyRequest, maxPushRetryTimes, connectionId, clientIp, appName);
push(rpcPushRetryTask, connectionManager);
}
}
}
🔒 解锁完整内容
本章剩余内容需要解锁后查看
以上仅为本章部分预览内容,完整内容包含更多深度源码解析、实战代码和面试要点。
加入知识星球你将获得:
- ✅ 全部 17 章完整内容 + 持续更新
- ✅ 配套源码 + 实战项目
- ✅ 一对一答疑 + 面试辅导
- ✅ 简历优化 + 内推机会
📚 本章完整目录
以下为本章完整目录结构,加入知识星球即可解锁全部内容。