作者 | 磊哥

来源 | Java中文社群(ID:javacn666)

转载请联系授权(微信ID:GG_Stone)

前两天遇到了一个问题,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

往期推荐

Spring Cloud Alibaba Nacos 服务注册与发现功能实现!

2022-02-07

Nacos服务注册与发现的2种实现方法!

2022-02-09

Spring Cloud Alibaba Nacos路由策略之保护阈值!

2022-02-14


求点赞、在看、分享三连

芭比扣了!Nacos中服务删除不了,肿么办?相关推荐

  1. Nacos中服务注册中心AP、CP模式实现,AP、CP模式切换

    本文分析Nacos基于Nacos 2.0 Nacos中服务注册中心默认是AP模式,如果设置为CP模式 那么客户端设置 spring.cloud.nacos.discovery.ephemeral=fa ...

  2. Gateway 转发请求至注册中心Nacos中的服务404问题(网关日志提示availabilityFilteringRule.activeConnectionsLimit = 2147483647)

    Gateway 转发请求至注册中心Nacos中的服务404问题 问题描述 一次练手项目中,原本没问题并且测试过的gateway,再次转发链接的时候返回404状态码.gateway和被调用模块的日志信息 ...

  3. SpringCloud(若依微服务版)读取Nacos中的配置以及多个服务共享Nacos配置的使用

    场景 若依微服务版手把手教你本地搭建环境并运行前后端项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/109363303 在上 ...

  4. 组件注册_使用_命名规则_以及Nacos中给每个服务配置访问前缀---SpringCloud Alibaba_若依微服务框架改造---工作笔记004

    使用某个组件,比如我要使用: components文件夹中的Rouyi这个文件夹下的组件的话, import RouYiGit from '@/components/Rouyi/Git' import ...

  5. Spring Boot 构建war 部署到tomcat下无法在Nacos中注册服务

    文章目录 1. 问题 2. 分析 3. 解决方案 1. 问题 使用Nacos作为注册中心的Spring Boot项目,以war包形式部署到服务器上,启动项目发现该服务无法在Nacos中注册. 2. 分 ...

  6. 如何用 Nacos 构建服务网格生态?

    简介:Nacos 在阿里巴巴起源于 2008 年五彩石项目(该项目完成微服务拆分和业务中台建设),成长于十年的阿里双十一峰值考验,这一阶段主要帮助业务解决微服务的扩展性和高可用问题,解决了百万实例扩展 ...

  7. Spring Cloud Alibaba——Nacos实现服务治理

    引言 本博客总结微服务开发中各个微服务调用的实现,并使用 Nacos 完成服务注册和发现. 文章中会涉及到 maven 的使用,以及 spring boot 的一些知识.开发工具采用 IDEA 202 ...

  8. Nacos之服务配置中心

    不管学习什么技术,官网永远是第一选择. 官网: https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html Nacos服务配置比之前服务多了一个 ...

  9. 利用 Python 自动化和 Windows 服务 删除掉移动硬盘的临时文件

    平常将文件夹打包成压缩包或拷贝文件夹到移动硬盘内,临时文件会包含在里面,如果是程序源代码,在 Windows 系统下编译有时候还会受到影响. 本篇文章的目的是在移动硬盘插入到电脑的同时,利用 Pyth ...

最新文章

  1. 从合并排序算法看“分治法”
  2. kubernetes组件
  3. Linux操作系统下DHCP服务器配置方法介绍
  4. 一个计算机爱好者的不完整回忆(二十八)关于计算机书籍
  5. mvn 打包可执行包_用Maven打包发布可执行的jar包
  6. sql server使用杂记
  7. .net 页面框架的层次问题,嵌套问题
  8. 平安证券:维持超图软件“强烈推荐”评级
  9. 基于FPGA实现AD7609接口
  10. mysql 数据库安装命令_数据库mysql安装及最基本命令
  11. Spring Data Jpa的@DynamicInsert注解和@DynamicUpdate注解
  12. WPF学习笔记-如何按ESC关闭窗口
  13. 项目质量管理—七种基本质量工具
  14. (四)Selenium通过谷歌插件实现使用隧道代理
  15. Greenplum 数据库和schema管理
  16. 浏览器主页被篡改为hao123、360和2345解决办法
  17. python 爬取句子迷,多好的一个网站(哭~~)
  18. 【随笔】那些免费友好的遥感影像数据下载网站
  19. 使用Qt绘制二维码 QRcode
  20. 罗克韦尔AB PLC RSLogix5000中定时器指令使用方法介绍

热门文章

  1. c语言怎样用格式化文件存储,如何用格式化的方式读写文件
  2. linux对硬盘进行分区吗,Linux下如何对硬盘进行分区
  3. 洛谷P2016 战略游戏【树形dp】
  4. accept和select的区别
  5. Kali Linux 2019.1 发布,Metasploit 更新到 5.0 版本
  6. Android Jenkins自动化构建之路
  7. svn的使用(Mac)
  8. U811.1接口EAI系列之六--物料上传--VB语言
  9. Oracle 游标范例
  10. VSCode 开发Vue必备插件