主要环境与用到的(关键)组件:

Springboot2.3.2
其中,dubbo-spring-boot-starter版本为2.7.8
zookeeper3.5.9

首先是服务报错:

No provider available from registry ... for ... on consumer ... use dubbo version 2.7.8, please check status of providers(disabled, not registered or in blacklist).

很多使用过dubbo的同学对这个报错信息应该都不陌生,一般情况下,如果没有配置好生产端、消费端或者注册中心,启动的时候就会报这个错。但这里的情况是,消费端和生产端都已经正常运行了一段时间了,大概10天左右,突然报这个错。

这里借助网上总结的一张图,来梳理一下排查No Provider的情况:

首先就来看看zookeeper下,生产端的provider情况,找到zookeeper的安装bin目录下:

sh zkCli.sh
ls /dubbo/xxx/provider

查看生产端的信息,结果发现[],这时的生产端程序还是running状态(ps -ef进程存在),大概率就是这个生产端出了问题。由于日志有滚动删除,而且出问题的时间点也不确定,所以这个问题感觉没办法在服务本身的日志中查看。于是想到查看zookeeper下的事务日志:

cd lib/
java -cp .:zookeeper-3.5.9.jar:slf4j-api-1.7.25.jar:zookeeper-jute-3.5.9.jar org.apache.zookeeper.server.LogFormatter /tmp/zookeeper/version-2/log.7d1 > /tmp/zookeeper/version-2/log.log

但也看不出什么端倪。这里不太确定是服务本身的问题,还是服务于zookeeper之间链接的问题。

于是在消费服务中设置了一个定时任务,每秒钟去调用生产端的一个接口,并在生产和消费端都打印日志,同时加个监控,这样在除了问题之后,就能第一时间找到具体的错误信息。
重启服务8天后,重现了这个错误,这一次直接看到了错误日志。

首先,消费端爆出了

2022-02-18 16:23:27.713  WARN 2386027 --- [scheduling-1] o.a.d.r.c.s.FailoverClusterInvoker       :  [DUBBO] Although retry the method heart in the service com.jf.zk.proxy.facade.BindFacade was successful by the provider 192.168.1.13:20010, but there have been failed providers [192.168.1.13:20010] (1/1) from the registry 192.168.1.13:2181 on the consumer 192.168.1.13 using the dubbo version 2.7.8. Last error is: Invoke remote method timeout. method: heart, provider: dubbo://192.168.1.13:20010/com.jf.zk.proxy.facade.BindFacade?anyhost=true&application=proxy-web&check=false&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&group=hcontrol-test&init=false&interface=com.jf.zk.proxy.facade.BindFacade&metadata-type=remote&methods=appUserBind,unbind,heart,ideUserBind&pid=2386027&qos.enable=false&register.ip=192.168.1.13&release=2.7.8&remote.application=proxy-service&revision=1.3.1&side=consumer&sticky=false&timeout=30000&timestamp=1644487367193&version=1.0, cause: org.apache.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer. start time: 2022-02-18 16:22:39.000, end time: 2022-02-18 16:23:09.020, client elapsed: 0 ms, server elapsed: 30020 ms, timeout: 30000 ms, request: Request [id=707282, version=2.0.2, twoway=true, event=false, broken=false, data=null], channel: /192.168.1.13:54056 -> /192.168.1.13:20010, dubbo version: 2.7.8, current host: 192.168.1.13
org.apache.dubbo.rpc.RpcException: Invoke remote method timeout. method: heart, provider: dubbo://192.168.1.13:20010/com.jf.zk.proxy.facade.BindFacade?anyhost=true&application=proxy-web&check=false&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&group=hcontrol-test&init=false&interface=com.jf.zk.proxy.facade.BindFacade&metadata-type=remote&methods=appUserBind,unbind,heart,ideUserBind&pid=2386027&qos.enable=false&register.ip=192.168.1.13&release=2.7.8&remote.application=proxy-service&revision=1.3.1&side=consumer&sticky=false&timeout=30000&timestamp=1644487367193&version=1.0, cause: org.apache.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer. start time: 2022-02-18 16:22:39.000, end time: 2022-02-18 16:23:09.020, client elapsed: 0 ms, server elapsed: 30020 ms, timeout: 30000 ms, request: Request [id=707282, version=2.0.2, twoway=true, event=false, broken=false, data=null], channel: /192.168.1.13:54056 -> /192.168.1.13:20010
......
Caused by: java.util.concurrent.ExecutionException: org.apache.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer. start time: 2022-02-18 16:22:39.000, end time: 2022-02-18 16:23:09.020, client elapsed: 0 ms, server elapsed: 30020 ms, timeout: 30000 ms, request: Request [id=707282, version=2.0.2, twoway=true, event=false, broken=false, data=null], channel: /192.168.1.13:54056 -> /192.168.1.13:20010
......
2022-02-18 16:23:28.009 ERROR 2386027 --- [scheduling-1] o.s.s.s.TaskUtils$LoggingErrorHandler : Unexpected error occurred in scheduled task
org.apache.dubbo.rpc.RpcException: No provider available from registry ...

