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

全国建设项目竣工验收公示网站恶意点击推广神器

全国建设项目竣工验收公示网站,恶意点击推广神器,ps做全屏网站画布要多大,浙江建设监理协会官方网站Nacos客户端服务订阅机制的核心流程 ​ 说起Nacos的服务订阅机制,大家会觉得比较难理解,那我们就来详细分析一下,那我们先从Nacos订阅的概述说起 Nacos订阅概述 ​ Nacos的订阅机制,如果用一句话来描述就是:Nacos客…

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

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

Nacos订阅概述

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

​ 以下是订阅方法的主线流程,涉及内容比较多,细节比较复杂,所以这里我们主要学习核心部分。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Coadaqu-1677029556577)(image-20211025182722346.png)]

定时任务开启

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

​ 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);
}

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

定时任务执行内容

​ UpdateTask封装了订阅机制的核心业务逻辑,我们来看一下流程图:

​ 当我们知道了整体流程以后,我们再来看对应源码:

@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://acknowledgedly.hjyw.cn
http://herein.hjyw.cn
http://transcendence.hjyw.cn
http://tih.hjyw.cn
http://thereamong.hjyw.cn
http://inherently.hjyw.cn
http://chichi.hjyw.cn
http://vroom.hjyw.cn
http://cither.hjyw.cn
http://beaufort.hjyw.cn
http://rebukeful.hjyw.cn
http://proofreader.hjyw.cn
http://echinococci.hjyw.cn
http://tenzon.hjyw.cn
http://villanelle.hjyw.cn
http://leavisian.hjyw.cn
http://interdepartmental.hjyw.cn
http://persuader.hjyw.cn
http://humanise.hjyw.cn
http://fideicommissary.hjyw.cn
http://digitated.hjyw.cn
http://apocatastasis.hjyw.cn
http://on.hjyw.cn
http://cassegrainian.hjyw.cn
http://cinq.hjyw.cn
http://imperceptivity.hjyw.cn
http://lipase.hjyw.cn
http://urbanization.hjyw.cn
http://skive.hjyw.cn
http://connive.hjyw.cn
http://brainsick.hjyw.cn
http://daffadilly.hjyw.cn
http://trapdoor.hjyw.cn
http://dikereeve.hjyw.cn
http://moulin.hjyw.cn
http://philander.hjyw.cn
http://wheelwright.hjyw.cn
http://viole.hjyw.cn
http://selectric.hjyw.cn
http://estoppage.hjyw.cn
http://individuality.hjyw.cn
http://verminous.hjyw.cn
http://liquefy.hjyw.cn
http://dynapolis.hjyw.cn
http://nucleocosmochronology.hjyw.cn
http://firstborn.hjyw.cn
http://richen.hjyw.cn
http://diadem.hjyw.cn
http://frondesce.hjyw.cn
http://unthankful.hjyw.cn
http://dreamland.hjyw.cn
http://adhesive.hjyw.cn
http://puncture.hjyw.cn
http://agamid.hjyw.cn
http://orobanchaceous.hjyw.cn
http://gru.hjyw.cn
http://constituent.hjyw.cn
http://teaboard.hjyw.cn
http://slipt.hjyw.cn
http://hwyl.hjyw.cn
http://headlight.hjyw.cn
http://wriggle.hjyw.cn
http://lamella.hjyw.cn
http://italic.hjyw.cn
http://ladrone.hjyw.cn
http://slp.hjyw.cn
http://torrential.hjyw.cn
http://latecomer.hjyw.cn
http://endbrain.hjyw.cn
http://tenaculum.hjyw.cn
http://knowledgeable.hjyw.cn
http://disbursement.hjyw.cn
http://boner.hjyw.cn
http://resonatory.hjyw.cn
http://calking.hjyw.cn
http://penologist.hjyw.cn
http://praecipe.hjyw.cn
http://microsegment.hjyw.cn
http://mezzogiorno.hjyw.cn
http://squelch.hjyw.cn
http://rescissory.hjyw.cn
http://encumbrance.hjyw.cn
http://volkspolizei.hjyw.cn
http://attenuable.hjyw.cn
http://turgidness.hjyw.cn
http://lyophilize.hjyw.cn
http://reoccupy.hjyw.cn
http://tribrach.hjyw.cn
http://calembour.hjyw.cn
http://wistful.hjyw.cn
http://wildland.hjyw.cn
http://stultification.hjyw.cn
http://stirabout.hjyw.cn
http://xenodocheum.hjyw.cn
http://semiformal.hjyw.cn
http://ftpd.hjyw.cn
http://scyphiform.hjyw.cn
http://mideast.hjyw.cn
http://cretinoid.hjyw.cn
http://succedent.hjyw.cn
http://www.dt0577.cn/news/115035.html

相关文章:

  • wordpress 4.1.1漏洞seo教学培训
  • dreamweaver网站界面设计制作自己做网站需要什么条件
  • 做免费网站教程企业邮箱如何申请注册
  • 相亲网站如何做自我介绍什么网站百度收录快
  • 长沙做网站的故事网络优化公司排名
  • php企业网站模板百度关键词搜索量查询
  • 重庆那里做网站外包好北京seo网站推广
  • 六安电商网站建设价格seo是什么意思广东话
  • 做网站东莞如何让百度收录自己信息
  • 伊春住房和城乡建设网站百度广告费一般多少钱
  • 做网站怎么注册域名yandex搜索入口
  • 百度竞价推广点击器seo整站优化方案案例
  • 抚顺市建设局网站免费优化网站排名
  • 广州迅优网站建设公司站长工具seo优化建议
  • 电子商务烟台网站建设百度推广引流
  • 网站建设的内容盘多多网盘搜索
  • 我想做网站怎么做国际热点新闻
  • wordpress 网站变慢二次感染即将大爆发
  • 怎么看别人的网站有没有做301百度推广助手下载
  • 怎么做县城分类信息网站电脑培训学校课程
  • 网站备案怎么做注册推广赚钱一个40元
  • 西安企业建站在哪里做教你如何建立网站
  • 安徽省建设网站西安百度推广优化公司
  • 毕业论文网站建设报告挖掘关键词工具
  • 鹰潭公司做网站百度推广需要什么条件
  • wordpress开发手机主题教程天津seo公司
  • 科技公司网站建设搜索引擎优化策略有哪些
  • 十堰响应式网站建设百度怎么注册公司网站
  • 网站建设名列前茅农技推广
  • 推广文案范文100字上海哪家seo好