1. Nacos入门

1.1. 前言

我的初衷是想搞一套适合自定义快速开发的框架,把一些必要的技术整合进来,第一想法是尝试下SpringCloud Alibaba,毕竟是阿里开发,适应国人需求,下载源码本打算研究下,看了nacos,就想到之前项目用的Eureka,而我也深知Eureka真的只是单纯的注册中心,需要配置属性还要依赖git做配置中心,所以改用nacos或许也是不错的主意,于是开始研究nacos

1.2. 部署配置

我这入门和普通的运行demo入门不一样,直接看源码说话,先把SpringCloud Alibaba的git代码下下来

由于nacos是个单独部署的服务,所以先去Nacos官网安装好nacos,账号密码都是nacos,修改配置文件nacos地址

1.3. 控制台配置

可以看到上述配置文件,明显一个dataId对应了一个配置文件,group做为分组参数,我们可以再nacos界面进行配置

点击发布,确认后就可以更新到应用,那么现在来研究它的原理

1.4. 调试分析

1.4.1. 获取配置

随意发布更新一个配置看到打印参数

那么进ClientWorker类,可以看到一个单独的线程池负责了数据的接收

其中核心的更新配置方法为checkUpdateDataIds,而该方法内部的核心方法为checkUpdateConfigStr,其核心内容如下

明显可以看到一个远程post调用的方法,此方法用来获取nacos的最新配置,到这里可能要问了,明明是nacos修改配置推送给客户端,为什么是客户端调用服务端?这里nacos用了个巧妙的方法,设置较长的超时时间,看截图可以看出,超时时间为45秒,实际上nacos在30秒的时候若没有修改数据,就会返回空数据表示没有更新,若30秒以内有更新数据,则可以在这个45秒的请求中直接返回,看到这个设计我还真有点佩服作者脑洞的,这样做相当于把心跳和数据传输结合起来了,不需要再额外搞个心跳连接,一旦nacos挂了,客户端就会报错,客户端在请求则nacos也知道客户端存活。我能想到的劣势,或许就是这样的长连接不能搞太多吧,但一般服务连接也够了

接下来进入方法parseUpdateDataIdResponse,该方法用来确认修改了哪份配置,真正修改系统配置的还要回去继续看

可以看到changedGroupKeys为改变的文件,nacos在拿到改变文件名称后,会通过getServerConfig方法主动去获取改变数据

之后通过LocalConfigInfoProcessor.saveSnapshot在本地存一个快照,更新本地缓存cacheMap

1.4.2. 刷新配置

遍历缓存配置文件名

检测数据变化

刷新属性值

刷新容器,加载新的配置文件

加载对应环境配置文件

资源定位器

读取位置,这里读取的是故障转移文件,也就是可以放自己的配置文件在nacos故障的时候可以使用

一般没有故障转移文件,则远程调用获取正确配置

构建PropertySource

1.5. 总结

整个流程下来可以总结为几步

保持远程连接,拉取改变的文件名

根据拉取的文件名,dataId等参数获取真正的配置数据

更新缓存中配置,这里我发现好多地方都会经过configFilterChainManager.doFilter(null, cr),我通过反射添加了过滤器,结果一次文件更新会调用好多遍doFilter,目前没搞清它的意义是什么

发布配置更新事件RefreshEvent,会重新加载propertySource,过程中会远程调用Nacos再次去调用最新配置

1.6. 问题

没想明白这冗余的设计,随着源码的深入,真的反转反转再反转,剧情跌宕起伏

我以为在阻塞请求中会直接返回改变的配置参数,结果返回的是nacos中配置的文件名,好吧,这也可以理解,文件名用来定位具体的propertySource也行,但为什么不和改变参数一起返回;

那好,根据第一次返回的参数再去远程调用获取配置,我以为可能只返回修改的参数,返回的却是整个文件参数,好吧,这样容错更好也能理解,就是一次可能传递的数据量会比较多,似乎和apollo的设计不同

我以为拿到数据应该会去更新环境变量,刷新实例了,但是也没有,对着缓存操作了一通,然后直接刷新Spring容器,通过它早就定义好的资源定位器,重新远程读取配置内容,刷新到propertySource中

好吧,中间的一系列操作,我姑且认为为其它依赖做准备,但多次出现的configFilterChainManager.doFilter(null, cr)又看不懂了,看名字应该是链式过滤器,但哪有过滤器再一次更新中调用3次以上的,而且在没刷新容器之前,也起不到过滤作用吧;

并且这个过滤器定义了add方法,但我没找到入口可以添加,只能通过反射强制读出属性进行过滤器的添加

我也看到了listener.receiveConfigInfo(contentTmp);这么个方法,这个更像是对用户提供的配置内容读取方法,若想要拿到配置变动后新的配置信息,可别用filter去了,实现的例子如下

