[alibaba/nacos]Nacos2.0支持关闭保护阈值吗?

2023-12-12 546 views
2

Describe the bug 当我使用nacos2.0.0以上版本时,默认保护阈值为0,注册的服务为非持久化实例时,当健康检查不通过,健康实例为0,则会自动触发阈值保护,且非持久化实例不会被删除,则其他服务会一直访问到此不健康服务。 若在页面设置保护阈值小于0,比如-1,我查看源码发现,会在代码内部做判断,当阈值小于0时,改为0. 2 0 0 具体代码详见com.alibaba.nacos.naming.utils.ServiceUtil#selectInstancesWithHealthyProtection

而当我使用nacos1.4.6及已下时,页面上更改阈值小于0,不会在代码重新赋值,从而不会触发阈值保护。 1 4 2nacos 具体代码详见com.alibaba.nacos.naming.controllers.InstanceController#doSrvIpxt

请问Nacos2.0有什么入口可以关闭阈值保护呢?最好是页面或者配置项。

Expected behavior 有一个地方可以关闭阈值保护。

Actually behavior 目前页面上配置阈值保护的值小于0时,代码部分会判断此值,若小于0,则将阈值保护的值设置为0。

回答

1

什么场景需要关闭阈值保护?如果是设置为0,所有节点都不健康了,上游服务无论是有没有地址都会报错。 如果确认服务已下线,那应该移除掉上游服务对这个服务的依赖和查询。

2

场景:目前只有非临时实例支持server端主动探测服务的健康,我在应用中使用spring boot actuator组件来作应用的健康检查,并暴露/actuator/health端点用于探测。而一旦探测到服务不健康,按照nacos2.0来说一定会出发阈值保护,从而当其他服务向nacos获取此服务时,仍会获取到此不健康服务。而我们想关闭其阈值保护,则其他服务不会获取到此不健康服务,从而在上游就会报找不到服务实例503错误,从而快速失败,而不会继续向下游调用。

8

所以此服务是单点吗? 还是所有节点一起不健康?

9

不是单点,比如服务依赖数据库中间件,那么当数据库不可用时,则我们认为该服务所有实例是不健康的,http健康检查能够帮我们探测出来,但是该服务阈值保护也必然会触发,因为服务健康实例现在为0。因此其他服务还是能够调用此服务,我们认为这是不健康的调用,因为数据库已经无法访问了。

9

目前版本应该不能关闭了,这块需要讨论下是否需要重启关闭阈值保护的机制。