从一次深夜告警说起:我是如何用Arthas和Dubbo Admin定位RpcException根因的

张开发
2026/4/20 7:55:51 15 分钟阅读

分享文章

从一次深夜告警说起:我是如何用Arthas和Dubbo Admin定位RpcException根因的
从一次深夜告警说起我是如何用Arthas和Dubbo Admin定位RpcException根因的凌晨2点15分手机突然震动起来——监控系统发出的告警通知。睡眼惺忪地打开电脑发现是核心业务系统的Dubbo服务调用失败告警。告警信息显示RpcException: Failed to invoke the method getUserInfo in the service com.api.service.user.UserService。作为系统负责人我必须快速定位问题根源并恢复服务。本文将详细记录我如何结合Arthas和Dubbo Admin这两款利器一步步排查并解决这个典型的RPC调用异常。1. 初步排查从告警信息入手首先需要理解告警信息的含义。这条RpcException表明消费者端无法成功调用服务提供者的getUserInfo方法。错误信息中几个关键点值得关注服务接口com.api.service.user.UserService方法名getUserInfo注册中心地址localhost:9090Dubbo版本2.7.3常见的RPC调用失败原因包括服务提供者未注册到注册中心接口方法签名不匹配网络连接问题服务提供者负载过高序列化/反序列化异常提示遇到RpcException时首先记录完整的错误堆栈其中往往包含有价值的诊断线索。2. 使用Dubbo Admin进行服务状态检查Dubbo Admin是官方提供的管理控制台能直观展示服务注册和订阅情况。登录后我首先检查了服务提供者的状态。2.1 验证服务提供者注册状态在Dubbo Admin的服务查询页面输入com.api.service.user.UserService进行搜索。发现该服务确实没有可用的提供者实例。这解释了为什么消费者会抛出No provider available异常。接着检查注册中心连接状态# 检查注册中心连接 telnet localhost 9090连接正常说明不是注册中心本身的问题。那么可能是服务提供者进程崩溃服务提供者网络隔离服务提供者配置错误导致注册失败2.2 检查消费者订阅配置在Dubbo Admin的消费者页面找到了调用方的应用实例。发现其订阅的服务列表确实缺少cloud-user这个关键服务组。这与原始配置吻合dubbo: scan: base-packages: com.basic.domain protocol: name: dubbo port: 20882 registry: address: spring-cloud://localhost cloud: subscribed-services: cloud-user # 这里缺少必要的服务组 consumer: check: false修正后的配置应该包含所有依赖的服务组cloud: subscribed-services: cloud-user,cloud-order,cloud-payment3. 使用Arthas进行深度诊断虽然Dubbo Admin已经帮我们发现了订阅配置问题但为了全面排查我决定使用Arthas进行更深入的运行时诊断。3.1 检查服务接口方法签名首先需要确认消费者和服务提供者的接口定义是否一致。通过Arthas的jad命令反编译查看# 连接到消费者JVM进程 $ ./arthas.sh -pid consumer_pid # 反编译查看接口定义 [arthas1]$ jad com.api.service.user.UserService # 查看具体方法签名 [arthas1]$ jad com.api.service.user.UserService getUserInfo对比服务提供者的接口定义发现两者完全一致排除了方法签名不匹配的可能性。3.2 监控网络连接状态接下来检查消费者到服务提供者的网络连接情况# 查看活跃的网络连接 [arthas1]$ netstat -tlnp # 使用telnet测试提供者端口连通性 [arthas1]$ telnet provider_host 20880发现网络连接正常排除了网络隔离的可能性。3.3 检查类加载情况有时类加载器问题也会导致RPC调用失败。使用Arthas检查# 查看类加载器层次结构 [arthas1]$ classloader -t # 检查接口类是否被正确加载 [arthas1]$ sc -d com.api.service.user.UserService确认接口类被正确加载且没有出现多个版本冲突的情况。4. 综合分析与问题解决结合Dubbo Admin和Arthas的诊断结果可以确定问题的根本原因是消费者配置中缺少对cloud-user服务组的订阅声明服务提供者虽然运行正常但由于订阅关系不完整消费者无法发现它解决方案包括两个步骤4.1 修正消费者配置更新消费者的Dubbo配置确保包含所有必要的服务组订阅dubbo: cloud: subscribed-services: cloud-user,cloud-order,cloud-payment4.2 验证服务恢复配置更新后重启消费者应用然后在Dubbo Admin中验证确认com.api.service.user.UserService现在有可用的提供者检查消费者订阅列表包含cloud-user服务组通过Arthas监控RPC调用情况# 监控特定方法的调用情况 [arthas1]$ monitor -c 5 com.api.service.user.UserService getUserInfo看到方法被正常调用且没有抛出异常问题得到解决。5. 预防措施与最佳实践为了避免类似问题再次发生我总结了以下几点经验配置检查清单服务提供者的注册中心配置消费者的订阅服务列表接口版本一致性超时和重试策略监控告警优化增加服务可用性监控设置订阅关系变更告警监控RPC调用成功率诊断工具常备保持Arthas等诊断工具随时可用定期演练故障诊断流程建立常见问题的诊断手册在实际运维中遇到Dubbo RPC问题时按照先看状态再查网络最后验证接口的顺序排查往往能快速定位问题根源。那次深夜告警事件后我将这套诊断流程整理成了团队的标准操作规范后续类似问题的平均解决时间缩短了70%。

更多文章