nacos 本地测试_Nacos入门相关推荐

  1. nacos 本地测试_Nacos集群配置实例(windows下测试)

    1.首先 fork 一份 nacos 的代码到自己的 github 库,然后把代码 clone 到本地. git地址:https://github.com/alibaba/nacos.git 2.然后 ...

  2. nacos 本地测试_Nacos注册中心落地实践

    前言 公司在19年开始推进同城双活架构,未来规划是在南汇机房出现故障时能把所有读流量切到宝山机房,这样至少保证读请求是没问题的;我们的微服务使用的zookeeper来做服务发现, zk由于它的强一致性 ...

  3. nacos 本地测试_微服务架构系列之Nacos 配置核心概念

    上次讲了<微服务架构之Nacos配置中心之配置MySQL数据库>,本次讲述Nacos 配置核心概念.原作者:哈喽沃德先生,谢谢关注哈喽沃德先生. 1.配置 为什么需要配置?概念. 在系统开 ...

  4. nacos 本地测试_一文详解 Nacos 高可用特性

    简介:我今天介绍的 Nacos 高可用,是 Nacos 为了提升系统稳定性而采取的一系列手段.Nacos 的高可用不仅仅存在于服务端,同时也存在于客户端,以及一些与可用性相关的功能特性中,这些点组装起 ...

  5. nacos 本地测试_本地调试和服务器调试都无法连通-问答-阿里云开发者社区-阿里云...

    本地调试和服务器调试都无法连通 anand 2018-11-20 16:30:31 4696 异常信息: com.alibaba.nacos.api.exception.NacosException: ...

  6. 从入门到不放弃:多浏览器的自动化测试(1)- 本地测试

    本文将作为多浏览器自动化测试的第一篇文章,给读者从头介绍如何进行本地多浏览的自动化测试工作,包括测试的原理.测试框架的选取.测试工程的搭建和实现等.另外"从入门到不放弃"系列将给读 ...

  7. 一键搭建php本地测试环境_如何在PHP中设置本地调试环境

    一键搭建php本地测试环境 Recently I started focusing more on PHP, and I needed to set up a local debugging envi ...

  8. 本地测试dubbo远程调用找不到provider

    项目中遇到个坑,记录一下:本地测试dubbo远程调用找不到provider.(文中图片仅供参考) 生产者服务的service加多一层文件夹.dubbo就找不到这个服务了.报错如下: org.apach ...

  9. 初学SNMP,在spring boot 下使用snmp4j 做本地测试调通的记录

    一.SNMP概念学习参考这篇 Snmp学习总结(七)--SNMP4J介绍 - 孤傲苍狼 - 博客园 (cnblogs.com) 二.SNMP协议深入学习(不想了解的可跳过)  聊聊SNMP协议 - C ...

最新文章

  1. 第十六届智能车竞赛西部赛区
  2. 腾讯科技改版 新闻帝国必经之路
  3. IPV4报头格式详解
  4. 使用Dockerfile创建一个tomcat镜像
  5. php oop 实际工作,PHP OOP注意点(一)
  6. 英语语法---主语详解
  7. Win7下Solr4.10.1和TomCat8的安装
  8. PowerShell实现批量收集SCVMM中虚拟机IP-续
  9. Spring webflow:上传多个文件
  10. 笨办法学 Python · 续 练习 27:`tr`
  11. ❤️程序员国企太安逸想辞职,又嫌私企大厂压力大996我该如何选择?(高级全栈自动化之路)
  12. json学习初体验--第三者jar包实现bean、List、map创json格式
  13. C语言判断完数(完整版)
  14. 打印图片显示选择传真调制器或服务器,选择打印时为什么显示发送传真
  15. 一款非常好看的婚纱请柬设计英文字体
  16. html中选择器是什么意思,css选择器是什么意思?
  17. 卸载精灵 v4.2 是什么
  18. 中科院自动化所 模式识别国家重点实验室(NLPR)
  19. 删除子文件夹[字典树 + go变量 + strings.builder的copyCheck()]
  20. Acer暗影骑士RTX3060 显卡最大功率95W笔记

热门文章

  1. Apple Notification Center Service--ANCS【转】
  2. infobright安装部署及参数调整优化
  3. Git 提交失败提示无写入权限与 Linux 下创建文件的默认权限
  4. C语言基础知识之基本数据类型相关的总结
  5. 毕业准备:外企面试--基本涵盖了所有问题【附带有答案版本】
  6. 删除VS.NET起始页上项目名称的方法.
  7. 吐血原创-我用“电驴”抓肉鸡!!!
  8. 提升windows 2000的启动速度
  9. java实现行程长度编码,java 实现行程编码解码?
  10. opencv获取mat的指针_数字图像处理之opencv中Mat数据操作