type
status
date
slug
summary
tags
category
icon
password
AI summary
Last edited time
Feb 21, 2024 01:25 AM
运维同事反馈, 线上某个 spring boot 应用服务挂了, 让我看看.

但是, 这个 188 节点机器上的我们之前就已经下线了, 怎么会告警?
排查链路, 我们的 prometheus 监控数据来源是从 nacos 自动获取的, 搜索一下 nacos 的服务注册信息, 确实还有这个节点的注册信息

尝试手动清理实例信息
结果发现服务实例还在, openapi 虽然返回 {"code":0,"message":"success","data":"ok"}, 但是实例注册信息还在
用 arthas 看看调用情况吧
查看调用链路

查看源码 com.alibaba.nacos.naming.core.InstanceOperatorClientImpl#removeInstance
可以判断命中了 if (!clientManager.contains(clientId)) 分支, 并没有执行下面的真实删除逻辑
查看一下这个 clientManager
ClientManager 负责管理所有接入客户端(包含服务端提供端/客户订阅端)的连接信息维护工作

查看源码com.alibaba.nacos.naming.core.v2.client.manager.ClientManagerDelegate
感觉通过 openapi 的方式注销实例的情况, 可能走不通了, 看一下com.alibaba.nacos.naming.core.v2.client.Client#removeServiceInstance方法还有哪些地方使用吧


com.alibaba.nacos.naming.healthcheck.heartbeat.ExpiredInstanceChecker 源码
ExpiredInstanceChecker
← InstanceBeatCheckTask
← ClientBeatCheckTaskV2
← ClientBeatCheckTaskV2
问题的解决
最后, 发现根本原因是, 运维的流水线构建时, 没有考虑到 docker 镜像制作的工作空间问题, 并发了, 导致了两个原本应该使用不同 jar 包的 docker 镜像, 实际上制作出来的是同一个服务镜像, 恰好这个错误的镜像在 188 机器上运行