目录
- Nacos的两种健康检查机制
- 服务实例类型
- 注意事项
- 实操演示
Nacos的两种健康检查机制
Nacos作为一个服务注册中心,需要感知服务的状态,才能为服务调用方提供良好的服务,而它自身提供了两种健康检查机制:
- 客户端主动上报机制:
- 客户端通过心跳上报方式告知nacos注册中心健康状态,默认心跳间隔5秒;
- nacos会在超过15秒未收到心跳后将实例设置为不健康状态,超过30秒将实例删除服务器端
- 反向探测机制:
- nacos主动探知客户端健康状态,默认间隔为20秒
- 健康检查失败后实例会被标记为不健康,不会被立即删除
比如领导管理员工的工作
- 员工主动汇报:员工每天主动汇报自己工作进度
- 领导主动问询: 领导每周向员工了解工作进度
Nacos 中的健康检查机制不能主动设置,健康检查机制是和 Nacos 的服务实例类型强相关的
服务实例类型
Nacos的服务实例(注册的节点)分为临时实例和非临时实例:
- 临时实例:如果实例岩机超过一定时间,会从服务列表剔除,默认类型
- 非临时实例:如果实例岩机,不会从服务列表剔除,也可以叫永久实例
Nacos对临时实例,采取的是客户端主动上报机制,对非临时实例,采取服务器端反向探测机制
此处类似于正式工和临时工:
正式工由于有合同在身,领导每隔一段时间都会过来检查工作进度.
而临时工一般干完活就走了,也无关紧要了.
我们默认创建的实例一般都是临时实例,但也可以通过更改配置文件来将其设置为一个永久实例
spring:cloud:nacos:discovery:ephemeral: false #false表示非临时实例
注意事项
在更改实例类型之后重启服务,此时我们可能会发现实例类型出现报错的情况,查看报错信息:
java">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不允许一个服务实例类型发生变化,比如从临时实例,变为非临时实例,或者从非临时实例,变成临时实例,
解决办法:
- 停掉nacos
- 删除nacos 目录下 /data/protocol/raft 信息,里面会保存应用实例的元数据信息
- 重启nacos,此时刚才的配置就生效了
上述为在Linux服务器上的操作,而在windws上同理,只不过更简单了
实操演示
经过上述操作再重新启动服务,就会发现我们更改的配置已经生效了
此时,再关掉我们这几个服务,过一会观察情况
刷新一下naco网页,就会发现只剩我们刚才设置的永久实例还存在,而其他实例由于都是临时实例被nacos给删掉了
点进去"详情"查看,发现健康状态为false,但它并没有被nacos删除