这里看到是一些请求超过了consumer端的timeout,后续就是No provider,猜想应该是生产端出现了什么问题,响应越来越慢,到后来服务长时间不可用,直至与其它服务断开了链接。这里就要看看生产端到底发生了什么,关键日志如下:

2022-02-18 16:23:47.942  INFO 2385338 --- [main-SendThread(192.168.1.13:2181)] org.apache.zookeeper.ClientCnxn          : Unable to read additional data from server sessionid 0x100000040fc01ae, likely server has closed socket, closing socket connection and attempting reconnect
2022-02-18 16:23:32.144 WARN 2385338 --- [NettyServerWorker-6-2] o.a.d.remoting.transport.AbstractServer : [DUBBO] All clients has disconnected from /192.168.1.13:20010. You can graceful shutdown now., dubbo version: 2.7.8, current host: 192.168.1.13
2022-02-18 16:27:15.830 WARN 2385338 --- [DubboClientHandler-192.168.1.13:20004-thread-2] o.a.d.r.exchange.support.DefaultFuture : [DUBBO] The timeout response finally returned at 2022-02-18 16:27:13.882, response status is 31, channel: /192.168.1.13:35954 -> /192.168.1.13:20004, please check provider side for detailed result., dubbo version: 2.7.8, current host: 192.168.1.13
2022-02-18 16:27:38.590 WARN 2385338 --- [DubboClientHandler-192.168.1.13:20004-thread-3] o.a.d.r.exchange.support.DefaultFuture : [DUBBO] The timeout response finally returned at 2022-02-18 16:26:53.015, response status is 31, channel: /192.168.1.13:35954 -> /192.168.1.13:20004, please check provider side for detailed result., dubbo version: 2.7.8, current host: 192.168.1.13
......
2022-02-18 16:23:47.117 INFO 2385338 --- [main-SendThread(192.168.1.13:2181)] org.apache.zookeeper.ClientCnxn : Unable to read additional data from server sessionid 0x100000040fc01ad, likely server has closed socket, closing socket connection and attempting reconnect
2022-02-18 16:35:32.357 INFO 2385338 --- [NettyClientWorker-1-2] o.a.d.r.t.netty4.NettyClientHandler : [DUBBO] The connection of /192.168.1.13:44900 -> /192.168.1.13:8003 is disconnected., dubbo version: 2.7.8, current host: 192.168.1.13
2022-02-18 16:36:13.950 WARN 2385338 --- [dubbo-client-idleCheck-thread-1] o.a.d.r.e.s.header.ReconnectTimerTask : [DUBBO] Reconnect to channel HeaderExchangeClient [channel=org.apache.dubbo.remoting.transport.netty4.NettyClient [/192.168.1.13:35954 -> /192.168.1.13:20004]], because heartbeat read idle time out: 180000ms, dubbo version: 2.7.8, current host: 192.168.1.13
......
2022-02-18 18:46:33.184 WARN 2385338 --- [nioEventLoopGroup-10-3] i.n.c.AbstractChannelHandlerContext : An exception 'java.lang.OutOfMemoryError: Java heap space' [enable DEBUG level for full stacktrace] was thrown by a user handler's exceptionCaught() method while handling the following exception:
java.lang.OutOfMemoryError: Java heap space

