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

e19f6271753150d8ed791a4feb255b26.png

作者 | 磊哥

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

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

前两天遇到了一个问题,Nacos 中的永久服务删除不了,折腾了一番,最后还是顺利解决了。以下是原因分析和解决方案,建议先收藏,以备不时之需。

临时实例和持久化实例是 Nacos 1.0.0 中新增了一个特性。临时实例和持久化实例最大的区别是健康检查的方式:临时实例使用客户端主动上报的健康检查模式,而持久化实例使用服务端反向探测的模式。也就是说,如果是临时实例,那么客户端需要主动上报自己的健康状况,而持久化实例需要 Nacos 服务器端反向探测实例的健康状况。

而在这两种实例中,临时实例是可以自动删除非健康实例的,并且当所有的临时实例被删除之后,Nacos 中的服务也会被自动删除,这是临时服务的删除流程。但对于持久化实例来说,就没有那么简单了,因此持久化实例即使是非健康状态,也不会自动删除实例和服务,这个时候就需要我们手动删除服务了。

PS:持久化实例也有另一种叫法,叫做永久实例。

421e86b3774ab06397391bcb9170029c.png需要注意的是,在 Nacos 2.0 之前,一个服务中的实例既可以是临时实例也可以是持久化实例,但在 Nacos 2.0 时有了⼀些细微的调整。在 Nacos 2.0 之前,一个服务中的实例既可以是临时实例也可以是永久实例会给运维人员带来极大的困惑和运维复杂度。

与此同时,从系统架构来看,⼀个服务同时存在持久化及非持久化实例的场景也是存在⼀定矛盾的。这就导致该能力事实上并未被广泛使用。为了简化 Nacos 的服务数据模型,降低运维人员的复杂度,提升 Nacos 的易用性,在 Nacos 2.0 中将是否持久化的数据抽象至服务级别,且不再允许⼀个服务同时存在持久化实例和非持久化实例,也就是从 Nacos 2.0 之后,临时实例就变成了临时服务,持久化实例就变成了持久化服务,一个服务的整个生命周期只能有一种实例类型。

为什么需要两种服务类型?

以淘宝为例,双十一大促期间,流量会比平常高出很多,此时服务肯定需要增加更多实例来应对高并发,而这些实例在双十一之后就无需继续使用了,采用临时实例比较合适。而对于服务的一些常备实例,则使用永久实例更合适。

问题重现

但持久化服务在手动删除时候会报错,如下图所示:e5869c0109db5f58b0234f7ff4b40b8d.gif当我们在 Nacos 控制台点击服务的“删除”按钮时,提示“caused: Service DEFAULT_GROUP@@XXX is not empty, can't be delete. Please unregister instance first;”,意思是不能删除,请先注销服务下的实例,于是我们进入服务实例列表,如下图所示:e93a222e510248f9705c257ec8d5bbdd.png服务实例里面没有注销按钮,只有“下线”按钮,难道在服务的“编辑”页面里面?于是我们又点击编辑按钮,看到如下信息:63683cdcdaa128cf5546b6a206b37849.png服务编辑页面还是没有注销按钮,难道要把实例全部“下线”?于是我们尝试将所有的实例“下线”如下图所示:ac88b69f8e43602d2b0ae5e698f07379.png然后再返回服务列表页面,点击“删除”按钮,发现还是原来的提示信息:839ccf84239e61d3cea055c6384025e8.png这可咋整嘞,一顿操作还是删除不了?

解决方案

我们知道除了控制台之外,还可以通过 Nacos SDK 或 OpenAPI 来操作 Nacos,而 OpenAPI 的操作成本是最低的,于是赶紧找出 Nacos 官方的 OpenAPI 文档,看一下如何通过 API 注销服务实例。果然,功夫不负有心人,在官方文档中顺利的找到了注销的 API,如下图所示:

b09667600d7a66029eed5ed35d2be304.pngOpenAPI 地址:https://nacos.io/zh-cn/docs/open-api.html

PS:在这里感谢好友@二师兄,提供的思路。

