记一次端口冲突问题排查:不是 BUG,也不是黑客

今天刚准备运行我的微服务商城项目,打算开始新的一天工作。结果当我启动其中一个微服务时,它居然没有像往常一样顺利启动,控制台直接给我报了个错:

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2025-11-07T13:41:59.752+08:00 ERROR 9344 --- [service-admin] [ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter :

APPLICATION FAILED TO START

Description:
Web server failed to start. Port 9000 was already in use.
Action:
Identify and stop the process that's listening on port 9000 or configure this application to listen on another port.

意思很清楚:9000 端口被占用了 我心想这问题以前也遇到过,应该是 IDEA 的老毛病。以往只要提示这个,我查一下端口占用(netstat -ano | findstr :9000),结束对应的进程就好了。

但这次我一查,直接傻眼了 —— 啥都没输出! 以前都会显示一个 Java 进程,可这次空空如也。

我当时还想,可能是端口抽风了,于是干脆把这个微服务的端口改成 9001。结果程序依旧报错,提示 9001 被占用。 我不死心,又试了 9002、9003……全都一样!每个端口都说被占用!


到这一步我开始感觉不对劲了。 于是我用老办法 —— 重启电脑。毕竟重启能解决 99% 的问题嘛(笑)。

重启后,我把端口改回 9000,果然,这次程序启动了!我松了一口气,觉得总算恢复正常了。 但刚登录系统,后端又报错:数据库连接失败

这个问题我以前也遇到过,知道是 MySQL 没启动。我就去服务里手动启动数据库。 结果这次又冒出个我从没见过的提示:

本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止。

接二连三出现从没见过的错误,我开始有点慌了。重启几次都没用。 甚至那一刻,我还真怀疑是不是电脑被黑客入侵了——毕竟最近防火墙是关着的,而且微软刚宣布 Win10 停止维护……


后来我发现,不止 MySQL,所有和微服务相关的程序都启动不了了 错误信息指向 Nacos,我打开 Nacos 的运行界面,看到这一行:

2025-11-07 14:18:37,360 ERROR Startup errors :
org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'grpcServerThreadPoolMonitor':
...
nested exception is java.io.IOException: Failed to bind to address 0.0.0.0/0.0.0.0:9848

我整个人都懵了。 我明明记得 Nacos 默认端口是 8848,怎么报的是 9848 被占用 而且我查了半天,8848、9848 都没被占用 这时候,我真开始怀疑是系统底层出问题了。

我又重启了好几次电脑,依然没用。 网络代理也连不上,甚至连 AI 都问不了(那一刻真的很绝望)。


直到后来,我在知乎上刷到一篇博客,博主遇到的问题是:

“小飞机开不了,报 1080 被占用。改成其他端口还是被占用,怎么办?”

我一看这情况,简直和我一模一样。 那位博主的解决办法是这样的:

  1. 查看系统的动态端口范围:

    netsh int ipv4 show dynamicport tcp
  2. 修改动态端口起始范围,避开常用端口:

    netsh int ipv4 set dynamicport tcp start=9088 num=13977
  3. 最后重启电脑,或者执行:

    netsh winsock reset

我照着他的步骤试了一遍。 没想到,真的就好了! Nacos 启动正常、微服务正常、数据库也没问题了。


原来,Windows 系统里有一段被保留的动态端口范围(也叫“系统排除端口”)。 这些端口是系统预留给临时连接或虚拟化组件(比如 WSL、Docker、Hyper-V)用的。 一旦你的程序刚好用到了这些端口,系统会认为“端口被占用”,但实际上并没有进程在用,所以你在 netstat 里看不到任何东西。

这也解释了为什么我换了好几个端口都不行 —— 因为这些端口正好全都落在系统保留的那段区间里。 而我改动动态端口范围后,相当于“把系统预留区间往后挪”,微服务用的端口就被释放出来了。


说实话,这次经历挺“玄学”的: 前期各种重启都没用,后面随手一条命令反而搞定。 这也让我第一次知道,Windows 真的会保留一段端口区间,哪怕没有任何进程占用,它依然不让你用。

所以,给自己也给看到这篇文章的你提个醒:

当你遇到“端口被占用但查不到进程”的情况,很可能是端口被系统保留了。 netsh int ipv4 show excludedportrange protocol=tcp 查一查,十有八九能找到原因。


总结一下这次经历:

  • 错误提示:端口被占用,但 netstat 查不到任何进程;

  • 改端口也不行,甚至换成完全不同的号;

  • 原因:端口落入系统保留(排除)范围;

  • 解决办法:

    1. 查看排除范围 netsh int ipv4 show excludedportrange protocol=tcp

    2. 调整动态端口起始位置 netsh int ipv4 set dynamicport tcp start=9088 num=13977

    3. 重启电脑或执行 netsh winsock reset

  • 一切恢复正常。


最后,这次算是一次挺有意思的事故排查,也提醒了我: 有时候问题不在应用层,而在更底层的系统配置。 下次再看到“端口被占用”,可别一上来就杀进程或者重启电脑,也许你正好撞上了系统保留区间。


  • 微信
  • 赶快加我聊天吧
  • QQ
  • 赶快加我聊天吧
  • weinxin
三桂

发表评论 取消回复 您未登录,登录后才能评论,前往登录