1. 问题现象

在腾讯云服务器上使用 Docker Compose 部署 RuoYi-Cloud 时,发现 ruoyi-authruoyi-gateway 频繁启动失败。查看日志发现如下诡异现象:

  • 配置明明写了bootstrap.yml 中已明确配置 server-addr: ruoyi-nacos:8848

  • 日志却在报错

  •  ERROR c.a.n.c.r.c.g.GrpcClient - Server check fail, please check server 127.0.0.1, port 9848 is available
    Caused by: java.net.ConnectException: Connection refused

现象总结微服务仿佛“无视”了配置文件,不断尝试连接容器自身的 127.0.0.1:9848,导致连接拒绝后直接退出

2. 深度溯源:为什么会“死磕” 127.0.0.1?

经过多轮排查(包括进入容器 ping 测试、检查 Nacos 端口映射等),发现病根不在网络,而在 Spring Cloud Nacos 的初始化机制

2.1 启动瞬时的“解析真空期”

Nacos 3.x/2.x 依赖 gRPC 协议(端口 9848)。在 Docker Compose 一键启动时,尽管 Nacos 容器处于 Up 状态,但其内部 gRPC 服务就绪往往比 HTTP 服务慢几秒。

2.2 触发 Fallback 回退机制

当微服务启动的一瞬间,如果 Nacos 服务还没准备好,或者 Docker DNS 解析 ruoyi-nacos 出现了毫秒级的延迟,Nacos 客户端会认为配置的地址无效。此时,它会触发底层的默认回退机制:直接使用代码中硬编码的默认地址 127.0.0.1:8848

一旦程序进入这个 Fallback 逻辑,它就不会再回头去解析 bootstrap.yml 里的变量,从而陷入连接本地失败的死循环。

3. 核心解决方案:Docker Environment 强制注入

解决这个问题的关键在于:在配置生效顺序上“降维打击”(博主是这么解决的)

在 Spring Boot 中,环境变量的优先级高于 YAML 配置文件。通过在 docker-compose.ymlenvironment 节点直接注入 Nacos 地址,可以强制 Nacos 客户端在初始化对象时直接锁定正确地址,彻底跳过回退到 127.0.0.1 的过程。

3.1 修改 docker-compose.yml

针对 docker-compose.yml内的ruoyi-authruoyi-gateway 等所有微服务模块,添加如下环境变量(就是添加environment里面的内容):

  ruoyi-gateway:
    container_name: ruoyi-gateway
    environment:
      # 1. 强制覆盖注册中心地址
      - SPRING_CLOUD_NACOS_DISCOVERY_SERVER_ADDR=ruoyi-nacos:8848
      # 2. 强制覆盖配置中心地址
      - SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR=ruoyi-nacos:8848
      # 3. 针对 Sentinel 等组件的 Nacos 连接地址加固
      - SPRING_CLOUD_SENTINEL_DATASOURCE_DS1_NACOS_SERVER_ADDR=ruoyi-nacos:8848
    depends_on:
      - ruoyi-nacos
      - ruoyi-redis

3.2 部署操作建议

  1. 修改配置:在 docker-compose.yml 中为所有业务模块加上述变量。

  2. 彻底重建:执行 docker-compose stop docker-compose rm 确保旧容器配置被清除。

  3. 点火顺序

    • 先启动基础组件:docker-compose up -d ruoyi-mysql ruoyi-redis ruoyi-nacos

    • 确认 Nacos 日志出现 Nacos started successfully 后,再拉起业务模块。

  4. 手动纠正:若因启动时机问题仍有个别模块报错,直接执行 docker restart <容器名>,此时由于 Nacos 已完全就绪,重启必成功。


4. 总结

在 Docker 容器化部署微服务时,“配置可见性”“启动时序”是两大坑点。

  • 不要过度依赖 YAML 变量:在复杂的容器网络中,使用 Docker 环境变量注入核心配置(如 Nacos、Redis 地址)是最稳妥的做法。

  • 关注 gRPC 端口:Nacos 2.x+ 必须保证 9848 端口的通畅。

  • 环境变量优先级:利用 Spring Boot 的配置优先级特性,可以有效解决程序初始化时的 Fallback 异常。

通过这种方式,原本需要反复修改代码配置文件、重新打 Jar 包的“玄学问题”,通过一行 Compose 配置即可完美解决。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