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


首先下载好Nacos的源码
在这里插入图片描述

关于源码怎么导入到maven, 在预习资料有个文档,写的很清楚, 可以找我的助理

Nacos源码分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IootrAVR-1612239044182)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps2.jpg)]

访问nacos

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TvHUu14H-1612239044183)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps3.jpg)]

讲源码前, 我先抛一个问题, 如果客户端访问一个刚刚关闭的服务, 是不是会报错?
你的答案是什么?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PmfzUrew-1612239044187)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps6.jpg)]

正确答案是: 有可能还会调到已停的服务, 怎么处理?其实就是做了一个服务降级的处理

所以互联网线上一般对非核心非关键的服务都要做降级/熔断处理

OK, 那我们看看到底如何注册到Nacos的, 服务下线后,如何收到心跳, 客户端如何发现的等问题

我们来分析一下客户端服务如何向Nacos注册的?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9kyLtQpJ-1612239044188)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps7.jpg)]

会去扫描yml配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s0xmqBj3-1612239044189)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps8.jpg)]

找到nacos服务地址, 进行注册

我们点进去看看这个包依赖了什么内容?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gAnDFXSh-1612239044189)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps9.jpg)]

点击进入

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2r31ViNf-1612239044190)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps10.jpg)]

打开jar包也可以看到依赖关系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R9g9rQP7-1612239044190)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps11.jpg)]

再点开META-INF目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iJ2INBFZ-1612239044191)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps12.jpg)]

有个spring.factories, 这个是干什么用的呢? 这个不知道的同学要把springboot底层自动装配原理要重点看一下啦

其实就是springboot在启动的时候, 会加载spring.factories里的配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3tUtlOTZ-1612239044192)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps13.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HCkwNpIP-1612239044192)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps14.jpg)]

Nacos客户端最终通过这个类完成注册的, 怎么找到这个类的呢

点进去 看一下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9VHcTBY1-1612239044193)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps15.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3vMlNLC9-1612239044193)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps16.jpg)]

如果对springboot稍微熟悉点的, 其实就是看auto自动装配初始化的那些bean

不难发现, NacosAutoServiceRegistration就是我们客户端向nacos进行服务注册的类

点进看一下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WMtFL8lA-1612239044194)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps17.jpg)]

点进父类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K03bKJoa-1612239044195)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps18.jpg)]

点进bind方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lCaPfHHh-1612239044195)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps19.jpg)]

OK继续阅读

点进start方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qt0CoRRk-1612239044196)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps20.jpg)]

我们读源码要学会读主线源码, 像 一些if都是分支代码, 你第一遍看的时候可以先跳过

但不是说不看, 你后面可以看

看源肯定不是一遍的

Ctrl+t查看源码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PwFlVg4H-1612239044196)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps21.jpg)]

点第1个, 进入register方法的实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ba4DcXnz-1612239044197)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps22.jpg)]

再点进

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9fBR0jgd-1612239044198)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps23.jpg)]

可以打开Instance看一下, 和官网做个对比

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RvpbBJuD-1612239044198)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps24.jpg)]

再回到 register

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KtIXp9XO-1612239044199)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps25.jpg)]

点进去看一下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Dq8yyDM-1612239044200)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps26.jpg)]

再点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tXOsBtLN-1612239044201)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps27.jpg)]

再点进

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q3dznYax-1612239044201)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps28.jpg)]

这就是客户端注册 的代码, 对比一下官网的地址是否一样?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cWXEEHdu-1612239044202)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps29.jpg)]

不难发样就是拼这么个请求路径

这个客户端注册类是不是写在nacos-client.jar里, 这也是我们为什么要引入这个jar的原因

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xfkmyq86-1612239044203)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps30.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5NeTYxR2-1612239044203)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps31.jpg)]

同时NacosNamingService也是在client包里, nacos直接把这个jar包丢给我们的业务系统, 直接调用就可以向nacos-server注册, 这样说明白了吧

但这个地方要注意一下

在注册之前

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UAgq33Cz-1612239044204)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps32.jpg)]

这个if逻辑要看一下, 这段代码跟心跳有关

我们上面讲的心跳还记得不

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-20bobV2G-1612239044205)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps33.jpg)]

我们先看一下官网讲的心跳接口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I4MaD8BY-1612239044206)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps34.jpg)]

再看一下我们的代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JlpBfexA-1612239044206)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps35.jpg)]

再回头看, true表示为临时实例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3ihXou9J-1612239044207)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps36.jpg)]

默认是临时实例, 微服务架构一般默认都是临时的, 持久化的实例效率不高

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2STNQeML-1612239044208)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps37.jpg)]

再点进去

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sbio59vP-1612239044208)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps38.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jFgY4CpW-1612239044209)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps39.jpg)]

再点进去

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-izQgjrEQ-1612239044210)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps40.jpg)]

再点sendBeat方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kiEeOHEl-1612239044211)(file:///C:\Users\10762\AppData\Local\Temp\ksohtml16900\wps41.jpg)]
大家看到没, 这里就是去调用Nacos服务端的http心跳接口了, 简单不?
所以我经常讲, 你如果读了Spring源码, 后面的所有框架源码都势如破竹, 非常简单.

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