SpringCloud Alibaba nacos如何分配健康检查模式
问题背景
同一服务的不同实例,在nacos的健康检查模式不一致。
知识储备
nacos提供两种健康检查模式
agent上报模式
客户端(注册在nacos上的其它微服务实例)健康检查。
客户端通过心跳上报方式告知服务端(nacos注册中心)健康状态,
默认心跳间隔5秒,
nacos会在超过15秒未收到心跳后将实例设置为不健康状态,
超过30秒将实例删除。
服务端主动检测
服务端健康检查。
nacos主动探知客户端健康状态,默认间隔为20秒,
健康检查失败后实例会被标记为不健康,不会被立即删除。
临时实例
临时实例通过agent上报模式实现健康检查。
微服务注册为临时实例:
# 默认false
spring:
cloud:
nacos:
discovery:
ephemeral: true
环境配置信息
服务器123
部署有单实例的nacos、端口为4000的微服务,注册到本机nacos
系统:Centos7
IP:***.***.1.123
服务器105
部署端口为4000的微服务,注册到123上nacos
系统:Centos7
IP:***.***.1.105
本地电脑181
部署端口为4000的微服务,注册到123上nacos
系统:Windows
IP:***.***.1.181
4000服务各实例均未在配置文件中设置为临时实例
问题:
4000服务多个实例的健康检查模式不一致
通过抓包得到的信息:
抓包过程见:记一次Centos7 tcpdump抓包实例
123上4000服务实例为服务端健康检查
105和181上4000服务实例为客户端健康检查
推测
与nacos部署在同一台服务器的客户端微服务实例,
健康检查模式为服务端检查,非同一服务器为客户端健康检查。
可能是因为在有些情况下,nacos无法访问到客户端微服务,
所以不在同一服务器部署的客户端实例通过心跳上报健康状态。
例如:
nacos部署在阿里云公网服务器,某客户端实例部署在公司内网服务器,
这种情况nacos是访问不到微服务实例的,所以只能采用客户端健康检查。
当然,这样的话该实例只能给内网中的其它实例提供服务。
如果推测有不正确的地方,欢迎指正。
参考文章:
Nacos:Nacos文档
朱鹏飞:Nacos注册中心的设计原理详解
weixin_42073629:Nacos —— 如何做健康检查
陈清河:nacos中临时实例和持久化实例有什么区别?
策码狂奔:Nacos CP/AP模式切换及微服务临时/永久实例配置