在微服務體系中,Nacos 主要承擔“服務注冊與發現、配置中心”的職能,Gateway(如 Spring Cloud Gateway)通常負責“路由轉發、過濾、安全鑒權、灰度流量控制”等功能,而 Nginx 則常被用作“邊緣反向代理”或“統一流量入口”。在實際項目里,這三者經常組合使用,以實現高擴展、高可用、可觀測且靈活的流量調度。
一、Nacos + Gateway + Nginx 的常見部署架構
一般來說,可以把 Nginx 放在最外層作為“邊緣代理”或“靜態資源服務器”,在內網或容器集群里部署 Gateway 實例作為微服務的入口網關,網關與 Nacos 對接獲取后端微服務實例信息,然后將請求路由到對應的服務。
示意圖:
┌───────────────────┐Internet │ Nginx (Edge) │ <-- 監聽80/443端口,做SSL、靜態資源、反向代理└────────┬──────────┘│▼┌───────────────────┐│ Spring Cloud │ <-- 網關集群(多個節點)│ Gateway │ <-- 進行路由、鑒權、灰度流量控制└────────┬──────────┘│┌──────────────────┴───────────────────┐│ ││ ┌───────────────────┐ ││ │ microservice-A │ │ <-- 內部微服務集群│ └───────────────────┘ │ <-- (多實例) 注冊到 Nacos│ ││ ┌───────────────────┐ ││ │ microservice-B │ ││ └───────────────────┘ │└──────────────────────────────────────┘┌───────────────────┐│ Nacos │ <-- 提供服務注冊、發現、配置管理│ (Discovery + Conf)│└───────────────────┘
-
Nginx (Edge):
- 處理公網的 HTTP/HTTPS 流量,以及靜態資源、域名解析等。
- 將請求反向代理到內網的 Gateway 集群地址。
-
Gateway (Spring Cloud Gateway / Zuul / etc.):
- 與 Nacos 整合,實現動態獲取微服務實例列表。
- 進行更細粒度的負載均衡、路由轉發、權限控制、限流、灰度發布等工作。
-
Nacos:
- 微服務(如 microservice-A、microservice-B)啟動時向 Nacos 注冊,網關也從 Nacos 拉取這些實例信息進行動態路由。
- 同時可做分布式配置管理。
這種架構好處:
- Nginx 專注處理邊緣流量、SSL 證書、靜態資源緩存等;
- Gateway 在內部網絡中,實現微服務網關應有的路由、負載、鑒權、灰度、可觀測功能;
- Nacos 提供統一的服務發現和配置管理;
- 部署和職責清晰,各組件各司其職,易于擴展和維護。
二、網關層負載均衡方案
Spring Cloud Gateway(或基于 LoadBalancer、Ribbon、Feign 等)的微服務負載均衡通常有兩種模式:
-
基于服務名:
在 Gateway 的路由配置中,寫lb://microservice-A
,Gateway 會通過 Spring Cloud LoadBalancer / Ribbon 去 Nacos 查詢microservice-A
的實例列表,并根據輪詢或自定義策略進行負載均衡。 -
基于元數據或標簽:
- 如果需要灰度發布、按版本路由等,則可以在實例注冊到 Nacos 時,設置
metadata.version=v2
等屬性。 - Gateway 中的路由過濾器會基于請求頭或特定條件篩選元數據為
v2
的實例,達到版本級或標簽級的智能負載。
- 如果需要灰度發布、按版本路由等,則可以在實例注冊到 Nacos 時,設置
示例:(簡化寫法)
spring:cloud:gateway:discovery:locator:enabled: true # 開啟基于 Nacos 的自動路由routes:- id: microservice-auri: lb://microservice-apredicates:- Path=/api/a/**filters:- StripPrefix=1# 更多路由定義...
然后 Gateway 會自動通過 Nacos 找到 microservice-a
下所有可用實例并進行負載均衡。
三、Nginx 側負載均衡最佳實踐
3.1 在網關集群之上負載
如果你有多個 Gateway 實例(水平擴展),可以讓 Nginx 來做第一層負載均衡,將外部流量分發到各 Gateway 實例。例如:
upstream gateway_cluster {least_conn;server 10.0.1.101:8080;server 10.0.1.102:8080;# 如果有更多 gateway 實例都可加上
}server {listen 80;server_name example.com;location / {proxy_pass http://gateway_cluster;proxy_http_version 1.1;proxy_set_header Connection "";}
}
- 網關集群 內部再通過 Nacos 尋址到微服務。
- 一般只在 Nginx 配置文件中維護 Gateway 實例即可,實例數量不會頻繁變化,減少動態更新的復雜度。
3.2 直接負載微服務(不推薦)
如果你希望 Nginx 直接 負載到后端微服務實例,那么就需要自定義腳本或 OpenResty + Lua 來讓 Nginx 跟 Nacos 同步實例列表(詳見 上一條回答 或網上類似方案)。
- 這種做法在大多數場景下不推薦,因為失去了網關層的可觀測、流量管理、灰度控制等優勢,維護起來也更復雜。
- 最佳實踐 還是將負載均衡下沉到 Gateway,Nginx 只需知道 Gateway 的地址做統一外部入口。
四、常見問題與建議
-
為什么還要 Nginx,如果 Gateway 也能做反向代理和 SSL?
- 某些公司已有成熟的 Nginx 部署體系,用作七層安全防護、WAF、邊緣緩存、流量統計等;或是依賴 Nginx 強大的高并發性能和成熟運維工具。
- 也可以讓 Gateway 直接對外暴露端口進行 HTTPS / 證書管理,但運維成本及安全需求決定了許多公司仍然傾向在最外層保留 Nginx。
-
如何實現灰度 / 藍綠發布?
- 最常見在 Gateway 層按用戶標簽或請求頭區分流量;
- 如果想在 Nacos 上給不同實例打上
metadata.version
,再在 Gateway 的負載均衡策略里篩選可用實例,就能實現更精細的路由。
-
Nacos 配置管理如何與 Gateway 結合?
- Gateway 的路由規則或限流規則也可以存放在 Nacos Config 中,實現動態刷新;
- 或者使用 Apollo / Spring Cloud Config 的方式管理網關配置。關鍵是要有統一的配置中心,避免重復修改、維護困難。
-
性能和高可用
- Nacos:建議做集群部署(3 節點以上 odd 數目),并優化數據庫寫入/讀取;
- Gateway:可橫向擴容,多實例配合 Nginx 或負載均衡器;
- Nginx:也要做多節點或 keepalived / LVS 等方案防止單點;
- 在高流量場景,應重點關注網關與微服務的壓測和監控(QPS、RT、內存、CPU)。
-
可觀測與日志
- 建議在 Gateway 層做統一的鏈路追蹤、埋點監控、日志收集(如 Zipkin / SkyWalking / SLS),更容易排查服務調用問題;
- Nginx Access Log 只提供最外層訪問日志,有助于了解外部訪問頻次、來源 IP 等。
五、總結
- Nacos:服務發現 + 配置中心
- Gateway:微服務網關層(路由、鑒權、限流、灰度)
- Nginx:對外入口或邊緣代理(SSL、靜態資源、緩存、與 Gateway 集群負載均衡)
推薦架構:
- Nginx 在外部扮演“CDN/反向代理”角色,可將請求分發到內部 Gateway 集群;
- Gateway 與 Nacos 深度整合,通過服務名或元數據查找后端實例并進行更多流量治理;
- 微服務(如訂單、庫存、支付等)都在 Nacos 注冊并實現動態上下線管理;
- 若需要更精細的灰度、藍綠發布,可在 Gateway 層結合 Nacos metadata 做路由篩選;
- 如果有 K8s 等容器平臺,也可結合 Ingress / Service Mesh 進行更先進的流量管理和服務發現。
通過此種分層,既能讓 Nginx 繼續發揮在邊緣側(安全、緩存、靜態資源)的優勢,又能讓 Gateway + Nacos 充分利用 Spring Cloud Alibaba 生態的微服務治理功能,形成一個高可用、高擴展、易運維的分布式架構體系。