获取nacos配置中心文件值_Nacos 配置中心原理分析

我们从原生SDK代码中入手,可以发现最核心的两行代码:

ConfigService configService=NacosFactory.createConfigService(properties);

String content=configService.getConfig(dataId,groupId,3000);

首先我们先来看 NacosFactory.createConfigService :

public staticConfigService createConfigService(Properties properties) throws NacosException {try{ Class> driverImplClass = Class.forName("com.alibaba.nacos.client.config.NacosConfigService"); Constructor constructor= driverImplClass.getConstructor(Properties.class);

//调用反射创建一个NacosConfigService实例 ConfigService vendorImpl=(ConfigService) constructor.newInstance(properties);returnvendorImpl; }catch(Throwable e) {throw newNacosException(NacosException.CLIENT_INVALID_PARAM, e); } }

这一步的代码很简单,及通过类的全类名通过反射创建一个 NacosConfigService 实例,我们跟进该类的构造方法:

publicNacosConfigService(Properties properties) throws NacosException { String encodeTmp=properties.getProperty(PropertyKeyConst.ENCODE);if(StringUtils.isBlank(encodeTmp)) { encode=Constants.ENCODE; }else{ encode=encodeTmp.trim(); }//初始化命名空间 initNamespace(properties); agent= new MetricsHttpAgent(newServerHttpAgent(properties)); agent.start(); worker= newClientWorker(agent, configFilterChainManager, properties); }

这一步主要初始化了 agent与 worker 两个实例。这里又看到熟悉的包装器模式,将ServerHttpAgent 包装成MetricsHttpAgent,这里我们需要知道,其中MetricsHttpAgent是对ServerHttpAgent功能的拓展,核心功能还是由ServerHttpAgent去实现,接下去我们来看一下 worker 的初始化,从名字上看能知道 最后真的工作的是他:

publicClientWorker(final HttpAgent agent, final ConfigFilterChainManager configFilterChainManager, final Properties properties) {this.agent =agent;this.configFilterChainManager =configFilterChainManager;//Initialize the timeout parameter//初始化一些参数

init(properties);//创建了一个定时任务的线程池

executor = Executors.newScheduledThreadPool(1, newThreadFactory() { @OverridepublicThread newThread(Runnable r) { Thread t= newThread(r); t.setName("com.alibaba.nacos.client.Worker." +agent.getName()); t.setDaemon(true);returnt; } });//创建了一个保持长连接的线程池

executorService = Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors(), newThreadFactory() { @OverridepublicThread newThread(Runnable r) { Thread t= newThread(r); t.setName("com.alibaba.nacos.client.Worker.longPolling." +agent.getName()); t.setDaemon(true);returnt; } });//创建了一个延迟任务线程池来每隔10ms来检查配置信息的线程池

executor.scheduleWithFixedDelay(newRunnable() { @Overridepublic voidrun() {try{ checkConfigInfo(); }catch(Throwable e) { LOGGER.error("[" + agent.getName() + "] [sub-check] rotate check error", e); } } },1L, 10L, TimeUnit.MILLISECONDS); }

这一步创建了两个线程池,第一个线程池负责与配置中心进行数据的交互,并且启动后延迟1ms,之后每隔10ms对配置信息进行定时检查,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值