场景

使用 Spring Cloud Eureka 搭建服务注册中心,使用 Zuul 搭建服务网关,一套比较传统的微服务架构。

服务注册中心的地址为 http://localhost:8888,Zuul 网关地址为 http://localhost:8080, 另外搭建一个服务名为 metadata-service 的服务,地址为 http://localhost:8088

问题

metadata-service 中提供一个测试的接口

@RestController
public class MetadataController {​@GetMapping(value = "/test")public int getTest() {return 1;}
}

使用 Postman 进行测试,结果发现直接请求 http://localhost:8088/testmetadata-service 的地址,可以正常得到结果

而通过网关,使用 Zuul 默认路由规则,调用服务,会出现 404 的错误

分析

首先,我们可以先通过 http://localhost:8888 查看服务是否注册到了服务注册中心

可以看到没有任何问题。

那么,我们再检查网关有没有获取到 metadata-service 的路由。可以通过 http://localhost:8080/actuator/routes 查看(actuator默认是关闭的,可以通过配置 management.endpoints.web.exposure.include=* 开启)。

同样,我们可以看到没有任何问题。

那么,就很奇怪了 ,服务本身没有任何问题,直接调用也可以访问,而通过网关一转发,为什么就 404 了呢?在网上查了一下午,也没有找到有人遇到过类似的问题。。。

问题的关键在我关闭服务后再次请求 http://localhost:8088/test 时终于找到了。正常情况下,关闭了服务后,应该没有返回的 response,但发出请求过后仍然是 404

那么,就很明显了,有另一个进程也在监听 8088 端口 !!!

但还是很奇怪,那为什么服务启动的时候没有报端口被占用的错误呢???

重新启动服务,使用 lsof -i tcp:8088 (Mac OS)查看端口占用情况

果然有两个进程同时在监听,而一个是 IPv4,一个是 IPv6的。

首先,根据这篇文章 https://blog.csdn.net/jiyiqinlovexx/article/details/50959351 的解释,多个进程是完全可以同时监听同一个端口的。