这个服务虽然出现了很多与另一个服务的链接问题,但后续出现了java.lang.OutOfMemoryError: Java heap space,大概率是由于这个内存问题导致的。

由于服务还是running(ps -ef进程存在),我们可以直接把它的内存dump出来。

jmap -dump:file=javaDump.hprof,format=b {该服务的pid}
而后使用jvisualvm.exe(jdk自带工具,其实JDK自带了很多有用的工具,有必要了解一下)将这个hprof文件打开,可以查看很多信息:

查看到了一个我们代码里定义的SessionModel对象异常地多,最终发现是同事代码里每次新建一个业务会话时,都会生成一个SessionModel对象,将其放在ConcurrentHashMap中,但没有clear或者remove的逻辑,导致相关的对象越来越多,最终导致OOM。
猜测这个服务在内存资源消耗到一定程度时,已经无法处理其他的请求,发出去的请求也无法应答,所以与之相关的rpc链接会被断开,最终这个服务从注册中心被清理。

这里还可以看看这个生产端的服务A调用其它服务B的日志:

......
2022-02-18 16:32:07.642 INFO 348283 --- [NettyServerWorker-6-3] o.a.d.r.t.netty4.NettyServerHandler : [DUBBO] IdleStateEvent triggered, close channel NettyChannel [channel=[id: 0x0efa3ba8, L:/192.168.1.13:20004 - R:/192.168.1.13:35954]], dubbo version: 2.7.8, current host: 192.168.1.13
2022-02-18 16:32:07.642 INFO 348283 --- [NettyServerWorker-6-3] o.a.d.r.transport.netty4.NettyChannel : [DUBBO] Close netty channel [id: 0x0efa3ba8, L:/192.168.1.13:20004 - R:/192.168.1.13:35954], dubbo version: 2.7.8, current host: 192.168.1.13
2022-02-18 16:32:07.642 INFO 348283 --- [NettyServerWorker-6-3] o.a.d.r.t.netty4.NettyServerHandler : [DUBBO] The connection of /192.168.1.13:35954 -> /192.168.1.13:20004 is disconnected., dubbo version: 2.7.8, current host: 192.168.1.13

这里找到对应日志的代码:

猜测是服务B由于长时间没有接收到来自上文提到的服务A(此时应该是客户端的角色)的心跳,持续了timeout这么长时间,于是服务B就把链接关闭了,此时对于A来说,应该就是收不到B服务的响应,所以也会在日志前期报访问服务B的timeout。

