Nacos配置中心客户端源码分析(二): 客户端和服务端交互

本文收录于专栏 Nacos
推荐阅读:Nacos 架构 & 原理
⚠️:使用的Nacos版本为2.3.X

文章目录

  • 前言
  • 一、NacosConfigLoader
  • 二、NacosConfigService
  • 三、ClientWorker
  • 四、服务端处理逻辑
  • 总结


前言

上篇文章我们简单看了看Nacos客户端在启动的时候,初始化本地配置的大致流程。
本篇我们开始逐渐深入细节,先从客户端和服务端交互的相关代码入手。


一、NacosConfigLoader

上篇中我们也提到了客户端从服务端获取配置的代码:
在这里插入图片描述
这个nacosConfig就是从服务端获取到的,我们看下这个load()做了什么。

public String load(String dataId, String groupId, Properties nacosProperties) throws RuntimeException {try {//获取ConfigServiceconfigService = nacosServiceFactory != null? nacosServiceFactory.createConfigService(nacosProperties): NacosFactory.createConfigService(nacosProperties);}catch (NacosException e) {throw new RuntimeException("ConfigService can't be created with dataId :"+ dataId + " , groupId : " + groupId + " , properties : "+ nacosProperties, e);}//拿到服务端的配置内容return NacosUtils.getContent(configService, dataId, groupId);
}

NacosUtils.getContent的实现逻辑就是从configService中获取数据:

String content = null;
try {content = configService.getConfig(dataId, groupId, DEFAULT_TIMEOUT);
}

二、NacosConfigService

@Override
public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {return getConfigInner(namespace, dataId, group, timeoutMs);
}

getConfigInner代码如下:

private String getConfigInner(String tenant, String dataId, String group, long timeoutMs) throws NacosException {group = blank2defaultGroup(group);ParamUtils.checkKeyParam(dataId, group);ConfigResponse cr = new ConfigResponse();cr.setDataId(dataId);cr.setTenant(tenant);cr.setGroup(group);// We first try to use local failover content if exists.// A config content for failover is not created by client program automatically,// but is maintained by user.// This is designed for certain scenario like client emergency reboot,// changing config needed in the same time, while nacos server is down.String content = LocalConfigInfoProcessor.getFailover(worker.getAgentName(), dataId, group, tenant);if (content != null) {LOGGER.warn("[{}] [get-config] get failover ok, dataId={}, group={}, tenant={}, config={}",worker.getAgentName(), dataId, group, tenant, ContentUtils.truncateContent(content));cr.setContent(content);String encryptedDataKey = LocalEncryptedDataKeyProcessor.getEncryptDataKeyFailover(agent.getName(), dataId, group, tenant);cr.setEncryptedDataKey(encryptedDataKey);configFilterChainManager.doFilter(null, cr);content = cr.getContent();return content;}try {ConfigResponse response = worker.getServerConfig(dataId, group, tenant, timeoutMs, false);cr.setContent(response.getContent());cr.setEncryptedDataKey(response.getEncryptedDataKey());configFilterChainManager.doFilter(null, cr);content = cr.getContent();return content;} catch (NacosException ioe) {if (NacosException.NO_RIGHT == ioe.getErrCode()) {throw ioe;}LOGGER.warn("[{}] [get-config] get from server error, dataId={}, group={}, tenant={}, msg={}",worker.getAgentName(), dataId, group, tenant, ioe.toString());}content = LocalConfigInfoProcessor.getSnapshot(worker.getAgentName(), dataId, group, tenant);if (content != null) {LOGGER.warn("[{}] [get-config] get snapshot ok, dataId={}, group={}, tenant={}, config={}",worker.getAgentName(), dataId, group, tenant, ContentUtils.truncateContent(content));}cr.setContent(content);String encryptedDataKey = LocalEncryptedDataKeyProcessor.getEncryptDataKeySnapshot(agent.getName(), dataId, group, tenant);cr.setEncryptedDataKey(encryptedDataKey);configFilterChainManager.doFilter(null, cr);content = cr.getContent();return content;
}

以上这个方法是客户端获取config data的方法,我们可以从其中看出三个获取配置的方式:

  1. LocalConfigInfoProcessor.getFailover:从客户端本地一个文件中尝试获取配置,这种方式用于服务故障时临时使用。可以直接在指定地址创建文件,客户端启动时,会优先从此文件获取配置。
  2. ConfigResponse response = worker.getServerConfig(dataId, group, tenant, timeoutMs, false):请求Nacos服务端,获取配置数据。
  3. LocalConfigInfoProcessor.getSnapshot(worker.getAgentName(), dataId, group, tenant); :从本地快照中获取数据。

三、ClientWorker

上文中我们看到了客户端从服务端获取数据的代码:ConfigResponse response = worker.getServerConfig(dataId, group, tenant, timeoutMs, false)。我们接下来看看这个类是如何从服务端获取数据的。
在这里插入图片描述
这里可以看到是最终是发起了一个GRPC请求去服务端获取数据。

四、服务端处理逻辑

之前梳理服务注册时,我们了解过服务端处理GRPC请求的入口类:GrpcRequestAcceptor
处理请求的主要逻辑如下:

  1. 从请求中获取请求类型type
  2. 根据type获取处理当前请求的处理类:RequestHandler requestHandler = requestHandlerRegistry.getByRequestType(type);
  3. 处理请求,获取结果:Response response = requestHandler.handleRequest(request, requestMeta);

当前请求的处理类是:ConfigQueryRequestHandler
这个类会从server端的本地缓存或者指定数据库去获取配置数据。

总结

本篇我们简单梳理了客户端和服务端在获取配置时的大致流程。可以看到客户端在启动时,优先从客户端本地去尝试获取数据,获取不到时,才会请求服务端去获取数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/39619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

远程抄表管理系统建设方案(Word原件)

远程抄表管理系统建设方案应涵盖智能表计安装、数据采集与传输、数据处理与分析三大核心环节。首先,安装智能表计以实时采集水、电、气等数据;其次,利用先进的通信技术(如GPRS、LoRa等)实现数据的稳定传输;…

c语言回顾-数组(全网最详细,哈哈哈)

目录 前言,和小编一起感受数组的魅力!!! 1.数组的概念 2.一维数组的创建和初始化 2.1数组创建 2.2数组的初始化 2.3数组的类型 3.一维数组的使用 3.1数组下标 3.2数组元素的输入输出 小结: 4.一维数组在内存…

pycharm的usages在哪设置?

参考文章:https://blog.51cto.com/save/8961821 在代码编辑器(如PyCharm或IntelliJ IDEA)中,"1 usage"通常表示当前光标所在的代码元素(如变量、函数、类等)在其他地方被使用了一次。这个功能可…

什么是自动气象站呢

自动气象站,作为现代气象观测的重要工具,已经深入到我们生活的各个领域,从气象预报到农业生产,再到环境保护,自动气象站都发挥着不可或缺的作用。 自动气象站,顾名思义,是一种能够自动收集、处理…

昇思25天学习打卡营第7天|网络构建

网络构建 神经网络模型由tensor操作和神经网络层构成。 MIndSporezhong,Cell是构建所有网络的基类,也是网络的基本单元。cell也由子cell构成。 定义模型类 # 继承nn.Cell类 class Network(nn.Cell):def __init__(self):super().__init__()self.flatte…

所以,这些AI产品都死了?? 创业就是一场大型狼人杀;独立开发者的营销流量密码;谷歌竟然搞砸过300个项目 | ShowMeAI日报

👀日报&周刊合集 | 🎡ShowMeAI官网 | 🧡 点赞关注评论拜托啦! 1. 你可能不知道:Google Graveyard「埋葬」着 300 个被谷歌搞砸的项目 官网链接 → https://killedbygoogle.com Google Graveyard (Killed by Google…

【课程设计】基于python的一款简单的计算器

我们是大二本科生团队,主力两人耗时3天完成了这款计算器的制作。希望大家给我们多多引流!!!!!! 欢迎各位优秀的高考学子报考长安大学,报考长安大学电子信息工程专业。 欢迎有志于就…

游戏冻结工具 -- 雪藏HsFreezer v1.78

软件简介 HsFreezer是一款多功能游戏冻结工具,它允许用户随意暂停和继续游戏,同时具备系统优化和进程管理的功能。这款软件特别适合希望在游戏加载时间节省或在游戏与其他任务之间快速切换的用户。其主要特点包括快捷键操作、单锁模式的丝滑切换&#x…

音乐播放器小程序的设计

管理员账户功能包括:系统首页,个人中心,歌曲信息管理,会员优惠管理,用户管理,会员办理管理,歌曲分类管理,会员信息管理 微信端账号功能包括:系统首页,歌曲信…

人工智能--图像语义分割

个人主页:欢迎来到 Papicatch的博客 课设专栏 :学生成绩管理系统 专业知识专栏:专业知识 ​ 文章目录 🍉引言 🍉介绍 🍈工作原理 🍍数据准备 🍍特征提取 🍍像素分…

【数智化人物展】法大大黄翔:从他山之石看中国企业数智化升级的机会点

黄翔 本文由法大大创始人兼CEO黄翔投递并参与由数据猿联合上海大数据联盟共同推出的《2024中国数智化转型升级先锋人物》榜单/奖项评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 随着AI、云计算、大数据等技术的飞速发展,数智化转型升级已是全球企业的共识…

css flex 子元素溢出时,父元素被撑开解决方案

当父元素使用flex: 1;自适应填满时,子元素内容溢出,父元素内容撑大,导致页面显示问题,或设置了overflow 为scroll 的元素没出现滚动条等问题 解决方案: 1.如果是横向排列,flex: 1;的元素加上width: 0; 此…

调整分区失败致盘无法访问:深度解析与数据恢复全攻略

调整分区失败盘打不开的困境 在计算机的日常维护与管理中,调整磁盘分区是常见的操作之一,旨在优化存储空间布局、提升系统性能或满足特定应用需求。然而,当这一操作未能如预期般顺利进行,反而导致分区调整失败,进而使…

模拟算法系列|替换所有的问号|提莫攻击|种花问题|Z字形变换|兼具大小写的英文字母|删除字符使频率相同

大家好,我是LvZi,今天带来模拟算法系列|替换所有的问号|提莫攻击|种花问题|Z字形变换|兼具大小写的英文字母|删除字符使频率相同 一.基本概念 模拟算法就是根据题意 模拟出代码的过程,模拟算法的题意往往都很简单,考验的是将思路转化为代码的能力,十分的锻炼代码能力,且能很好…

【日记】在街上跳舞被同事看见了(470 字)

正文 昨晚跳舞,照例在街上表演,被单位里的保洁阿姨撞见了…… 我以为这就完了,结果她还拍了视频发给做饭阿姨。晚上吃饭无意间聊起才知道有这回事。我竟一时间不知该哭还是该笑……. 今天非常非常闲。虽然不是没工作,只是我懒得去…

418天内第6次发布,科大讯飞星火大模型在跟谁赛跑?

常言道“一步慢,步步慢”,大模型市场瞬息万变,快人一步就是竞争的反转。 6月27日,科大讯飞如期公布星火大模型的最新进展:大模型底座七大核心能力得到全面提升,星火大模型V4.0可对标GPT-4 Turbo&#xff0…

软考系统架构师高效备考方法论

软考系统架构师高效备考方法论 本章总结的备考方法论也是希望能帮助更多的小伙伴高效的备考最终通过考试,这种考试个人感觉是尽量一次性考过, 要不然老拖着,虽然每年可以考两次,5月和11月,两次考试间隔5个月时间&#…

ELK日志实时监控

目录 一、ELK/EFK简介 1.1 什么是ELK/EFK? 1.2 常见架构 1、Elasticsearch Logstash Kibana 2、Elasticsearch Logstash Filebeat Kibana 3、Elasticsearch Logstash Filebeat Kibana Redis 4、Elasticsearch Fluentd Filebeat Kibana 1.3 基本流程 二、…

JVM专题之垃圾收集算法

标记清除算法 第一步:标记 (找出内存中需要回收的对象,并且把它们标记出来) 第二步:清除 (清除掉被标记需要回收的对象,释放出对应的内存空间) 缺点: 标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需 要分配较大对象时,无法找到…

反射--通俗易懂

一、反射(Reflection) 反射就是:加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等) 动态语言,是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他…