大家好, 我是James, 最近整理了一下客户端微服务向Nacos注册及心跳的源码分析, 希望对大家学习有帮助, 源码可以找我的助理斯琪要一下哈v: 2996372122 并备注是看我的博客来要的资料.
首先下载好Nacos的源码

关于源码怎么导入到maven, 在预习资料有个文档,写的很清楚, 可以找我的助理
Nacos源码分析
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IootrAVR-1612239044182)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps2.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/658ebdc474eef1bd6725f6aa9400d0bb.png)
访问nacos
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TvHUu14H-1612239044183)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps3.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/4f55d82cefbe014c704c4123d1819191.png)
讲源码前, 我先抛一个问题, 如果客户端访问一个刚刚关闭的服务, 是不是会报错?
你的答案是什么?
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PmfzUrew-1612239044187)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps6.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/d74d8e1b509158bc266b62026149ca06.png)
正确答案是: 有可能还会调到已停的服务, 怎么处理?其实就是做了一个服务降级的处理
所以互联网线上一般对非核心非关键的服务都要做降级/熔断处理
OK, 那我们看看到底如何注册到Nacos的, 服务下线后,如何收到心跳, 客户端如何发现的等问题
我们来分析一下客户端服务如何向Nacos注册的?
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9kyLtQpJ-1612239044188)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps7.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/0d71fc944ef72ba148e97d2137f33095.png)
会去扫描yml配置
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s0xmqBj3-1612239044189)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps8.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/5a9026d8ea56d79cd8c16a5cfa4a94b7.png)
找到nacos服务地址, 进行注册
我们点进去看看这个包依赖了什么内容?
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gAnDFXSh-1612239044189)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps9.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/ad201d65e6d07852054608a4af54c203.png)
点击进入
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2r31ViNf-1612239044190)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps10.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/e8de1f8f6b7f2f0fb0f89dfa5531a97f.png)
打开jar包也可以看到依赖关系
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R9g9rQP7-1612239044190)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps11.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/4c49b49c62d71d43e9fb3382d7264428.png)
再点开META-INF目录
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iJ2INBFZ-1612239044191)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps12.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/e1b66a6b3238f7f7648356ee225a4960.png)
有个spring.factories, 这个是干什么用的呢? 这个不知道的同学要把springboot底层自动装配原理要重点看一下啦
其实就是springboot在启动的时候, 会加载spring.factories里的配置
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3tUtlOTZ-1612239044192)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps13.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/94662a8d90f53abb35bc2abc43e47802.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HCkwNpIP-1612239044192)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps14.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/c564ff8f2bad91a32ef2a22baa87adde.png)
Nacos客户端最终通过这个类完成注册的, 怎么找到这个类的呢
点进去 看一下
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9VHcTBY1-1612239044193)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps15.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/7b97980ba7d1f4d2b731f91cb379e791.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3vMlNLC9-1612239044193)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps16.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/c3d70a8d413a44bfe6fc9b32d5e212c0.png)
如果对springboot稍微熟悉点的, 其实就是看auto自动装配初始化的那些bean
不难发现, NacosAutoServiceRegistration就是我们客户端向nacos进行服务注册的类
点进看一下
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WMtFL8lA-1612239044194)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps17.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/2a745e05b52b51c2cb4b504bd0b7a902.png)
点进父类
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K03bKJoa-1612239044195)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps18.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/509a577369c0c15a7862713e049708ba.png)
点进bind方法
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lCaPfHHh-1612239044195)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps19.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/9f41638e0b176c2e88d34c78ea10f0fd.png)
OK继续阅读
点进start方法
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qt0CoRRk-1612239044196)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps20.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/b5add82ffaa17d1fb32225e215f1219a.png)
我们读源码要学会读主线源码, 像 一些if都是分支代码, 你第一遍看的时候可以先跳过
但不是说不看, 你后面可以看
看源肯定不是一遍的
Ctrl+t查看源码
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PwFlVg4H-1612239044196)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps21.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/2c64cfffcdc607ff1f616a371700c89b.png)
点第1个, 进入register方法的实现
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ba4DcXnz-1612239044197)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps22.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/360904a14d21d895128bc9df45ed93d2.png)
再点进
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9fBR0jgd-1612239044198)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps23.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/687f0e04723b776fcb13299ddfd10d3b.png)
可以打开Instance看一下, 和官网做个对比
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RvpbBJuD-1612239044198)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps24.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/3875e37d2d7417c3094e6a6b3c7d6bbe.png)
再回到 register
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KtIXp9XO-1612239044199)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps25.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/7d8f5486be76393cefc9bd9c7c0d8756.png)
点进去看一下
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Dq8yyDM-1612239044200)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps26.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/cd98bbfe659a41d6ceb39a235bfda5de.png)
再点
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tXOsBtLN-1612239044201)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps27.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/0f3bf10656c77fe285a531dcff78f386.png)
再点进
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q3dznYax-1612239044201)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps28.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/6148844200abbe26ea6f3d71aaa161ca.png)
这就是客户端注册 的代码, 对比一下官网的地址是否一样?
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cWXEEHdu-1612239044202)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps29.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/8c6b800ded8777a87281d4f763acca5e.png)
不难发样就是拼这么个请求路径
这个客户端注册类是不是写在nacos-client.jar里, 这也是我们为什么要引入这个jar的原因
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xfkmyq86-1612239044203)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps30.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/7a0ec978908c126b8e688f61a66385cc.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5NeTYxR2-1612239044203)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps31.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/92583c2e8e00444595d48b9438b1cc90.png)
同时NacosNamingService也是在client包里, nacos直接把这个jar包丢给我们的业务系统, 直接调用就可以向nacos-server注册, 这样说明白了吧
但这个地方要注意一下
在注册之前
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UAgq33Cz-1612239044204)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps32.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/cdb7228550f2f862224a1c6f6aa2e157.png)
这个if逻辑要看一下, 这段代码跟心跳有关
我们上面讲的心跳还记得不
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-20bobV2G-1612239044205)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps33.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/7e187f13f7604c13714711b3c1eff3de.png)
我们先看一下官网讲的心跳接口
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I4MaD8BY-1612239044206)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps34.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/7d0b825b543a3e058c969780dbda3e4d.png)
再看一下我们的代码
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JlpBfexA-1612239044206)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps35.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/e392166d7ca2eee873e42baeff2d3271.png)
再回头看, true表示为临时实例
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3ihXou9J-1612239044207)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps36.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/6548b036a68de868ae4e69244bd68bff.png)
默认是临时实例, 微服务架构一般默认都是临时的, 持久化的实例效率不高
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2STNQeML-1612239044208)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps37.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/3baf614744c4e82965e4117e0c74d158.png)
再点进去
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sbio59vP-1612239044208)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps38.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/12859f45d97ebfddfb2ae32f71ee4d4e.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jFgY4CpW-1612239044209)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps39.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/2dbe67333c6b63e1a26fddaf833c5246.png)
再点进去
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-izQgjrEQ-1612239044210)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps40.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/3194a4bfc8bbd81cf5696629166daa23.png)
再点sendBeat方法
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kiEeOHEl-1612239044211)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps41.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/ece7ff354afbb09fc19be575820f2982.png)
大家看到没, 这里就是去调用Nacos服务端的http心跳接口了, 简单不?
所以我经常讲, 你如果读了Spring源码, 后面的所有框架源码都势如破竹, 非常简单.

1912