OpenAPI 内容如下:e5c5f949a1983daaf4c2e36f5a3dc32c.png于是照着 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 服务器执行的结果如下图所示:063f536317549a4688350137a3200b09.png服务器返回了结果“OK”,打开 Nacos 服务实例列表看一下实例是否被正常注销:3a19ee35631c5158d9d78700fc0628d1.png果然有效果,持久化实例被顺利的注销了,于是使用同样的方法把实例 2 也注销一下,如下图所示:a73e232252435b3f9371fa3d759848b2.png当我把服务下的所有实例都注销之后,再去 Nacos 控制台发现服务也随之消失了,如下图所示:fc1cbd94c055edc37a24b28ae7246d5e.png细心一点的朋友会发现,之前的服务并不会立马消失了,而是变成空服务了,要手动切换一下“隐藏空服务”才能展示出来,但有它和没它的效果是一样的了,我们可以创建和它名字相同的临时实例了,这就和删除的效果一样了,如果没有被删除是创建不了临时实例的,所以从逻辑上理解,我们可以认为它已经被删除了。

总结

Nacos 中有两种实例:临时实例和持久化实例(永久实例),在 Nacos 2.0 之后,每个服务中只能保存一种类型的实例,也就是实例类型已经升级成了服务类型了。

对于临时服务来说,无需删除,当临时服务中的所有实例都被删除之后,临时服务也会被自动删除;而永久服务需要先通过 OpenAPI 注销所有的实例,当所有实例被注销之后,服务也被删除了。

是非审之于己,毁誉听之于人,得失安之于数。

公众号:Java中文社群

Java面试合集:https://gitee.com/mydb/interview

5224ea6d50d45460ee783ac5acc2c361.gif

往期推荐

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

2022-02-07

2d492ac8732e242f19354a5553dc6418.png

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

2022-02-09

c47c507d71018f7d5944979a9ef26007.png

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

2022-02-14

b310ccdb21218463bc070e19ea0add52.png

求点赞、在看、分享三连c1615ee44d1eb1743241a3eea655df76.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544295.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

scala 空列表_如何在Scala中展平列表列表?

scala 空列表Flattening of List is converting a list of multiple List into a single List. To flatten List of List in Scala we will use the flatten method. 扁平化列表是将多个列表的列表转换为单个列表。 为了在Scala中扁平化List列表,我们将使用flatten方…

Spring Cloud OpenFeign夺命连环9问,这谁受得了?

1、前言前面介绍了Spring Cloud 中的灵魂摆渡者Nacos,和它的前辈们相比不仅仅功能强大,而且部署非常简单。今天介绍一款服务调用的组件:OpenFeign,同样是一款超越先辈(Ribbon、Feign)的狠角色。文章目录如下…

Automation Test in Maya Plugin Development

现状和问题- 开发插件的功能A的时候随手建立场景, 测试插件的功能A. 测试通过后,测试场景就被丢掉.- 发现插件的功能A有bug时, 修改代码, 然后随手建立场景, 测试bug. 测试通过后,测试场景就被丢掉.- 添加功能B, 测试功能B通过后, 在使用的时候发现之前的功能A却产生了bug, 应该…

scala集合中添加元素_如何在Scala中将元素添加到列表中?

scala集合中添加元素In Scala, lists are immutable data structures in which adding new elements is not allowed. So, here we will solve this problem that is generally done in functional programming paradigms. 在Scala中,列表是不可变的数据结构&#…

玩转Nacos参数配置!多图勿点

作者 | 磊哥来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)Nacos 中的参数有很多,如:命名空间、分组名、服务名、保护阈值、服务路由类型、临时实例等&#xff…

软件工程 质量问题_软件质量| 软件工程

软件工程 质量问题软件质量 (Software Quality) Software Quality is the degree of agreement too direct or indirect requirements and assumptions. Software quality is determined as a field of study and practice that describes the sensible traits of software pro…

为什么wait/notify必须要和synchronized一起使用?