记一次dubbo服务丢失的问题排查的更多相关文章

  1. 记一次Dubbo服务注册异常

            公司项目重构,把dubbo版本从2.5.8升级为2.6.2.升级后在本地运行一点问题都没有:可是通过公司自研的发布系统将项目发布到测试环境的linux服务器下面后,出现了dubbo服务 ...

  2. 记一次redis key丢失的问题排查

    最近测试环境的redis经常性发生某些key丢失的问题,最终的找到的问题让人大吃一惊. 复盘一下步骤: 1.发现问题 不知道从某天开始,后台经常报错,原因是某些key丢失,一开始不在意,以为是小bug ...

  3. 记一次线上dubbo服务超时和线程池满问题排查

    线上某dubbo服务A调用dubbo服务B的接口X方法,调用端A日志中出现了很多超时的情况,提供端B该接口X超时时间设置为60s: 查看提供端B的日志,报了很多线程池满的异常: Caused by: ...

  4. 钻牛角尖还是走进死胡同--shell脚本根据名称获得 dubbo 服务的 pid

    到了下午,突然觉得坐立不安,可能是因为中午没有休息好.老大不小了还在做页面整合的事情,这是参加工作时就干的工作了.然后突然想去挑战高级一点的缺陷排查,结果一不小心就钻了一个牛角尖.启动 dubbo 服 ...

  5. dubbo服务治理框架

    Dubbo的概述 1.1. Dubbo的背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. ...

  6. Dubbo入门到精通学习笔记(十):dubbo服务集群 、Dubbo分布式服务子系统的划分、Dubbo服务接口的设计原则

    文章目录 dubbo服务集群 Dubbo服务集群部署 Dubbo服务集群容错配置--集群容错模式 1.Failover Cluster 失败自动切换,当出现失败,重试其它服务器.`(缺省) 通常用于读 ...

  7. Java小菜求职记-以前在Dubbo踩的坑,这次全被问到了,这下舒服了

    前传 小林求职记(五)上来就一连串的分布式缓存提问,我有点上头.... 终于,在小林的努力下,获得了王哥公司那边的offer,但是因为薪水没有谈妥,小林又重新进入了求职的旅途,在经历了多次求职过程之后 ...

  8. 《Duubo系列》-Dubbo服务暴露过程

    我今天来就带大家看看 Dubbo 服务暴露过程,这个过程在 Dubbo 中其实是很核心的过程之一,关乎到你的 Provider 如何能被 Consumer 得知并调用. 今天还是会进行源码解析,毕竟我 ...

  9. dubbo服务提供与消费

    一.前言 项目中用到了Dubbo,临时抱大腿,学习了dubbo的简单实用方法.现在就来总结一下dubbo如何提供服务,如何消费服务,并做了一个简单的demo作为参考. 二.Dubbo是什么 Dubbo ...

  10. dubbo服务自动化测试搭建

    java实现dubbo的消费者服务编写:ruby实现消费者服务的接口测试:通过消费者间接测试dubbo服务接口的逻辑 内容包括:dubbo服务本地调用环境搭建,dubbo服务启动,消费者部署,脚本编写 ...

随机推荐

  1. JQuery 页面滚动至指定元素位置

    $(window).scrollTop($("#id").offset().top - 20);

  2. linux篇之WC(word count)的使用概述

    Text. Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出. 1.命令格式: wc [选项] [文件1] [文件2] ... 2.命 ...

  3. 2020-2021第一学期2024"DCDD"小组第十周讨论

    2020-2021第一学期"DCDD"第十周讨论 小组名称:DCDD 小组成员:20202403孟凡斌.20202411陈书桓.20202416刘铭睿.20202420黄椿淇 照例 ...

  4. Centos使用nohup实现后台运行程序

    nohup和&的区别& : 指在后台运行 nohup : 不挂断的运行,注意并没有后台运行的功能,,就是指,用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断 ...

  5. 开发Unity3D空战类插件 战机HUD系统

    Fighter HUD System 当您使用Unity3D来开发飞行模拟或者空战类游戏时,这款Fighter HUD Sytem插件将会非常的适合用来充当您战机的HUD系统. 特点 此HUD系统的安 ...

  6. MySQL Atlas 读写分离软件介绍

    MySQL Atlas介绍 目录 MySQL Atlas介绍 一.MySQL Atlas介绍 1.1.1 MySQL Atlas介绍 1.1.2 Atlas基本管理 一.MySQL Atlas介绍 1 ...

  7. python字符串拼接方式

    一 .join(iterator),后面必须是可迭代对象,例如:字符串,列表,元组 testList = ["1","2"] print(",&quo ...

  8. AirSim 自动驾驶仿真 (2-3) python控制无人机 win10

    1首先搭建好环境 参考 2 python控制 https://blog.csdn.net/Zhaoxi_Li/article/details/108002544 官方代码位置 自己pythonj教程 ...

  9. 关于JUnit

    目录 一.单元测试 二.在LAB中的常用方法 一.单元测试 什么是单元测试呢?单元测试就是针对最小的功能单元编写测试代码.Java程序最小的功能单元是方法,因此,对Java程序进行单元测试就是针对单个 ...

  10. 图像处理|Matlab

    图像处理 | Matlab 参考博文: 图像处理-平滑滤波 图像去噪-加性噪声(高斯/椒盐)