一、場景重現
最近在公司進行微服務架構升級,將原有的 Spring Cloud Hoxton 版本升級到最新的 2021.x 版本,同時使用 Nacos 作為服務注冊中心和配置中心。在完成基礎框架搭建后,我使用 Spring Cloud Gateway 作為API 網關,通過 Nacos 實現服務發現和動態路由。
一切看起來都很順利,直到我開始測試網關路由功能時,遇到了令人困惑的 503 錯誤。具體場景如下:
- 我已經成功注冊了兩個微服務到N acos:user-service 和 order-service
- 在 Gateway 中配置了簡單的路由規則:
spring:cloud:gateway:routes:- id: user-serviceuri: lb://user-servicepredicates:- Path=/api/user/**- id: order-serviceuri: lb://order-servicepredicates:- Path=/api/order/**
- 當通過網關訪問/api/user/1時,卻收到了503 Service Unavailable響應
查看日志發現如下關鍵錯誤信息:
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:// 前綴
三、問題根源
問題的本質在于:
- Spring Cloud Gateway 依賴負載均衡器來解析 lb:// 服務名
- 從 Spring Cloud 2020 開始,Ribbon 被棄用
- 如果沒有引入替代的負載均衡器,Gateway 無法找到可用的服務實例
四、解決方案
解決方法其實很簡單:引入 Spring Cloud LoadBalancer 作為 Ribbon 的替代品。
在 Gateway 服務的 pom.xml 中添加以下依賴:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
添加依賴后,重啟 Gateway 服務,再次測試路由功能,一切恢復正常。