而从 Java 7 开始,默认使用 IPv6 而不是 IPv4 (https://stackoverflow.com/questions/35470838/localhost-vs-127-0-0-1-in-spring-framework),所以对于 Spring 的 localhost 来说,其实真正使用的 IP 地址是 ::1,而不是 127.0.0.1 。使用 Postman 进行测试,可以发现 http://[::1]:8088/test 得到正常结果,而 http://127.0.0.1:8088/test 则为 404 。这就完美地解释了开启服务与停止服务,返回结果不同的问题,Spring 服务所对应的正是那个 IPv6 的进程。

那么,为什么网关转发就到了 IPv4 呢?我们再来看一下服务注册中心里的信息

可以看到其实 Eureka 保存的是每个服务的 IP 地址是本机的 IPv4 的内网地址,而不是保存域名,这就是问题的关键。我们可以使用 Postman 发送请求 http://localhost:8080/metadata-service/test 后,使用命令 lsof -i tcp:8088 进行验证。

可以看到的确是向内网 IP 地址,而不是向 localhost 转发请求。

解决方案

至此,问题的原因已经完全清楚了,果然程序都是 debug de 出来的。

最简单的方法也很清楚了,换个端口号就 OK 了。

如果本文有错误或者理解不对的地方,欢迎指正!!!

那么,占了 8088 端口的 IPv4 进程是哪个程序呢?

。。。。Hadoop 出来挨打!!!

8080端口被占用_Spring Cloud IPv6端口问题排坑相关推荐

  1. Linux部署Tomcat踩的坑以及解决方案【8080无法访问、日志显示XX端口被占用、修改默认端口、无法提供安全连接】

    Linux部署Tomcat踩的坑以及解决方案[8080无法访问.日志显示XX端口被占用.修改默认端口.无法提供安全连接] 8080无法访问 解压开压缩包后,执行bin目录下的 startup.sh 后 ...

  2. 8080端口被占用怎么解决_端口占用不会搞?两行命令就解决!

    工作中我们经常遇到这样的问题: 1Caused by: java.net.BindException: Address already in use: bind 闭上眼一看就知道问题原因是端口被占用了 ...

  3. mac下查看mysql端口被占用_MAC下查看端口占用并杀死进程

    Eclipse在Run on Server时,Tomcat是开启的,但是报错,显示8080.8005和8009端口被占用 终端输入 查看所有开启的端口 sudo lsof -i -P | grep - ...

  4. mysql3306端口被占用无法终止_Mysql3306端口被占用无法启动解决办法

    Mysql3306端口被占用,妙招轻松解决 早晨发现mysql服务器意外停止服务,造成网站无法打开,查看mysql日志(注:该日志在msyql安装目录下data文件夹里,文件名是机器名.err,该文件 ...

  5. mysql3306端口被占用无法终止_Mysql3306端口被占用无法启动解决办法.doc

    Mysql3306端口被占用,妙招轻松解决 早晨发现mysql服务器意外停止服务,造成网站无法打开,查看mysql日志(注:该日志在msyql安装目录下data文件夹里,文件名是机器名.err,该文件 ...

  6. 学PHP时,端口被占用,怎么找端口的占用情况。

    以管理员的身份运行命令行cmd(否则无权限) 输入命令:  netstat -ano      回车后: 左边标记的就是端口号,右边标记的就是本机电脑的应用程序的PID号. 那么问题来了,怎么才知道哪 ...

  7. 端口被占用, 多个端口状态为TIME_WAIT

    报错抛出的异常: java.io.IOException: Cannot bind to URL [rmi://127.0.0.1:1090/jmxconnector]: javax.naming.C ...

  8. window 端口被占用 关闭多个端口

    window 端口被占用 (例如 9091) win+r 打开cmd界面 netstat –ano 找到9091端口的对应pid 11000(这个11000是我的 找自己对应的) 方法一(多个端口被占 ...

  9. windows查看端口号,查看端口号占用情况,杀掉端口

    我们在开发或运维时经常遇到端口被占用的情况,这个时候我们就需要找出被占用端口的程序,然后结束它.下面一起来学习一下 打开cmd命令窗口 win+R组合键 或者 开始-->运行-->cmd ...

最新文章

  1. Redis集群Twemproxy
  2. Android之子菜单的创建
  3. 程序员面试题精选100题(09)-链表中倒数第k个结点[数据结构]
  4. JPA 一对一设置无效,连表查询的时候另外一个实体类的对象值为空
  5. 批量下载ABAP程序和表结构
  6. Java8 Striped64 和 LongAdder
  7. CVPR 2021 目标检测、跟踪和姿态估计最新进展分享
  8. 心跳脑裂解决方案之Heartbeat的Stonith配置
  9. Font Awesome入门教程
  10. 诺基亚3230用PC套件备份联系人却不能恢复的解决办法
  11. UDS诊断服务(0x10)
  12. 利用Mcafee管理工具绕过McAfee杀毒软件
  13. 前端工程化--yeoman使用
  14. AT89C51单片机制作简易密码锁
  15. 国内IT界5大女神程序员,你知道几个
  16. 蓝桥杯的比赛流程和必考点
  17. 在线心语日历批量生成工具
  18. xxx is out of date错误
  19. frp:开源内网穿透工具
  20. 《痞子衡嵌入式半月刊》 第 63 期

热门文章

  1. MCtalk 创业声音丨辉禹科技合伙人孔杰:投资和创业都是思维的放大器
  2. 互联网1分钟 |1112
  3. 网易云信音视频技术落地提速,读书郎电话手表成行业先锋
  4. 【新年快乐】网易云信春节期间服务公告
  5. 十年磨一剑!SACC带你领略企业大数据平台实践优化!
  6. Spark Streaming实时流处理学习
  7. 设置背景图片,解决手机上背景图片高度适应问题
  8. 支持Windows 7的CAD—AutoCAD Civil 3D 2010
  9. Nginx FastCGI的运行原理
  10. pku1401 Factorial 计算n!末尾有几个0?