Nacos 配置服务客户端源码分析

CacheData

首先需要讲解到的就是CacheData。所有的配置信息和监听器都存放在CacheData中,包括一些操作方法。所以它不仅仅是一个存储的配置信息的实体,也包括了操作,获取,更新这个信息的功能。以下通过代码分析一下它的私有变量。

publicclassCacheData {
    // 线程池的最大线程数    staticfinalintCONCURRENCY=5;
    // 线程工厂,表明创建的是后台线程并赋予名字  staticThreadFactoryinternalNotifierFactory= r -> {
        Threadt=newThread(r);
        t.setName("nacos.client.cachedata.internal.notifier");
        t.setDaemon(true);
        return t;
    };
    // 是否初始化快照staticboolean initSnapshot;
    // 静态块,获取属性值static {
        initSnapshot = NacosClientProperties.PROTOTYPE.getBoolean("nacos.cache.data.init.snapshot", true);
        LOGGER.info("nacos.cache.data.init.snapshot = {} ", initSnapshot);
    }
    // 内部的通知线程池staticfinalThreadPoolExecutorINTERNAL_NOTIFIER=newThreadPoolExecutor(0, CONCURRENCY, 60L, TimeUnit.SECONDS,
            newSynchronousQueue<>(), internalNotifierFactory);
    // 名称privatefinal String name;
    // 过滤器链privatefinal ConfigFilterChainManager configFilterChainManager;
    // dataIdpublicfinal String dataId;
    // grouppublicfinal String group;
    // tenantpublicfinal String tenant;
    // 监听器privatefinal CopyOnWriteArrayList<ManagerListenerWrap> listeners;
    // 配置信息的md5值privatevolatile String md5;
    // 是否使用本地缓存privatevolatilebooleanisUseLocalConfig=false;
    // 上次配置修改时间,long类型privatevolatilelong localConfigLastModified;
    // 配置信息privatevolatile String content;
    // 加密数据的keyprivatevolatile String encryptedDataKey;
    // 修改时间privatevolatileAtomicLonglastModifiedTs=newAtomicLong(0);
    // taskIdprivateint taskId;
    // 是否初始化privatevolatilebooleanisInitializing=true;
    // 是否和服务端同步privatevolatilebooleanisSyncWithServer=false;
    // 是否丢失privatevolatilebooleanisDiscard=false;
    // typeprivate String type;
}
复制代码

CacheData的一些方法和成员变量的解释说明会在调用的时候再具体说明,这里只是需要有个印象,它不仅仅是对配置信息的保存,也包含了一些其他的状态位和操作的方法和变量。

ClientWorker

对CacheData有了初步印象后,我们就开始重点分析一下ClientWorker。先看它的构造方法。

publicClientWorker(final ConfigFilterChainManager configFilterChainManager, ServerListManager serverListManager,
            final NacosClientProperties properties)throws NacosException {
    this.configFilterChainManager = configFilterChainManager;
    init(properties);
    // 创建一个用于配置服务端的Rpc通信客户端
    agent = newConfigRpcTransportClient(properties, serverListManager);
    intcount= ThreadUtils.getSuitableThreadCount(THREAD_MULTIPLE);
    ScheduledExecutorServiceexecutorService= Executors
        .newScheduledThreadPool(Math.max(count, MIN_THREAD_NUM), r -> {
            Threadt=newThread(r);
            t.setName("com.alibaba.nacos.client.Worker");
            t.setDaemon(true);
            return t;
        });
    // 配置了一个异步处理线程池
    agent.setExecutor(executorService);
    // 调用start方法
    agent.start();
}

publicvoidstart()throws NacosException {
    // 认证服务,主要是通过Secret Key和Access Key做认证用
    securityProxy.login(this.properties);
    this.executor.scheduleWithFixedDelay(() -> securityProxy.login(properties), 0,
                                         this.securityInfoRefreshIntervalMills, TimeUnit.MILLISECONDS);
    // 内部启动
    startInternal();
}

publicvoidstartInternal() {
    executor.schedule(() -> {
        while (!executor.isShutdown() && !executor.isTerminated()) {
            try {
                listenExecutebell.poll(5L, TimeUnit.SECONDS);
                if (executor.isShutdown() || executor.isTerminated()) {
                    continue;
                }
                // 执行配置监听
                executeConfigListen();
            } catch (Throwable e) {
                LOGGER.error("[ rpc listen execute ] [rpc listen] exception", e);
            }
        }
    }, 0L, TimeUnit.MILLISECONDS);
}
复制代码

在创建ClientWorker的时候构造方法中做了如下操作:

  1. 初始化了本地变量和参数

  1. 创建了一个远程通信的客户端

  1. 配置了一个定时线程池,并且对需要认证的服务端做了认证

  1. 执行配置的监听,如果没有监听器的变动,则等待5s处理一次

继续看executeConfigListen()方法。

publicvoidexecuteConfigListen() {
    // 存放含有listen的cacheData
    Map<String, List<CacheData>> listenCachesMap = newHashMap<&g
Nacos配置中心控制台的源码分析可以帮助我们深入理解其实现细节和工作原理。以下是一个大致的源码分析过程: 1. 入口类分析:首先,我们需要找到Nacos配置中心控制台的入口类。该类通常是一个Spring Boot应用的启动类,负责初始化和启动整个应用。我们可以查找包含main方法的类,或者在启动脚本中找到应用的入口点。 2. 依赖分析:接下来,我们需要分析应用所依赖的第三方库和框架。查看应用的pom.xml文件或者build.gradle文件,可以获取到所依赖的各个库和对应版本。这些依赖通常包括Spring框架、Nacos客户端等。 3. 配置加载与解析:Nacos配置中心控制台需要加载和解析配置,包括数据库配置Nacos服务地址配置等。我们可以查找相关的配置文件或者代码片段,了解配置的加载和解析过程。 4. 控制器与路由:控制台通常提供了一些Web接口供前端调用。我们可以查找控制器类,分析其中的方法和注解,了解各个接口的功能和路由规则。 5. 页面模板与前端交互:配置中心控制台通常包含一些页面模板和与前端的交互逻辑。我们可以查找相关的HTML、CSS和JavaScript文件,分析页面的结构和交互逻辑。 6. 调用Nacos API:控制台需要与Nacos服务器进行通信,调用Nacos的API获取和修改配置信息。我们可以查找相关的API调用,了解控制台是如何与Nacos服务器进行通信的。 通过以上分析,我们可以逐步了解Nacos配置中心控制台的实现细节和工作原理。需要注意的是,具体的源码分析过程会因项目结构和代码风格而有所不同。以上只是一个大致的指导,具体分析还需根据实际情况来进行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值