城市直播房产教育博客汽车
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

深入理解SpringCloud一(3)Nacos配置中心

5月13日 眉梢欢投稿
  一、应用启动的时候如何从配置中心拉取配置文件
  通过上一节的介绍,我们已经知道了配置加载的扩展点。下面我们已具体的Nacos配置中心来进行说明。
  NacosConfigBootstrapConfiguration是BootstrapConfiguration的配置类,在bootstrap的SpringApplication创建的过程中,会加载这个类。这个Configuration类包括两个Bean,分别是NacosConfigManager,NacosPropertySourceLocator。
  NacosConfigManager的核心作用是创建NacosConfigService,通过NacosConfigService从远程配置中心拉取配置。privateStringgetConfigInner(Stringtenant,StringdataId,Stringgroup,longtimeoutMs)throwsNacosException{groupnull2defaultGroup(group);ParamUtils。checkKeyParam(dataId,group);ConfigResponsecrnewConfigResponse();cr。setDataId(dataId);cr。setTenant(tenant);cr。setGroup(group);省略一些代码try{String〔〕ctworker。getServerConfig(dataId,group,tenant,timeoutMs);cr。setContent(ct〔0〕);configFilterChainManager。doFilter(null,cr);contentcr。getContent();}catch(NacosExceptionioe){}contentcr。getContent();}
  NacosPropertySourceLocator是PropertySourceLocator的实现类,上一节已经详细介绍过PropertySourceLocator。OverridepublicPropertyS?locate(Environmentenv){nacosConfigProperties。setEnvironment(env);ConfigServiceconfigServicenacosConfigManager。getConfigService();省略一些代码nacosPropertySourceBuildernewNacosPropertySourceBuilder(configService,timeout);CompositePropertySourcecompositenewCompositePropertySource(NACOSPROPERTYSOURCENAME);loadSharedConfiguration(composite);loadExtConfiguration(composite);loadApplicationConfiguration(composite,dataIdPrefix,nacosConfigProperties,env);}二、配置中心的配置变动时,如何通知到应用
  NacosConfigAutoConfiguration是EnableAutoConfiguration的配置类,当application创建SpringApplication的过程中会被加载,会加载两个重要的Bean,NacosContextRefresher和NacosConfigManager,NacosConfigManager上面已经结束过。
  NacosContextRefresher主要作用就是注册Nacos监听器。OverridepublicvoidonApplicationEvent(ApplicationReadyEventevent){manySpringcontextif(this。ready。compareAndSet(false,true)){this。registerNacosListenersForApplications();}}privatevoidregisterNacosListener(finalStringgroupKey,finalStringdataKey){StringkeyNacosPropertySourceRepository。getMapKey(dataKey,groupKey);ListenerlistenerlistenerMap。computeIfAbsent(key,lstnewAbstractSharedListener(){OverridepublicvoidinnerReceive(StringdataId,Stringgroup,StringconfigInfo){refreshCountIncrement();nacosRefreshHistory。addRefreshRecord(dataId,group,configInfo);todofeature:supportsinglerefreshforlistening当配置文件变动时,会发布RefreshEvent事情applicationContext。publishEvent(newRefreshEvent(this,null,RefreshNacosconfig));if(log。isDebugEnabled()){log。debug(String。format(RefreshNacosconfiggroups,dataIds,configInfos,group,dataId,configInfo));}}});try{注册监听器configService。addListener(dataKey,groupKey,listener);}catch(NacosExceptione){}}
  监听器又是如何触发的?
  Nacos使用长轮询方式获取配置,判断文件是否有变动,如果有变动则触发监听器。
  NacosConfigService创建的时候,会创建ClientWorker对象,同时会创建长轮询任务。publicNacosConfigService(Propertiesproperties)throwsNacosException{省略其他代码this。workernewClientWorker(this。agent,this。configFilterChainManager,properties);}publicClientWorker(finalHttpAgentagent,finalConfigFilterChainManagerconfigFilterChainManager,finalPropertiesproperties){初始化一个延迟任务,10毫秒后调用checkConfigInfothis。executor。scheduleWithFixedDelay(newRunnable(){Overridepublicvoidrun(){try{checkConfigInfo();}catch(Throwablee){LOGGER。error(〔agent。getName()〕〔subcheck〕rotatecheckerror,e);}}},1L,10L,TimeUnit。MILLISECONDS);}publicvoidcheckConfigInfo(){Dispatchtaskes。intlistenerSizecacheMap。get()。size();RoundupthelongingTaskCount。intlongingTaskCount(int)Math。ceil(listenerSizeParamUtil。getPerTaskConfigSize());if(longingTaskCountcurrentLongingTaskCount){for(inti(int)currentLongingTaskCilongingTaskCi){Thetasklistisnoorder。Soitmaybehasissueswhenchanging。executorService。execute(newLongPollingRunnable(i));}currentLongingTaskCountlongingTaskC}}
  我们继续往下看LongPollingRunnableOverridepublicvoidrun(){省略其他代码checkserverconfig从服务器询问缓存的文件是否有变动ListStringchangedGroupKeyscheckUpdateDataIds(cacheDatas,inInitializingCacheList);if(!CollectionUtils。isEmpty(changedGroupKeys)){LOGGER。info(getchangedGroupKeys:changedGroupKeys);}}}ListStringcheckUpdateDataIds(ListCacheDatacacheDatas,ListStringinInitializingCacheList)throwsException{StringBuildersbnewStringBuilder();for(CacheDatacacheData:cacheDatas){if(!cacheData。isUseLocalConfigInfo()){sb。append(cacheData。dataId)。append(WORDSEPARATOR);sb。append(cacheData。group)。append(WORDSEPARATOR);if(StringUtils。isBlank(cacheData。tenant)){sb。append(cacheData。getMd5())。append(LINESEPARATOR);}else{sb。append(cacheData。getMd5())。append(WORDSEPARATOR);sb。append(cacheData。getTenant())。append(LINESEPARATOR);}if(cacheData。isInitializing()){ItupdateswhencacheDataoccoursincacheMapbyfirsttime。inInitializingCacheList。add(GroupKey。getKeyTenant(cacheData。dataId,cacheData。group,cacheData。tenant));}}}booleanisInitializingCacheList!inInitializingCacheList。isEmpty();returncheckUpdateConfigStr(sb。toString(),isInitializingCacheList);}ListStringcheckUpdateConfigStr(StringprobeUpdateString,booleanisInitializingCacheList)throwsException{MapString,StringparamsnewHashMapString,String(2);params。put(Constants。PROBEMODIFYREQUEST,probeUpdateString);MapString,StringheadersnewHashMapString,String(2);headers。put(LongPullingTimeout,timeout);try{Inordertopreventtheserverfromhandlingthedelayoftheclientslongtask,increasetheclientsreadtimeouttoavoidthisproblem。询问服务器,配置是否有变动,这里客户端读超时时间需要设置长一点longreadTimeoutMstimeout(long)Math。round(timeout1);HttpRestResultStringresultagent。httpPost(Constants。CONFIGCONTROLLERPATHlistener,headers,params,agent。getEncode(),readTimeoutMs);if(result。ok()){setHealthServer(true);returnparseUpdateDataIdResponse(result。getData());}else{setHealthServer(false);}}catch(Exceptione){setHealthServer(false);}returnCollections。emptyList();}Overridepublicvoidrun(){try{checkserverconfigListStringchangedGroupKeyscheckUpdateDataIds(cacheDatas,inInitializingCacheList);if(!CollectionUtils。isEmpty(changedGroupKeys)){LOGGER。info(getchangedGroupKeys:changedGroupKeys);}如果服务端文件有变动,则从服务端重新拉取配置for(StringgroupKey:changedGroupKeys){try{String〔〕ctgetServerConfig(dataId,group,tenant,3000L);CacheDatacachecacheMap。get()。get(GroupKey。getKeyTenant(dataId,group,tenant));cache。setContent(ct〔0〕);if(null!ct〔1〕){cache。setType(ct〔1〕);}}catch(NacosExceptionioe){}}for(CacheDatacacheData:cacheDatas){if(!cacheData。isInitializing()inInitializingCacheList。contains(GroupKey。getKeyTenant(cacheData。dataId,cacheData。group,cacheData。tenant))){如果文件MD5不一致,则触发监听器cacheData。checkListenerMd5();cacheData。setInitializing(false);}}inInitializingCacheList。clear();executorService。execute(this);}catch(Throwablee){executorService。schedule(this,taskPenaltyTime,TimeUnit。MILLISECONDS);}}
  如果文件MD5不一致,则触发监听器voidcheckListenerMd5(){for(ManagerListenerWrapwrap:listeners){if(!md5。equals(wrap。lastCallMd5)){safeNotifyListener(dataId,group,content,type,md5,wrap);}}}privatevoidsafeNotifyListener(finalStringdataId,finalStringgroup,finalStringcontent,finalStringtype,finalStringmd5,finalManagerListenerWraplistenerWrap){finalListenerlistenerlistenerWrap。RunnablejobnewRunnable(){Overridepublicvoidrun(){try{ConfigResponsecrnewConfigResponse();cr。setDataId(dataId);cr。setGroup(group);cr。setContent(content);configFilterChainManager。doFilter(null,cr);StringcontentTmpcr。getContent();回调监听器listener。receiveConfigInfo(contentTmp);listenerWrap。lastCallMd5md5;}catch(NacosExceptionex){}}};try{if(null!listener。getExecutor()){listener。getExecutor()。execute(job);}else{job。run();}}catch(Throwablet){}}
  最终实现回调publicvoidinnerReceive(StringdataId,Stringgroup,StringconfigInfo){refreshCountIncrement();nacosRefreshHistory。addRefreshRecord(dataId,group,configInfo);todofeature:supportsinglerefreshforlistening发布RefreshEvent事件applicationContext。publishEvent(newRefreshEvent(this,null,RefreshNacosconfig));if(log。isDebugEnabled()){log。debug(String。format(RefreshNacosconfiggroups,dataIds,configInfos,group,dataId,configInfo));}}三、总结
  判断文件是否变动的核心是长轮询,客户端比较简单,只需要设置较长时间的读超时即可。后面我们会继续探究Nacos服务端的长轮询是如何时间的。
