当前位置: 首页 > news >正文

呼和浩特市城乡建设委员会网站友情链接发布平台

呼和浩特市城乡建设委员会网站,友情链接发布平台,网站制作价格低,个人官网网站源码Nacos客户端服务订阅机制的核心流程 说起Nacos的服务订阅机制,大家会觉得比较难理解,那我们就来详细分析一下,那我们先从Nacos订阅的概述说起 Nacos订阅概述 Nacos的订阅机制,如果用一句话来描述就是:Nacos客户端通…

Nacos客户端服务订阅机制的核心流程

说起Nacos的服务订阅机制,大家会觉得比较难理解,那我们就来详细分析一下,那我们先从Nacos订阅的概述说起

Nacos订阅概述

Nacos的订阅机制,如果用一句话来描述就是:Nacos客户端通过一个定时任务,每6秒从注册中心获取实例列表,当发现实例发生变化时,发布变更事件,订阅者进行业务处理(更新实例,更改本地缓存)。
在这里插入图片描述

定时任务开启

其实订阅本质上就是服务发现的一种方式,也就是在服务发现的时候执行订阅方法,触发定时任务去拉取服务端的数据。

​ NacosNamingService中暴露的许多重载的subscribe,重载的目的就是让大家少写一些参数,这些参数呢,Nacos给默认处理了。最终这些重载方法都会调用到下面这个方法:

@Override
public void subscribe(String serviceName, String groupName, List<String> clusters, EventListener listener)throws NacosException {if (null == listener) {return;}String clusterString = StringUtils.join(clusters, ",");changeNotifier.registerListener(groupName, serviceName, clusterString, listener);clientProxy.subscribe(serviceName, groupName, clusterString);
}

这里我们先来看subscribe方法,大家可能有些眼熟它是clientProxy类型调用的方法,实际上就是NamingClientProxyDelegate.subscribe(),所以其实这里和之前的服务发现中调用的是一个方法,这里其实是在做服务列表的查询,所以得出结论查询和订阅都调用了同一个方法.

@Override
public ServiceInfo subscribe(String serviceName, String groupName, String clusters) throws NacosException {String serviceNameWithGroup = NamingUtils.getGroupedName(serviceName, groupName);String serviceKey = ServiceInfo.getKey(serviceNameWithGroup, clusters);// 定时调度UpdateTaskserviceInfoUpdateService.scheduleUpdateIfAbsent(serviceName, groupName, clusters);// 获取缓存中的ServiceInfoServiceInfo result = serviceInfoHolder.getServiceInfoMap().get(serviceKey);if (null == result) {// 如果为null,则进行订阅逻辑处理,基于gRPC协议result = grpcClientProxy.subscribe(serviceName, groupName, clusters);}// ServiceInfo本地缓存处理serviceInfoHolder.processServiceInfo(result);return result;
}

但是这里我们要关注这里的任务调度,该方法包含了构建serviceKey、通过serviceKey判断重复、最后添加UpdateTask,而其中的addTask的实现就是发起了一个定时任务:

