经过大佬指点,选择直接看nacos2.x版本源码,探讨最新的实现方式。
1.nacos2.x的架构实现
对比1.X的架构,主要是提供了grpc的长连接实现。grpc官网传送门
grpc是一个语言无关,平台无关的rpc实现框架,谷歌开源,支持多种编程语言。使用HTTP2.0的特性,支持长连接,服务端推送,header压缩,多路复用。HTTP2.0特性介绍
从架构图可以看到,2.x框架,主要是添加了grpc通信实现,是兼容1.x版本。使用grpc,主要是为了解析1.x框架下,http连接带来的短连接,频繁心跳包导致的资源空耗,还有UDP协议,广播不可靠。
详情看阿里nacos PMC写的文章 支持 gRPC 长链接,深度解读 Nacos 2.0 架构设计及新模型
2.源码分析nacos 2.0.1客户端 配置中心使用grpc
引入sdk
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.0.1</version>
</dependency>
创建ConfigService
System.setProperty("nacos.logging.default.config.enabled", "false");
String serverAddr = NacosServerProperties.serverAddr;
String dataId = "austin-provider-server";
String group = "DEFAULT_GROUP";
configService = NacosFactory.createConfigService(serverAddr);
观察创建配置服务的核心代码
public NacosConfigService(Properties properties) throws NacosException {
ValidatorUtils.checkInitParam(properties);
initNamespace(properties);
this.configFilterChainManager = new ConfigFilterChainManager(properties);
ServerListManager serverListManager = new ServerListManager(properties);
serverListManager.start();
this.worker = new ClientWorker(this.configFilterChainManager, serverListManager, properties);
// will be deleted in 2.0 later versions
agent = new ServerHttpAgent(serverListManager);
}
核心代码在ClientWorker上
public void executeConfigListen() {
Map<String, List<CacheData>> listenCachesMap = new HashMap<String, List<CacheData>>(16);
Map<String, List<CacheData>> removeListenCachesMap = new HashMap<String, List<CacheData>>(16);
long now = System.currentTimeMillis();
boolean needAllSync = now - lastAllSyncTime >= ALL_SYNC_INTERNAL;
for (CacheData cache : cacheMap.get().values()) {
synchronized (cache) {
//check local listeners consistent.
主要核心代码在executeConfigListen方法上。功能主要是定时地查看配置项,监听本地配置和服务器配置是否一致,不一致,则同步配置。
for (Map.Entry<String, List<CacheData>> entry : listenCachesMap.entrySet()) {
String taskId = entry.getKey();
List<CacheData> listenCaches = entry.getValue();
ConfigBatchListenRequest configChangeListenRequest = buildConfigRequest