搜索 投诉 评论 转载

深入理解SpringCloud一(3)Nacos配置中心一、应用启动的时候如何从配置中心拉取配置文件通过上一节的介绍,我们已经知道了配置加载的扩展点。下面我们已具体的Nacos配置中心来进行说明。NacosConfigB……国庆假期喜迎Windows11推送,华为荣耀的本子们你们准备国庆假期喜迎Windows11推送,华为荣耀的本子们你们准备好了么?我觉得吧,windows11的吸引力还不足够我去升级,如今windows10用得还挺爽的,还并不想要换……多城共同点亮人工智能算力网络,赋能人工智能产业发展〔中国,深圳,2021年9月25日〕在华为全联接2021上,中国科学技术信息研究所(简称中信所)、AITISA(新一代人工智能产业技术创新战略联盟)、鹏城实验室联合发布《人工智……苹果即将发布5G版iPhoneSE,旧iPhoneSE或降价鞭牛士2月28日消息,据报道,苹果公司计划在3月发布5G版iPhoneSE。知名记者马克古尔曼(MarkGurman)昨日在其最新一期《PowerOn》栏目中称,在新版iPho……苹果的发布会越来越透明,套娃产品如何勾起消费者的购买欲望根据各方渠道消息称,苹果很有可能在3月23日开始春季发布会。苹果的春季发布会每次不一定有产品,也有可能只是介绍一下软件或者对未来的展望,偶尔可能会推出一些新的产品,比如2……5G建设持续提速布局中国铁塔正当时5G板块在经历了长时间的震荡回调之后,近期又再次步入投资者的视野。作为5G通信设备商的重要参与者,铁塔龙头中国铁塔(00788)发布了2021年上半年业绩,在疫情背景下仍然取得……华为WATCH3来了!除了搭载鸿蒙,它可能是最强大的健康监测来源:环球网【环球网科技综合报道】继华为宣布6月2日举办鸿蒙操作系统及华为全场景新品发布会之后,今日,华为官方微博发布预热海报:万物皆鸿蒙智慧想象,一表万象。华为WATC……比A4纸还小?没有风扇?华为MateBookX初见周五拿到的笔记本,一直忙的没时间看,昨天终于算是腾出些时间来看看这款超轻薄旗舰的笔记本。这一台MateBookX,给了我数个第一次,第一次使用无风扇笔电,第一次使用3K分辨率的……不完整收录2021年字节自研的8项黑科技字节技术年货祝全天下的开发者朋友,新年职业发展虎啸风生,新年工资增速如虎添翼,新年爱情运势虎跃龙骧,新年代码事故下虎口逃生,虎!虎!虎!软件工程圣经《人月神话》一书中曾提到软件开发没……OPPO新机即将来袭,哈苏联名天玑90002K屏幕80W快充OPPO手机近几年在国内都有相当高的热度,其下属五大系列更是满足人们对高、中、低端手机需求,有较好的销量和口碑,其新机也是备受期待。在各大处理器厂商发布新处理器之际,OP……比特币价格的急剧下跌已然证明,加密货币寒冬即将到来从去年11月的近6。9万美元的高位暴跌50后,比特币正在重演2018年的寒冬。最近比特币暴跌原因是,越来越多的人相信美联储将开始收紧货币政策。加密货币市场的市值已缩水逾1……数字货币可能会大规模加速推行4月19日,据苏州发布消息,苏沪两地将在即将到来的五五购物节上发放消费红包,进一步推动数字人民币场景的多元化。目前,六家数字人民币试点银行已与参与商家展开对接,将推出促消费优惠……
还有这种操作?超迷你智能机已开启众筹互联网企业是如何维护和保障品牌权益的?专访腾讯微信法务总监品人工智能上市公司汇总年终盘点你心目中的2021年最美手机是哪款?学生党,想入手一个平板,只用来学习,主要是看网课做笔记,价格联发科传出将成立元宇宙事业群,整合物联网TV等芯片商机SEC再出监管新规数字货币交易所瑟瑟发抖三星GalaxyA52s详细配置曝光搭载骁龙778G芯片大公司早报拼多多诉争拼夕夕商标被驳回字节跳动入局卖酒事关联想溢价收购卢森堡银行问题,司马南是质疑,我这里有证据java常用类库一String类的概述和使用小米千寻位置高德强强联合,小米11Pro实现车道级导航
小米手机桌面底部有个搜索框怎么去掉杨紫,关晓彤谁的潜力最大?哈雷NightsterampampampLowRiderEl路过事故现场!国外男回家没人惊觉不妙,方知妻小遇车祸身亡硅谷的教父与弃儿读书做事时不问可不可能,但问应不应该红杏出墙的八种心态我自己来作文1000字趣味陶艺小学作文400字基础体温和最佳的性生活时机长三角国字号旅游休闲街区上新啦,来看有你去过的吗妙笔生花的主人公是谁

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找江西南阳嘉兴昆明铜陵滨州广东西昌常德梅州兰州阳江运城金华广西萍乡大理重庆诸暨泉州安庆南充武汉辽宁