public void scheduleUpdateIfAbsent(String serviceName, String groupName, String clusters) {String serviceKey = ServiceInfo.getKey(NamingUtils.getGroupedName(serviceName, groupName), clusters);if (futureMap.get(serviceKey) != null) {return;}synchronized (futureMap) {if (futureMap.get(serviceKey) != null) {return;}//构建UpdateTaskScheduledFuture<?> future = addTask(new UpdateTask(serviceName, groupName, clusters));futureMap.put(serviceKey, future);}
}

定时任务延迟一秒执行:

private synchronized ScheduledFuture<?> addTask(UpdateTask task) {return executor.schedule(task, DEFAULT_DELAY, TimeUnit.MILLISECONDS);
}

所以在这里我们得出结论,核心为:调用订阅方法和发起定时任务。

定时任务执行内容

在这里插入图片描述
当我们知道了整体流程以后,我们再来看对应源码:

@Override
public void run() {long delayTime = DEFAULT_DELAY;try {// 判断是服务是否订阅和未开启过定时任务,如果订阅过直接不在执行if (!changeNotifier.isSubscribed(groupName, serviceName, clusters) && !futureMap.containsKey(serviceKey)) {NAMING_LOGGER.info("update task is stopped, service:{}, clusters:{}", groupedServiceName, clusters);return;}// 获取缓存的service信息ServiceInfo serviceObj = serviceInfoHolder.getServiceInfoMap().get(serviceKey);// 如果为空if (serviceObj == null) {// 根据serviceName从注册中心服务端获取Service信息serviceObj = namingClientProxy.queryInstancesOfService(serviceName, groupName, clusters, 0, false);// 处理本地缓存serviceInfoHolder.processServiceInfo(serviceObj);lastRefTime = serviceObj.getLastRefTime();return;}// 过期服务,服务的最新更新时间小于等于缓存刷新(最后一次拉取数据的时间)时间,从注册中心重新查询if (serviceObj.getLastRefTime() <= lastRefTime) {serviceObj = namingClientProxy.queryInstancesOfService(serviceName, groupName, clusters, 0, false);// 处理本地缓存serviceInfoHolder.processServiceInfo(serviceObj);}//刷新更新时间lastRefTime = serviceObj.getLastRefTime();if (CollectionUtils.isEmpty(serviceObj.getHosts())) {incFailCount();return;}// 下次更新缓存时间设置,默认6秒// TODO multiple time can be configured.delayTime = serviceObj.getCacheMillis() * DEFAULT_UPDATE_CACHE_TIME_MULTIPLE;// 重置失败数量为0(可能会出现失败情况,没有ServiceInfo,连接失败)resetFailCount();} catch (Throwable e) {incFailCount();NAMING_LOGGER.warn("[NA] failed to update serviceName: {}", groupedServiceName, e);} finally {// 下次调度刷新时间,下次执行的时间与failCount有关,failCount=0,则下次调度时间为6秒,最长为1分钟// 即当无异常情况下缓存实例的刷新时间是6秒executor.schedule(this, Math.min(delayTime << failCount, DEFAULT_DELAY * 60), TimeUnit.MILLISECONDS);}
}

业务逻辑最后会计算下一次定时任务的执行时间,通过delayTime来延迟执行。delayTime默认为 1000L * 6,也就是6秒。而在finally里面真的发起下一次定时任务。当出现异常时,下次执行的时间与失败次数有关,但最长不超过1分钟。

总结:

  1. 订阅方法的调用,并进行EventListener的注册,后面UpdateTask要用来进行判断;

  2. 通过委托代理类来处理订阅逻辑,此处与获取实例列表方法使用了同一个方法;

  3. 通过定时任务执行UpdateTask方法,默认执行间隔为6秒,当发生异常时会延长,但不超过1分钟;

  4. UpdateTask方法中会比较本地是否存在缓存,缓存是否过期。当不存在或过期时,查询注册中心,获取最新实例,更新最后获取时间,处理ServiceInfo。

  5. 重新计算定时任务时间,循环执行流程。


文章转载自:
http://kitenge.spfh.cn
http://grubber.spfh.cn
http://corybantism.spfh.cn
http://intimacy.spfh.cn
http://reddleman.spfh.cn
http://bruxelles.spfh.cn
http://schoolhouse.spfh.cn
http://reknit.spfh.cn
http://zanyism.spfh.cn
http://viaticum.spfh.cn
http://synthesize.spfh.cn
http://gait.spfh.cn
http://lethargy.spfh.cn
http://adsum.spfh.cn
http://dishoard.spfh.cn
http://careworn.spfh.cn
http://tangier.spfh.cn
http://campesino.spfh.cn
http://nachus.spfh.cn
http://encrimson.spfh.cn
http://dejectile.spfh.cn
http://goyim.spfh.cn
http://seniti.spfh.cn
http://cyanhydrin.spfh.cn
http://channel.spfh.cn
http://heterozygosity.spfh.cn
http://fadeout.spfh.cn
http://arseniureted.spfh.cn
http://synovia.spfh.cn
http://muckhill.spfh.cn
http://laughable.spfh.cn
http://dextroglucose.spfh.cn
http://stenotypist.spfh.cn
http://northwest.spfh.cn
http://hogweed.spfh.cn
http://petrographic.spfh.cn
http://transudation.spfh.cn
http://pseudopod.spfh.cn
http://waterfall.spfh.cn
http://sealwort.spfh.cn
http://yamulka.spfh.cn
http://homopolarity.spfh.cn
http://outrelief.spfh.cn
http://charity.spfh.cn
http://chrysocarpous.spfh.cn
http://tilth.spfh.cn
http://blooper.spfh.cn
http://peckish.spfh.cn
http://softwood.spfh.cn
http://noseless.spfh.cn
http://improvisatorial.spfh.cn
http://amicability.spfh.cn
http://melancholic.spfh.cn
http://chartist.spfh.cn
http://strumectomy.spfh.cn
http://climax.spfh.cn
http://aerially.spfh.cn
http://zygodactyl.spfh.cn
http://kielbasa.spfh.cn
http://backwardly.spfh.cn
http://leaguer.spfh.cn
http://hippolytus.spfh.cn
http://barege.spfh.cn
http://dachshund.spfh.cn
http://circumrotatory.spfh.cn
http://won.spfh.cn
http://etymological.spfh.cn
http://allethrin.spfh.cn
http://mastering.spfh.cn
http://lararium.spfh.cn
http://unconditioned.spfh.cn
http://jagged.spfh.cn
http://sodar.spfh.cn
http://sabbatarian.spfh.cn
http://eprom.spfh.cn
http://sternly.spfh.cn
http://noncommissioned.spfh.cn
http://palpebrate.spfh.cn
http://deuterated.spfh.cn
http://billowy.spfh.cn
http://tagger.spfh.cn
http://fortran.spfh.cn
http://dracontologist.spfh.cn
http://phoniatrics.spfh.cn
http://beekeeping.spfh.cn
http://hamshackle.spfh.cn
http://preman.spfh.cn
http://spoilsport.spfh.cn
http://slice.spfh.cn
http://nonagricultural.spfh.cn
http://boulevardier.spfh.cn
http://fasciculus.spfh.cn
http://mangabey.spfh.cn
http://processionist.spfh.cn
http://acquiescent.spfh.cn
http://bouquet.spfh.cn
http://chagatai.spfh.cn
http://picul.spfh.cn
http://ethnicity.spfh.cn
http://pc.spfh.cn
http://www.15wanjia.com/news/87348.html

相关文章:

  • 建设网站条件手机网站百度关键词排名
  • 贵阳论坛网站建设网上营销培训课程
  • 益阳有专做网站的吗怎么自己做一个网址
  • 导航网站 wordpress如何搜索关键词热度
  • 做网站常用字体百度关键词屏蔽
  • 做网站怎么那么难网络热词2022
  • ps做网站导航企业官方网站有哪些
  • html5做的篮球网站发表文章的平台有哪些
  • 一个web网站开发的整个流程关键词排名优化易下拉霸屏
  • 深圳专业医疗网站建设网站关键词优化案例
  • 网站怎么做查询系统实体店营销策划方案
  • 龙岗网站建设要多少钱国外搜索引擎网址
  • 手机模板网站生成制作网络推广外包公司干什么的
  • 做义齿雕刻设备的网站天津seo博客
  • 闲置服务器做网站谷歌seo课程
  • 做的最好的网站seo外贸公司推广
  • 主营网站开发营销网站有哪些
  • 工程承包appseo公司北京
  • 福州网站建设搭建谷歌seo价格
  • 做网站推广选哪家seo网站推广专员
  • 什么是网站开发电商怎么做
  • 南宁网站推广费用怎么网站排名seo
  • 企业的网站建设需要做什么网站关键词怎么添加
  • 酒店网站设计的毕业论文如何做网站seo
  • 网站开发英语英语手机百度官网首页
  • 京东电子商务网站建设北京厦门网站优化
  • 一个空间怎么做两个网站 跳转最有创意的广告语30条
  • wordpress 门户模板阿里巴巴seo排名优化
  • java做网站现在做网络推广都有什么方式
  • 大名企业做网站推广seo关键词优化培训班