前言
微服务架构下,bug 不一定在代码,大量故障来自:网络、服务器环境、中间件、操作系统、容器 / 云原生配置、基础设施、运维参数、带宽 / 连接数、时间同步、dns、防火墙等。下面按场景分类,结合 java 微服务实际业务场景讲清楚现象、原因、排查点。
一、网络层问题(最常见、最难排查)
1. 端口不通 / 端口放行缺失
现象
- 服务注册成功,但调用直接超时、
connection refused - 本地调试正常,测试 / 生产环境直接调不通
根因
- 服务器防火墙(firewalld/iptables)未放行服务端口
- 云服务器安全组规则限制(入站 / 出站端口、ip 白名单)
- 容器化场景:docker/ k8s 端口映射错误、pod 网络策略拦截
微服务典型场景nacos/sentinel/rocketmq/redis 客户端能连上控制台,但业务服务之间调用不通,就是端口 + 安全组问题。
2. 网络超时、跨机房延迟过高
现象
- 偶尔接口超时、feign/resttemplate 调用间歇性失败
- 白天正常,高峰期大量
read timed out
根因
- 微服务跨机房、跨可用区部署,物理网络延迟高
- 公网调用第三方接口(支付、短信、地图)网络抖动
- 运营商链路不稳定、弱网
java 特有加重问题
- feign、okhttp 未合理配置连接超时、读取超时、重试策略
- 无熔断降级,单次慢调用拖垮整个线程池
3. tcp 连接打满、连接泄漏
现象
- 服务莫名卡死、接口响应极慢,无报错日志
- 服务器
established连接数爆表 - 无法新建连接,新请求直接阻塞
根因
- 未复用 http 连接,每次调用新建短连接
- 外部资源(数据库、redis、mq)连接池配置过小
- 网络断连后,tcp 僵死连接不释放(半开连接)
4. dns 解析异常 / 解析缓慢
现象
- 服务偶尔注册不上 nacos、网关路由突然失效
- 首次调用慢、间歇性域名解析失败
根因
- 服务器 dns 服务器配置不合理、dns 缓存过期
- 微服务使用域名注册,dns 抖动导致服务实例列表刷新异常
- java 默认 dns 缓存策略过长 / 过短
二、服务器 & 操作系统层问题
1. 服务器资源耗尽(cpu / 内存 / 磁盘)
(1)cpu 飙升
非代码原因:
- 服务器宿主机超配、共享宿主机被其他业务抢占资源
- 系统定时任务(日志切割、备份、杀毒)高峰期抢占 cpu
- 磁盘 io 过高引发 cpu 等待
(2)内存溢出之外:系统内存不足
非 oom 代码问题
- 服务器物理内存不足,触发 oom killer 直接杀掉 java 进程
- 容器限制内存(docker/k8s limit)设置过小
- 服务器缓冲区、缓存占用过高,导致 jvm 无法申请堆外内存
(3)磁盘爆满
高频微服务故障:
- 日志无轮转、不压缩,
catalina.out/ 业务日志无限膨胀 - 临时文件、mq 堆积文件、上传文件未清理
- 磁盘 inode 耗尽(小文件过多,日志碎片、缓存文件)
2. 系统内核参数不合理
高频坑点
file-max最大文件句柄数过小 → too many open files微服务长连接(redis、mq、数据库、网关)多,极易触发- tcp 内核参数:
tcp_keepalive不合理,僵死连接不回收 - 虚拟内存、swap 开启,内存不足时频繁交换磁盘,服务巨卡
3. 时间不同步(隐藏致命问题)
现象
- 分布式定时任务重复执行 / 不执行
- jwt、token、签名校验失败
- 分布式事务、订单时间错乱、日志时序混乱
根因服务器未配置 ntp 时间同步,多台微服务机器时间偏差几秒~几分钟。
三、中间件 & 基础设施非代码问题
1. nacos/eureka 注册发现异常
非代码问题:
- nacos 服务器集群负载过高、磁盘满、gc 卡顿
- 网络分区:微服务与注册中心心跳断连
- 临时网络抖动导致服务频繁上下线(实例刷屏)
- 环境隔离问题:开发 / 测试 nacos 地址串台
2. redis 非代码故障
- redis 服务器内存满、达到 maxmemory,触发淘汰策略导致缓存击穿
- redis 主从同步延迟、集群槽位迁移
- 网络分区导致缓存读写超时、集群下线
- 未开启持久化,重启数据丢失
3. mq(rocketmq/kafka)问题
- broker 磁盘爆满、页缓存不足,消息写入阻塞
- 集群节点下线、网络分区,消费堆积
- 服务器磁盘 io 瓶颈,导致 mq 收发延迟暴涨
四、容器 & 云原生特有问题(docker/k8s)
- 资源配额限制cpu / 内存配额压测时被限流、降频,代码没问题但性能上不去
- 容器网络网桥、cni 插件异常,pod 之间互通失败
- 镜像时区不对、编码不对,导致日期、中文乱码
- 容器日志驱动限制,日志丢失、截断
五、网关 & 负载均衡层问题
- nginx / 网关 连接数上限、worker 进程数配置不足
- 负载均衡会话保持、健康检查规则不合理,剔除正常服务
- 上层网关超时时间 < 下游服务超时,上层先断连,业务报超时但服务还在执行
- ssl 证书过期、https 协议版本不兼容
六、日常排查通用思路(非代码问题专用)
- 先区分:单实例问题 还是 全部服务问题
- 全部异常:网络、dns、中间件、公共服务器
- 单实例异常:当前机器资源、配置、容器限制
- 优先看基础设施指标cpu、内存、磁盘、磁盘 io、网络流量、tcp 连接数
- 排除安全组、防火墙、端口、域名连通性
- 查看系统日志
/var/log/messages、容器日志、内核报错 - 核对时间同步、内核参数、文件句柄数
七、java 微服务优化避坑(针对非代码问题)
- 统一配置:超时时间、连接池大小、心跳检测
- 服务器强制开启 ntp 时间同步
- 所有服务配置日志轮转、自动压缩、过期删除
- 生产环境关闭 swap,调优文件句柄、tcp 内核参数
- 云环境严格梳理安全组、白名单、容器资源限制
总结
到此这篇关于java微服务项目中出现的网络、服务器等非代码问题的根因详解的文章就介绍到这了,更多相关java微服务网络、服务器等问题内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论