订阅服务消息,这里是由HostReactor类的getServiceInfo()方法来实现的:

public ServiceInfo getServiceInfo(final String serviceName, final String clusters) {NAMING_LOGGER.debug("failover-mode: " + failoverReactor.isFailoverSwitch());// 由 服务名@@集群名拼接 keyString key = ServiceInfo.getKey(serviceName, clusters);if (failoverReactor.isFailoverSwitch()) {return failoverReactor.getService(key);}// 读取本地服务列表的缓存,缓存是一个Map,格式:Map<String, ServiceInfo>ServiceInfo serviceObj = getServiceInfo0(serviceName, clusters);// 判断缓存是否存在if (null == serviceObj) {// 不存在,创建空ServiceInfoserviceObj = new ServiceInfo(serviceName, clusters);// 放入缓存serviceInfoMap.put(serviceObj.getKey(), serviceObj);// 放入待更新的服务列表(updatingMap)中updatingMap.put(serviceName, new Object());// 立即更新服务列表updateServiceNow(serviceName, clusters);// 从待更新列表中移除updatingMap.remove(serviceName);} else if (updatingMap.containsKey(serviceName)) {// 缓存中有,但是需要更新if (UPDATE_HOLD_INTERVAL > 0) {// hold a moment waiting for update finish 等待5秒中,待更新完成synchronized (serviceObj) {try {serviceObj.wait(UPDATE_HOLD_INTERVAL);} catch (InterruptedException e) {NAMING_LOGGER.error("[getServiceInfo] serviceName:" + serviceName + ", clusters:" + clusters, e);}}}}// 开启定时更新服务列表的功能scheduleUpdateIfAbsent(serviceName, clusters);// 返回缓存中的服务信息return serviceInfoMap.get(serviceObj.getKey());
}

基本逻辑就是先从本地缓存读,根据结果来选择:

  • 如果本地缓存没有,立即去nacos读取,updateServiceNow(serviceName, clusters)

如果本地缓存有,则开启定时更新功能,并返回缓存结果:

  • scheduleUpdateIfAbsent(serviceName, clusters)

 在UpdateTask中,最终还是调用updateService方法:

不管是立即更新服务列表,还是定时更新服务列表,最终都会执行HostReactor中的updateService()方法:

