跳到主要内容
📖 本章预览

本章为预览版本,展示部分核心内容。完整内容包含详细源码解析、实战代码和面试要点,加入知识星球即可解锁全部章节。

第十一章: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 章完整内容 + 持续更新
  • ✅ 配套源码 + 实战项目
  • ✅ 一对一答疑 + 面试辅导
  • ✅ 简历优化 + 内推机会

📚 本章完整目录

以下为本章完整目录结构,加入知识星球即可解锁全部内容。

11.2.3 推送重试与兜底机制

11.2.4 完整推送流程

11.3 HTTP 长轮询 — 1.x 兼容机制(了解即可)

11.4 两种机制的对比

11.5 面试热点