一、问题概述
### 1.1 报错信息
系统运行过程中,消费者服务(support-t1-web)调用Dubbo服务时出现通信异常,具体报错如下:
org.apache.dubbo.remoting.RemotingException:message can not send,because channel is closed.### 1.2 影响范围
- 影响现象:该接口相关的所有调用均失败,导致依赖该接口的业务功能无法正常使用
### 1.3 环境信息
| 项目 | 详情 |
|---|---|
| Dubbo版本 | 2.7.7(release=2.7.7,dubbo=2.0.2) |
| 关键配置 | 心跳时间60000ms、重试次数0、超时时间12000000ms、粘滞连接关闭(sticky=false) |
二、问题核心原因
报错核心关键词:channel is closed,即“消息无法发送,因为TCP连接已关闭”。
本质是消费者与提供者之间的Dubbo长连接被中断,导致请求无法正常传输。结合报错日志及Dubbo运行机制,排查出以下4种常见原因(按概率从高到低排序):
2.1 服务提供者异常(概率90%)
提供者服务未正常运行,具体场景包括:
服务进程被kill、异常宕机或手动停止
服务正在重启,端口(25551)未完成监听初始化
服务部署失败,未成功注册到Dubbo注册中心
2.2 网络连接异常(概率7%)
提供者服务正常,但网络链路被阻断,导致连接无法建立/维持:
提供者机器防火墙、宿主机安全组策略拦截了25551端口
消费者与提供者跨网段通信,网络路由异常
网络波动导致长连接被异常断开,且未触发Dubbo重连机制
2.3 提供者服务假死/过载(概率2%)
提供者服务进程存在,但无法正常处理请求,导致Dubbo连接被主动关闭:
服务线程池满,无法处理新的请求,触发连接超时关闭
服务频繁发生Full GC,导致进程假死,无法响应心跳和请求
接口执行耗时过长,超过Dubbo超时配置,连接被强制关闭
2.4 消费者连接缓存失效(概率1%)【我遇到的情况是属于这种】
Dubbo采用长连接机制,消费者会缓存与提供者的连接,若出现以下情况,缓存连接会变为无效:
提供者重启后,消费者未感知到连接变化,仍使用旧的无效连接
长连接空闲时间过长,超过网络设备(如路由器)的连接超时时间,被自动断开
三、排查步骤(按优先级执行)
为快速定位问题,建议按以下步骤逐步排查,每一步可直接验证核心原因,高效解决问题:
步骤1:验证提供者服务是否正常运行(优先执行)
登录提供者机器,执行命令查看internal-service进程是否存在:
ps \-ef \| grep internal\-service
结果说明:无相关进程 → 服务未启动/已宕机;有进程 → 继续下一步。检查25551端口是否正常监听:
netstat \-anp \| grep 25551
结果说明:无LISTEN状态 → 服务未启动成功;有LISTEN状态 → 服务端口正常。
步骤2:验证网络连接是否通畅
从消费者机器测试与提供者端口的连通性:
telnet xxx 25551
结果说明:连接失败 → 网络/防火墙问题;连接成功 → 网络正常。检查提供者机器防火墙状态,尝试临时关闭防火墙验证:
systemctl stop firewalld
关闭后重新执行telnet测试,若连通则说明防火墙拦截了端口。
步骤3:检查提供者服务状态
查看服务日志,排查是否有宕机、报错(如OOM、线程池满)信息;
查看服务JVM状态,排查GC情况:
jstat \-gcutil 进程ID 1000 10
若Full GC频繁(FGC次数持续增加),说明服务内存异常。
步骤4:排查消费者连接缓存问题
直接重启消费者服务(我是通过这个方法解决问题的),强制重建与提供者的Dubbo连接,若重启后报错消失,则说明是消费者缓存的无效连接导致问题。
四、解决方案(对应排查结果)
| 排查结果 | 解决方案 | 注意事项 |
|---|---|---|
| 提供者服务未启动/宕机 | 启动服务,确保服务正常注册到Dubbo注册中心 | 启动后检查端口监听状态,确认服务无报错 |
| 网络/防火墙拦截 | 1. 开放提供者机器25551端口;2. 配置安全组/防火墙规则,允许消费者IP访问;3. 排查网络路由异常 | 避免直接关闭防火墙,优先配置端口放行规则 |
| 提供者服务假死/过载 | 1. 优化接口性能,减少执行耗时;2. 调整服务线程池配置;3. 排查内存泄漏,优化JVM参数;4. 重启服务临时恢复 | 长期需优化服务性能,避免问题复现 |
| 消费者连接缓存失效 | 1. 重启服务;2. 优化Dubbo连接配置,开启自动重连机制 | 可配置Dubbo重连参数,减少无效连接缓存问题 |
五、问题总结与预防措施
5.1 问题总结
本次报错核心为Dubbo消费者与提供者之间的TCP连接中断,结合实际排查经验,99%的概率是提供者服务未正常运行或端口不通,通过启动提供者服务、验证端口连通性,可快速解决问题。
5.2 预防措施(避免问题复现)
给服务添加监控告警,当服务宕机、端口不通时,及时触发告警通知运维人员;
优化Dubbo配置,开启自动重连机制,减少无效连接缓存问题;
定期检查提供者服务状态、JVM运行情况,排查内存、线程池异常;
配置防火墙/安全组白名单,确保消费者与提供者之间的网络通畅,避免端口被拦截;
服务重启时,先停止消费者服务,再重启提供者服务,最后启动消费者服务,避免无效连接残留。
六、补充说明
1. 本次报错中,Dubbo配置已关闭粘滞连接(sticky=false),排除了粘滞连接导致的旧连接复用问题;
2. 重试次数配置为0(retries=0),若连接中断,不会进行重试,需排查根源问题,而非依赖重试机制;
3. 若问题仍未解决,可查看Dubbo日志(消费者/提供者),获取更详细的连接断开日志,进一步定位原因。