public void updateService(String serviceName, String clusters) throws NacosException {ServiceInfo oldService = getServiceInfo0(serviceName, clusters);try {// 基于ServerProxy发起远程调用,查询服务列表String result = serverProxy.queryList(serviceName, clusters, pushReceiver.getUdpPort(), false);if (StringUtils.isNotEmpty(result)) {// 处理查询结果processServiceJson(result);}} finally {if (oldService != null) {synchronized (oldService) {oldService.notifyAll();}}}
}

Nacos源码HostReactor相关推荐

  1. Nacos源码系列——第三章(全网最经典的Nacos集群源码主线剖析)

    上两个章节讲述了Nacos在单机模式下的服务注册,发现等源码剖析过程,实战当中 其实单机是远远不够的,那么Nacos是如何在集群模式下是如何保证节点状态同步,以及服 务变动,新增数据同步的过程的!   ...

  2. Nacos源码系列——第一章(Nacos核心源码主线剖析上)

    在讲具体的源码之前,我有几点想说明下,很多开发可能觉得源码不重要,甚至觉得互联网 的知识,目前够用就可以,也不需要多么精通.的确,在大多数的公司中,你能用你的知识 解决问题就可以,不一定非要涉及到源码 ...

  3. 全网最火的Nacos源码构建,你找不到第二个有我仔细的!!

    本章开始带大家构建Nacos源码,后面我会开始分析Nacos源码的细节,结合本人在工作之余用到的Nacos点点滴滴,如果想和我一起学Nacos,就好好看这篇吧,废话不多说,先告诉你们Nacos怎么通过 ...

  4. 下载Nacos源码并运行

    要研究Nacos源码自然不能用打包好的Nacos服务端jar包来运行,需要下载源码自己编译来运行. 下载Nacos源码 Nacos的GitHub地址:GitHub - alibaba/nacos: a ...

  5. nacos 启动_【Nacos源码之配置管理 一】阅读源码第一步,本地启动Nacos

    前言 在我们去阅读Nacos源码之前,我们得先了解Nacos是干嘛的,以及怎么用,这样有利于我们更容易去理解源码; 查看Nacos的官方文档,我们知道Naocs主要有以下特性: 配置中心 服务注册与发 ...

  6. 如何访问集群中指定的服务器,【Nacos源码之配置管理 六】集群模式下服务器之间是如何互相感知的...

    前言 我们用Nacos当配置中心的时候,上一篇文章中 [Nacos源码之配置管理 五]为什么把配置文件Dump到磁盘中 知道了,所有的配置文件都会Dump到服务器的本地磁盘中, 那么集群模式下: 服务 ...

  7. (Nacos源码解析五)Nacos服务事件变动源码解析

    Nacos源码解析系列目录 Nacos 源码编译运行 (Nacos源码解析一)Nacos 注册实例源码解析 (Nacos源码解析二)Nacos 服务发现源码解析 (Nacos源码解析三)Nacos 心 ...

  8. nacos源码修改编译(亲测)

    nacos源码修改编译 文章目录 nacos源码修改编译 内容概述 源码修改 源码编译 测试 内容概述 生产项目选型时选择nacos作为项目的注册中心,但是由于内网安全要求,用户名和密码必须加密传输, ...

  9. Nacos源码阅读开篇之下载源码

    文章目录 Nacos源码阅读开篇 看源码的方法 nacos服务注册与发现源码剖析 nacos核心功能点 nacos服务端原理 nacos 客户端原理 下载Nacos源码 配置单机启动 Nacos源码阅 ...

最新文章

  1. C#生成CHM文件(应用篇)之代码库编辑器(5)【总结、程序、源代码】
  2. python主要运用于-python主要应用领域有哪些?看这一篇就够了
  3. 智能化招聘管理系统Moka完成B轮1.8亿人民币融资,高瓴资本领投
  4. Docker安装gogs git仓库
  5. 构建Squid代理服务器-传统代理、透明代理、反向代理
  6. 可视化戒烟对身体的影响!从20分钟到15年
  7. Demo分享丨看ModelArts与HiLens是如何让车自己跑起来的
  8. thymeleaf条件表达式
  9. 海美迪盒子android升级包,海美迪H6官方固件ROM升级包下载_刷机教程
  10. 笔记︱横截面回归模型中调节效应+中介效应(横截面回归模型两大方向)
  11. c语言pow函数原型_C语言pow函数
  12. 各纬度气候分布图_世界主要气候类型分布模式图39330
  13. windows使用docker-compose安装PHP框架hyperf
  14. 史上最短命!由于BUG微软撤回Win10更新
  15. 4月30日之后的华芯通
  16. 金蝶K3开发-工业单据显示物料图片
  17. 手机银行APP评测系列:天津银行持续优化手机银行用户体验,但仍需加强细节提升
  18. 大端和小端的区别和判断
  19. 〖ChatGPT实践指南 - 零基础扫盲篇⑥〗- OpenAI API 报错An error occurred during your request
  20. 2021龙岩一中高考成绩查询,喜报!龙岩这7所一中的高考成绩出炉啦~

热门文章

  1. 转:SqlServer中的datetime类型的空值和c#中的DateTime的空值的研究
  2. Android中menu详解(转)
  3. JS中数据结构之队列
  4. delphi fastreport 动态加载图片
  5. input文本框设置和移除默认值
  6. Qt Load and Save PCL/PLY 加载和保存点云
  7. dell c6220II lsi阵列卡
  8. HTMLCSS 第三天 笔记
  9. 【大话Hibernate】hibernate事务管理
  10. 2.Android 学习之虚拟机安装