【Spring Cloud Gateway】Nacos整合遇坑记:503 Service Unavailable

一、场景重现

最近在公司进行微服务架构升级,将原有的 Spring Cloud Hoxton 版本升级到最新的 2021.x 版本,同时使用 Nacos 作为服务注册中心和配置中心。在完成基础框架搭建后,我使用 Spring Cloud Gateway 作为API 网关,通过 Nacos 实现服务发现和动态路由。

一切看起来都很顺利,直到我开始测试网关路由功能时,遇到了令人困惑的 503 错误。具体场景如下:

  1. 我已经成功注册了两个微服务到N acos:user-service 和 order-service
  2. 在 Gateway 中配置了简单的路由规则:
yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/api/user/**
        - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/api/order/**
  1. 当通过网关访问/api/user/1时,却收到了503 Service Unavailable响应
    查看日志发现如下关键错误信息:
yaml 复制代码
Whitelabel Error Page
This application has no configured error view, so you are seeing this as a fallback.

Wed May 20 09:40:11 CST 2025

[fd8c3a90-7] There was an unexpected error (type=Service Unavailable, status=503).

二、问题排查

第一步:确认服务注册情况

首先我检查了 Nacos 控制台,确认 user-service 和 order-service 确实已经成功注册,且健康状态正常。这说明服务注册本身没有问题。

第二步:检查 Gateway 配置

路由配置看起来也没有问题,lb:// 前缀表示使用负载均衡,这是 Spring Cloud Gateway 的标准用法。

第三步:查阅文档和版本变化

经过查阅 Spring Cloud 官方文档,我注意到从 Spring Cloud 2020版 本开始,Netflix Ribbon 被标记为进入维护模式,Spring 官方推荐使用Spring Cloud LoadBalancer 作为替代。而在 Spring Cloud 2021 版本中,Ribbon被完全移除。

如果没有显式引入负载均衡器,Gateway 无法正确解析 lb:// 前缀

三、问题根源

问题的本质在于:

  1. Spring Cloud Gateway 依赖负载均衡器来解析 lb:// 服务名
  2. 从 Spring Cloud 2020 开始,Ribbon 被弃用
  3. 如果没有引入替代的负载均衡器,Gateway 无法找到可用的服务实例

四、解决方案

解决方法其实很简单:引入 Spring Cloud LoadBalancer 作为 Ribbon 的替代品。

在 Gateway 服务的 pom.xml 中添加以下依赖:

yaml 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

添加依赖后,重启 Gateway 服务,再次测试路由功能,一切恢复正常。

相关推荐
天天进步20158 小时前
Python全栈项目--基于深度学习的图像超分辨率系统
开发语言·python·深度学习
糖果店的幽灵8 小时前
langgraph的四种state解析
java·前端·javascript·langgraph
杨充8 小时前
4.接口而非实现编程
java·后端·架构
梦梦代码精8 小时前
基于ThinkPHP6 + Vue3的家政预约系统全解析:从LBS定位到自动派单的完整实现
java·docker·开源·php·代码规范
wear工程师8 小时前
@Transactional 标了却没开事务?先看这次调用有没有经过代理
java·spring
Joey_friends8 小时前
指纹authenticate流程图
android·java·c++
小小晓.8 小时前
C++小白记:C风格字符串和数组用法
c语言·开发语言·c++
Helen_cai8 小时前
OpenHarmony 项目统一全局样式、尺寸、色彩主题封装 ThemeUtil(API23)
开发语言·前端·javascript·华为·harmonyos
郑州光合科技余经理8 小时前
家政O2O平台解析:从0搭建上门预约小程序解决方案
android·java·开发语言·前端·小程序·架构·php
深念Y9 小时前
开发者如何清理和迁移C盘堆积的垃圾
c语言·开发语言