Nacos原理03-配置中心
用例图
在ClientWorker
类的构造方法中,直接启动了一个延时任务。
public ClientWorker(final HttpAgent agent, final ConfigFilterChainManager configFilterChainManager, final Properties properties) { this.agent = agent; this.configFilterChainManager = configFilterChainManager; // Initialize the timeout parameter init(properties); this.executor = Executors.newScheduledThreadPool(1, new ThreadFactory() { @Override public Thread newThread(Runnable r) { Thread t = new Thread(r); t.setName("com.alibaba.nacos.client.Worker." + agent.getName()); t.setDaemon(true); return t; } }); this.executorService = Executors .newScheduledThreadPool(Runtime.getRuntime().availableProcessors(), new ThreadFactory() { @Override public Thread newThread(Runnable r) { Thread t = new Thread(r); t.setName("com.alibaba.nacos.client.Worker.longPolling." + agent.getName()); t.setDaemon(true); return t; } }); this.executor.scheduleWithFixedDelay(new Runnable() { @Override public void run() { try { checkConfigInfo(); } catch (Throwable e) { LOGGER.error("[" + agent.getName() + "] [sub-check] rotate check error", e); } } }, 1L, 10L, TimeUnit.MILLISECONDS); }
这个延时任务的作用就是定时调用server获取配置内容的接口,并更新缓存在客户端的配置内容。
这个延时任务的checkConfigInfo()
方法里起了一个线程:LongPollingRunnable
。在这个线程里,会调用到一个getServerConfig()
方法,传参是dataId、group、tenant和超时时间(3秒),这个方法中会请求服务端的接口:/configs,然后根据返回的HTTP码做不一样的返回——200则拼装完整的结果,404则拼装空的结果,409和403或者其他都抛出特有的异常,若正常返回,则更新客户端的配置,并立即执行下一次LongPollingRunnable
线程,若抛出了异常,则延时执行下一次,延时的时间由配置项LongPollingRunnable决定,默认是2000ms。