作者 | 磊哥来源 | Java面试真题解析(ID:aimianshi666)转载请联系授权(微信ID:GG_Stone)在多线程编程中,wait 方法是让当前线程进入休眠状态,直到另一个线程调用了 notify 或 notify…

Magento Add Fee or Discount to Order Totals

2019独角兽企业重金招聘Python工程师标准>>> In this tutorial, we will see how to add new line item to magento order totals. What this means is that, how to add an additional Fee or Discount, or any kind of charge to order total of the magento chec…

再见 Feign!推荐一款微服务间调用神器,跟 SpringCloud 绝配!

在微服务项目中,如果我们想实现服务间调用,一般会选择Feign。之前介绍过一款HTTP客户端工具Retrofit,配合SpringBoot非常好用!其实Retrofit不仅支持普通的HTTP调用,还能支持微服务间的调用,负载均衡和熔断限…

ruby array_Ruby中带有示例的Array.delete_if方法

ruby arrayRuby Array.delete_if方法 (Ruby Array.delete_if Method) In the last articles, we have studied the Array methods namely Array.select, Array.reject and Array.drop_While, all these methods are non–destructive methods which means that they do not imp…

UIViewController生命周期的理解

if (self [super init])》if (self [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) 》- (void)viewDidLoad{ [super viewDidLoad]; NSLog("---111111");} 》if (self [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { …

Spring Cloud Alibaba Nacos 的 2 种健康检查机制!

作者 | 磊哥来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)Spring Cloud Alibaba Nacos 作为注册中心不止提供了服务注册和服务发现功能,它还提供了服务可用性监测的机制。…

在Python中使用一个元素创建一个元组

Its not simple to create a tuple with one element, if we try to create a tuple with parenthesis or without parenthesis, tuple will not be created. 创建具有一个元素的元组并不简单,如果我们尝试创建带有括号或不带括号的元组,则不会创建元组。…

Python之包管理工具

在Python环境中已经有很多成熟的包,可以通过安装这些包来扩展我们的程序。 例如,很多时候Python开发人员都会去PyPI网站去查找自己想要使用的包,然后进行安装。PyPI ( Python Package Index)是获得第三方 Python 软件包…

为什么wait和notify必须放在synchronized中?

作者 | 磊哥来源 | Java面试真题解析(ID:aimianshi666)转载请联系授权(微信ID:GG_Stone)在多线程编程中,wait 方法是让当前线程进入休眠状态,直到另一个线程调用了 notify 或 notify…

java字符串转字符串列表_Java中的字符串列表示例

java字符串转字符串列表We have to read total number string i.e. "n", create a list of the Strings and input "n" strings, add then to print the all stings of the list in Java. 我们必须读取总数字符串,即“ n”,创建字符…

聊聊并发编程的10个坑

前言对于从事后端开发的同学来说,并发编程肯定再熟悉不过了。说实话,在java中并发编程是一大难点,至少我是这么认为的。不光理解起来比较费劲,使用起来更容易踩坑。不信,让继续往下面看。今天重点跟大家一起聊聊并发编…

macbook终端使用记(二)终端快捷键

为什么80%的码农都做不了架构师?>>> Command K清屏 Command T新建标签 Command M最小化窗口 Command W 关闭当前标签页 Command S 保存终端输出 Command D 垂直分隔当前标签页 Command Shift D 水平分隔当前标签页 Command shift {或}向左/向…

uint32_t 是常数吗_UINT_MAX常数,带C ++示例

uint32_t 是常数吗C UINT_MAX宏常量 (C UINT_MAX macro constant) UINT_MAX constant is a macro constant which is defied in climits header, it is used to get the minimum value of an unsigned int object, it returns the minimum value that an unsigned int object …

颜值爆表!Redis 官方可视化工具来啦,功能真心强大!

最近逛了一下Redis官方网站,发现Redis不仅推出了很多新特性,而且还发布了一款可视化工具RedisInsight。试用了一下感觉非常不错,最关键的是能支持RedisJSON之类的新特性,这是第三方工具无法比拟的。今天带大家体验一下RedisInsigh…