【Nacos】健康检查机制(附实操案例)

发布于:2025-02-10 ⋅ 阅读:(46) ⋅ 点赞:(0)


在这里插入图片描述

Nacos的两种健康检查机制

Nacos作为一个服务注册中心,需要感知服务的状态,才能为服务调用方提供良好的服务,而它自身提供了两种健康检查机制:

  1. 客户端主动上报机制
  • 客户端通过心跳上报方式告知nacos注册中心健康状态,默认心跳间隔5秒;
  • nacos会在超过15秒未收到心跳后将实例设置为不健康状态,超过30秒将实例删除服务器端
  1. 反向探测机制:
  • nacos主动探知客户端健康状态,默认间隔为20秒
  • 健康检查失败后实例会被标记为不健康,不会被立即删除
    在这里插入图片描述

比如领导管理员工的工作

  1. 员工主动汇报:员工每天主动汇报自己工作进度
  2. 领导主动问询: 领导每周向员工了解工作进度

Nacos 中的健康检查机制不能主动设置,健康检查机制是和 Nacos 的服务实例类型强相关的


服务实例类型

Nacos的服务实例(注册的节点)分为临时实例和非临时实例:

  • 临时实例:如果实例岩机超过一定时间,会从服务列表剔除,默认类型
  • 非临时实例:如果实例岩机,不会从服务列表剔除,也可以叫永久实例

Nacos对临时实例,采取的是客户端主动上报机制,对非临时实例,采取服务器端反向探测机制
在这里插入图片描述

此处类似于正式工和临时工:
正式工由于有合同在身,领导每隔一段时间都会过来检查工作进度.
而临时工一般干完活就走了,也无关紧要了.

我们默认创建的实例一般都是临时实例,但也可以通过更改配置文件来将其设置为一个永久实例

spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false #false表示非临时实例

注意事项

在更改实例类型之后重启服务,此时我们可能会发现实例类型出现报错的情况,查看报错信息:

Caused by: com.alibaba.nacos.api.exception.NacosException: failed to req API:/nacos/v1/ns/instance after all servers([http://120.26.87.94:10020]) tried: caused: errCode: 400, errMsg: Current service DEFAULT_GROUP@@product-service is ephemeral service, can't register persistent instance. ;
	at com.alibaba.nacos.client.naming.remote.http.NamingHttpClientProxy.reqApi(NamingHttpClientProxy.java:410) ~[nacos-client-2.2.1.jar:na]
	at com.alibaba.nacos.client.naming.remote.http.NamingHttpClientProxy.reqApi(NamingHttpClientProxy.java:351) ~[nacos-client-2.2.1.jar:na]
	at com.alibaba.nacos.client.naming.remote.http.NamingHttpClientProxy.reqApi(NamingHttpClientProxy.java:346) ~[nacos-client-2.2.1.jar:na]
	at com.alibaba.nacos.client.naming.remote.http.NamingHttpClientProxy.registerService(NamingHttpClientProxy.java:153) ~[nacos-client-2.2.1.jar:na]
	at com.alibaba.nacos.client.naming.remote.NamingClientProxyDelegate.registerService(NamingClientProxyDelegate.java:98) ~[nacos-client-2.2.1.jar:na]
	at com.alibaba.nacos.client.naming.NacosNamingService.registerInstance(NacosNamingService.java:143) ~[nacos-client-2.2.1.jar:na]
	at com.alibaba.cloud.nacos.registry.NacosServiceRegistry.register(NacosServiceRegistry.java:75) ~[spring-cloud-starter-alibaba-nacos-discovery-2022.0.0.0-RC2.jar:2022.0.0.0-RC2]
	... 25 common frames omitted

原因其实很简单:
原因:Nacos会记录每个服务实例的IP和端口号,当发现IP和端口都没有发生变化时,Nacos不允许一个服务实例类型发生变化,比如从临时实例,变为非临时实例,或者从非临时实例,变成临时实例,
解决办法:

  1. 停掉nacos
  2. 删除nacos 目录下 /data/protocol/raft 信息,里面会保存应用实例的元数据信息
  3. 重启nacos,此时刚才的配置就生效了
    在这里插入图片描述

上述为在Linux服务器上的操作,而在windws上同理,只不过更简单了

实操演示

经过上述操作再重新启动服务,就会发现我们更改的配置已经生效了
在这里插入图片描述
在这里插入图片描述

此时,再关掉我们这几个服务,过一会观察情况
在这里插入图片描述

刷新一下naco网页,就会发现只剩我们刚才设置的永久实例还存在,而其他实例由于都是临时实例被nacos给删掉了

在这里插入图片描述
点进去"详情"查看,发现健康状态为false,但它并没有被nacos删除

在这里插入图片描述


在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到