nacos2.0.1 配置中心 使用grpc源码分析

经过大佬指点,选择直接看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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值