共计 2082 个字符,预计需要花费 6 分钟才能阅读完成。
Spring Cloud Alibaba Nacos 作为注册核心不止提供了服务注册和服务发现性能,它还提供了服务可用性监测的机制。有了此机制之后,Nacos 能力感知服务的衰弱状态,从而为服务调用者提供衰弱的服务实例,最终保障了业务零碎可能失常的执行。
两种健康检查机制
Nacos 中提供了两种健康检查机制:
- 客户端被动上报机制。
- 服务器端反向探测机制。
如何了解这两种机制呢?
设想⼀下这么⼀个场景,你所在的地区忽然产生地质灾害,你被覆盖在废墟上面,搜救队必须要晓得你在废墟外面,那么能力对你进行施救。那有什么办法能够让救援队晓得你在废墟上面?
- 第⼀种,你在废墟外面大喊 help! help! I am here!,让搜救队晓得你的地位和衰弱状态。
- 第二种,搜救队应用了他们的业余查看设施,探测到你正埋在废墟上面。
以上这两种办法和 Nacos 的两种健康检查机制相似,也就是客户端被动上报机制,是客户端每隔一段时间,被动向 Nacos 服务器端上报本人的健康状况,而服务器端反向探测机制是 Nacos 服务器端来检测客户端是否衰弱。
如何设置健康检查机制?
Nacos 中的健康检查机制不能被动设置,但健康检查机制是和 Nacos 的服务实例类型强相干的。
也就是说 Nacos 中的两种服务实例别离对应了两种健康检查机制:
- 长期实例(也能够叫做非长久化实例):对应的是客户端被动上报机制。
- 永恒实例(也能够叫做长久化实例):服务端反向探测机制。
为什么须要两种服务实例呢?
以淘宝为例,双十一大促期间,流量会比平时高出很多,此时服务必定须要减少更多实例来应答高并发,而这些实例在双十一之后就无需持续应用了,采纳长期实例比拟适合。而对于服务的一些常备实例,则应用永恒实例更适合。
客户端被动上报机制
长期实例每隔 5 秒会被动上报一次本人的健康状况 ,发送的数据包叫做心跳包,发送心跳包的机制叫做心跳机制。
如果心跳包的间隔时间超过了 15 秒,那么 Nacos 服务器端就会将此服务实例标记为非衰弱实例,如果心跳包超过了 30s 秒,那么 Nacos 服务器端将会把此服务实例从服务列表中删除掉 。
运行 Nacos 我的项目时,能够看到客户端被动上报心跳包的日志,如下图所示:
从上述图片能够看出,Nacos 客户端会以每 5s 一次的频率来上报本人的衰弱状况,申请信息如下:
/nacos/v1/ns/instance/beat?app=unknown&namespaceId=public&port=8081&clusterName=DEFAULT&ip=192.168.3.72&serviceName=DEFAULT_GROUP@@spring-cloud-nacos-producer2
服务端反向探测机制
永恒实例应用的服务器端反向探测的形式实现健康检查的,它的探测周期是 2000 毫秒 + 随机数(5000 毫秒以内),如果检测异样会将此服务实例,标记为非衰弱实例,但不会把服务实例向长期实例那样进行删除。
Nacos 服务器反向探测目前内置了 3 种探测协定:HTTP 探测、TCP 探测和 MySQL 探测。
⼀般而言 HTTP 和 TCP 探测曾经能够涵盖绝大多数的健康检查场景,MySQL 次要用于非凡的业务场景,例如数据库的主备须要通过服务名对外提供拜访,须要确定以后拜访数据库是否为主库时,那么咱们此时的健康检查接口,是⼀个查看数据库是否为主库的 MySQL 命令。
TCP 探测
默认状况下,永恒实例应用的是 TCP 探测,这点能够在 Nacos 控制台察看到,如下图所示:
默认会应用 IP 端口来查看,如下图所示:
TCP 探测的大体逻辑是通过与注册实例建设 channel,一直 ping 注册实例的端口,来判断实例是否衰弱。
HTTP 探测
HTTP 探测须要在 Nacos 控制台手动配置,如下图所示:
咱们在服务实例中增加探测接口的实现代码:
此时咱们重新启动服务实例,在服务详情中能够看到咱们配置的 HTTP 探测曾经失效了,能够查看出实例是衰弱的,如下图所示:
Nacos 服务器端通过查看 HTTP 的接口是否返回 200 状态码,来判断实例是否为衰弱状态。
集群下的健康检查机制
集群下的健康检查机制能够用一句话来概括,那就是“各司其职”。每个服务对应了一个主注册核心,当注册核心接管到长期实例的心跳包之后,将衰弱状态同步给其余注册核心。而永恒实例也是相似的,每个服务对应了一个主注册核心,当负责的注册核心探测到服务实例的衰弱状态产生扭转时,再会将实例的健康状况同步到其余注册核心,从而实现了集群下的健康检查机制。
总结
Nacos 中提供了两种健康检查机制:长期实例的客户端被动上报机制和永恒实例的服务端反向探测机制。长期实例每隔 5s 发送一个心跳包给 Nacos 服务器端,服务器端接管到心跳包之后再将健康状况同步给其余注册核心。永恒实例反对 3 种探测协定,TCP、HTTP 和 MySQL,默认探测协定为 TCP,也就是通过一直 ping 的形式来判断实例是否衰弱。
参考 & 鸣谢
《Nacos 框架与原理》
是非审之于己,毁誉听之于人,得失安之于数。
公众号:Java 中文社群
Java 面试合集:https://gitee.com/mydb/interview