共计 2152 个字符,预计需要花费 6 分钟才能阅读完成。
前两天遇到了一个问题,Nacos 中的永恒服务删除不了,折腾了一番,最初还是顺利解决了。以下是起因剖析和解决方案,倡议先珍藏,以备不时之需。
长期实例和长久化实例是 Nacos 1.0.0 中新增了一个个性。长期实例和长久化实例最大的区别是健康检查的形式:长期实例应用客户端被动上报的健康检查模式,而长久化实例应用服务端反向探测的模式。也就是说,如果是长期实例,那么客户端须要被动上报本人的健康状况,而长久化实例须要 Nacos 服务器端反向探测实例的健康状况。
而在这两种实例中,长期实例是能够主动删除非衰弱实例的,并且当所有的长期实例被删除之后,Nacos 中的服务也会被主动删除,这是长期服务的删除流程。但对于长久化实例来说,就没有那么简略了,因而长久化实例即便是非衰弱状态,也不会主动删除实例和服务,这个时候就须要咱们手动删除服务了。
PS:长久化实例也有另一种叫法,叫做永恒实例。
须要留神的是,在 Nacos 2.0 之前,一个服务中的实例既能够是长期实例也能够是长久化实例,但在 Nacos 2.0 时有了⼀些轻微的调整。在 Nacos 2.0 之前,一个服务中的实例既能够是长期实例也能够是永恒实例会给运维人员带来极大的困惑和运维复杂度。
与此同时,从零碎架构来看,⼀个服务同时存在长久化及非长久化实例的场景也是存在⼀定矛盾的。这就导致该能力事实上并未被宽泛应用。为了简化 Nacos 的服务数据模型,升高运维人员的复杂度,晋升 Nacos 的易用性,在 Nacos 2.0 中将是否长久化的数据抽象至服务级别,且不再容许⼀个服务同时存在长久化实例和非长久化实例,也就是 从 Nacos 2.0 之后,长期实例就变成了长期服务,长久化实例就变成了长久化服务,一个服务的整个生命周期只能有一种实例类型。
为什么须要两种服务类型?
以淘宝为例,双十一大促期间,流量会比平时高出很多,此时服务必定须要减少更多实例来应答高并发,而这些实例在双十一之后就无需持续应用了,采纳长期实例比拟适合。而对于服务的一些常备实例,则应用永恒实例更适合。
问题重现
但长久化服务在手动删除时候会报错,如下图所示:
当咱们在 Nacos 控制台点击服务的“删除”按钮时,提醒“caused: Service DEFAULT_GROUP@@XXX is not empty, can’t be delete. Please unregister instance first;”,意思是不能删除,请先登记服务下的实例,于是咱们进入服务实例列表,如下图所示:
服务实例外面没有登记按钮,只有“下线”按钮,难道在服务的“编辑”页面外面?于是咱们又点击编辑按钮,看到如下信息:
服务编辑页面还是没有登记按钮,难道要把实例全副“下线”?于是咱们尝试将所有的实例“下线”如下图所示:
而后再返回服务列表页面,点击“删除”按钮,发现还是原来的提示信息:
这可咋整嘞,一顿操作还是删除不了?
解决方案
咱们晓得除了控制台之外,还能够通过 Nacos SDK 或 OpenAPI 来操作 Nacos,而 OpenAPI 的操作老本是最低的,于是连忙找出 Nacos 官网的 OpenAPI 文档,看一下如何通过 API 登记服务实例。
果然,功夫不负有心人,在官网文档中顺利的找到了登记的 API,如下图所示:
OpenAPI 地址:https://nacos.io/zh-cn/docs/open-api.html
PS:在这里感激好友 @二师兄,提供的思路。
OpenAPI 内容如下:
于是照着 API 文档构建了删除命令:
curl -X DELETE 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=spring-cloud-nacos-producer&groupName=DEFAULT_GROUP&namespaceId=public&ip=10.0.24.8&clusterName=DEFAULT&port=8081&ephemeral=false'
以上命令在 Nacos 服务器执行的后果如下图所示:
服务器返回了后果“OK”,关上 Nacos 服务实例列表看一下实例是否被失常登记:
果然有成果,长久化实例被顺利的登记了,于是应用同样的办法把实例 2 也登记一下,如下图所示:
当我把服务下的所有实例都登记之后,再去 Nacos 控制台发现服务也随之隐没了,如下图所示:
仔细一点的敌人会发现,之前的服务并不会立马隐没了,而是变成空服务了,要手动切换一下“暗藏空服务”能力展现进去,但有它和没它的成果是一样的了,咱们能够创立和它名字雷同的长期实例了,这就和删除的成果一样了,如果没有被删除是创立不了长期实例的,所以从逻辑上了解,咱们能够认为它曾经被删除了。
总结
Nacos 中有两种实例:长期实例和长久化实例(永恒实例),在 Nacos 2.0 之后,每个服务中只能保留一种类型的实例,也就是实例类型曾经升级成了服务类型了。对于长期服务来说,无需删除,当长期服务中的所有实例都被删除之后,长期服务也会被主动删除;而永恒服务须要先通过 OpenAPI 登记所有的实例,当所有实例被登记之后,服务也被删除了。
是非审之于己,毁誉听之于人,得失安之于数。
公众号:Java 中文社群
Java 面试合集:https://gitee.com/mydb/interview