摘要

本文描述了如何解决一个rpc调用发生的问题,旨在提供一种解决思路,而不是一个具体的问题解决方案

问题描述

通过dubbo调用一个API时,间歇性的出现远程主机强迫关闭连接的问题

java.io.IOException: 远程主机强迫关闭了一个现有的连接。
at sun.nio.ch.SocketDispatcher.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
at sun.nio.ch.IOUtil.read(IOUtil.java:192)
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380)
at io.netty.buffer.PooledUnsafeDirectByteBuf.setBytes(PooledUnsafeDirectByteBuf.java:288)
at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1100)
at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:367)
at io.netty.channel.nio.AbstractNioByteChannelNioByteUnsafe.read(AbstractNioByteChannel.java:118)atio.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:610)atio.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:551)atio.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:465)atio.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:437)atio.netty.util.concurrent.SingleThreadEventExecutorNioByteUnsafe.read(AbstractNioByteChannel.java:118) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:610) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:551) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:465) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:437) at io.netty.util.concurrent.SingleThreadEventExecutor5.run(SingleThreadEventExecutor.java:873)
at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144)
at java.lang.Thread.run(Thread.java:745)

问题分析

  • 怀疑1
    一开始怀疑是远程主机连接太多,导致被杀掉,查看了下远程主机是否有过多的连接,发现并没有,看了下线上的问题,发现只有这一个API有问题,排除了这个问题
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
  • 怀疑2
    异常栈中有netty相关的处理,可能是netty的问题,之前在dubbo升级过程中,出现过netty版本不匹配的问题
    用wireshark,抓了一下请求的包,发现调用的API数据已经返回,wireshark已经抓到了返回的数据,但是服务端发送了一个[RST,ACK]关闭了连接,而不是正常的4次挥手关闭连接。客户端是netty,服务端是jetty。所以排查了是netty的问题

  • 怀疑3
    既然不是netty,客户端的问题,那么就是服务端的问题,查看同一时间服务端的日志,发现并没有异常抛出,结合数据已经请求到,但是并没有返回给客户端,这不是web 容器jetty 的问题,而是rpc框架的问题。打开rpc框架的log,再等重现的时候,看日志。
    最后看到在Controller层request method handler抛出了异常。没有找到对应的方法。
    解决了这个问题

总结

  1. 对于一个间歇性出现的问题,一般不是那么好排查,需要小心试探,争取能够复现,如果不能复现,需要结合零碎的知识,确定问题在哪一步出现,然后结合对应的debug日志来排查出问题的根源

  2. 在刚开始的时候,根据抛出的异常[远程主机强迫关闭连接]这个关键词,去网上搜索的时候,发现都是在说客户端的问题导致的,导致一开始都认为是这个API的代码有问题,连包都不去抓,陷入了固有思维中去了,这个是需要去避免的

参考

http://blog.csdn.net/yanxi252515237/article/details/51955675

解决一个远程主机强迫关闭连接的bug相关推荐

  1. 远程主机强迫关闭一个现有连接 安卓开发 完美解决版

    远程主机强迫关闭一个现有连接 安卓开发 问题描述 android Studio控制栏报错:远程主机强迫关闭一个现有的连接.构建项目失败.导致项目无法运行. 问题产生原因   在今后的几天中,这个错误经 ...

  2. “Adb connection Error:远程主机强迫关闭了一个现有的连接。”之我的解决方法。

    2015.8.19记: 最近在真机调试的时候,Eclipse Console界面经常会出现"Adb connection Error:远程主机强迫关闭了一个现有的连接."然后就弹出 ...

  3. 远程计算机强迫关闭一个连接,远程主机强迫关闭了一个现有的连接解决方法

    现在电脑出现的问题是多种多样的,对小编而言,最简单有效的方式是用装机吧一键重装软件重装系统,这些问题可能是系统补丁的漏洞所在,下面我整理了远程主机强迫关闭了一个现有的连接原因的解决方法. 一:在And ...

  4. C#中UDP通信过程中出现:远程主机强迫关闭了一个现有的连接0x80004005】的解决方法

    在UDP通信过程中, 使用try...catch语句接受数据时,总是会出现一个错误: System.Net.Sockets.SocketException (0x80004005): 远程主机强迫关闭 ...

  5. 【转】解决WCF大数据量传输 ,System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接...

    开发中所用的数据需要通过WCF进行数据传输,结果就遇到了WCF大量传输问题 也就是提示System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接 网上解决 ...

  6. python: 使用socket实现局域网不同主机通信。解决ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。

    目录 1 socket的使用 1.1 TCP方法 1.2 UDP方法 2 局域网内连接 2.1 总结 1 socket的使用 1.1 TCP方法 在socket中使用socket.socket建立会话 ...

  7. python使用phantomJS循环for爬取多个页面时,解决内存持续变大而报错“ConnectionResetError: [WinError 10054]远程主机强迫关闭了一个现有的连接”的问题

    python使用phantomJS循环for爬取多个页面时,解决内存持续变大而报错"ConnectionResetError: [WinError 10054]远程主机强迫关闭了一个现有的连 ...

  8. “Adb connection Error:远程主机强迫关闭了一个现有的连接。”的解决方法

    我在用eclipse时,用手机调试软件,Devices里面不显示我的手机, 控制台一直发送 "Adb connection Error:远程主机强迫关闭了一个现有的连接." 先说常 ...

  9. 远程主机强迫关闭一个现有连接-=-解决办法

    远程主机强迫关闭一个现有连接 在Android studio调试过程中经常会遇到这个问题,解决方法总结如下: 最简单粗暴直接有效 adb kill -server adb start -server ...

最新文章

  1. 数据库大型应用解决方案总结(转)
  2. InetAddress类和InetSocketAddress的使用
  3. 肺部ct重建_肺部CT血管分割及三维重建
  4. PAT甲级1069 The Black Hole of Numbers:[C++题解]模拟、6174
  5. 你今天volatile了吗?--慎重使用
  6. pandas plot label_Python+Pandas | 分析比特币与股票市场的关系
  7. python判断质数用for循环_Day3.Python判断与循环语句
  8. Spring中的事务回滚 网上比较不错的文章
  9. java rsa2加密算法_java RSA加密解密
  10. 什么是数字证书?数字证书在哪办理?
  11. hustoj mysql_hustoj 管理员和后台设置
  12. 【零基础】量子纠缠图像问世,简单解读实验原理
  13. 全国哀悼日 网站灰黑色CSS滤镜代码
  14. Offset is outside the bounds of the DataView
  15. POI EXCEL修改图表
  16. Improving description-based person-identification by multi-granularity image-text alignments-2019TIP
  17. springBoot集成kettle,用到json,初始化插件失败【kettle-json-plugin-core-9.3.0.0-428.jar】
  18. 复杂网络中重要节点挖掘方法综述
  19. Spring中的@NumberFormat注解
  20. 微信开放小程序SDK,几款SDK产品对比分析

热门文章

  1. MiniGUI移植过程
  2. 电脑端播放m3u8视频
  3. Oracle 协议设配器错误解决方案
  4. ReactOS:基于Windows的开源操作系统
  5. linux使用dd命令生成指定大小文件
  6. Pomodoro Technique
  7. cesium加载entity图片缩放_教你使用最简单粗暴的js方法实现图片最小边展示
  8. Nitro League 出品 | P2E 系列 101——第三部分
  9. 永磁同步电机转子位置估算专题 —— 基波模型与转子位置角
  10. win2003 iis 设置301转向