Alibaba Spring Cloud 十三 Nacos,Gateway,Nginx 部署架構與負載均衡方案

在微服務體系中,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 拉取這些實例信息進行動態路由。
    • 同時可做分布式配置管理。

這種架構好處

  1. Nginx 專注處理邊緣流量、SSL 證書、靜態資源緩存等;
  2. Gateway 在內部網絡中,實現微服務網關應有的路由、負載、鑒權、灰度、可觀測功能;
  3. Nacos 提供統一的服務發現和配置管理;
  4. 部署和職責清晰,各組件各司其職,易于擴展和維護。

二、網關層負載均衡方案

Spring Cloud Gateway(或基于 LoadBalancer、Ribbon、Feign 等)的微服務負載均衡通常有兩種模式:

  1. 基于服務名
    在 Gateway 的路由配置中,寫 lb://microservice-A,Gateway 會通過 Spring Cloud LoadBalancer / Ribbon 去 Nacos 查詢 microservice-A 的實例列表,并根據輪詢或自定義策略進行負載均衡。

  2. 基于元數據或標簽

    • 如果需要灰度發布、按版本路由等,則可以在實例注冊到 Nacos 時,設置 metadata.version=v2 等屬性。
    • Gateway 中的路由過濾器會基于請求頭或特定條件篩選元數據為 v2 的實例,達到版本級或標簽級的智能負載。

示例:(簡化寫法)

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 的地址做統一外部入口。

四、常見問題與建議

  1. 為什么還要 Nginx,如果 Gateway 也能做反向代理和 SSL?

    • 某些公司已有成熟的 Nginx 部署體系,用作七層安全防護、WAF、邊緣緩存、流量統計等;或是依賴 Nginx 強大的高并發性能和成熟運維工具。
    • 也可以讓 Gateway 直接對外暴露端口進行 HTTPS / 證書管理,但運維成本及安全需求決定了許多公司仍然傾向在最外層保留 Nginx。
  2. 如何實現灰度 / 藍綠發布?

    • 最常見在 Gateway 層按用戶標簽或請求頭區分流量;
    • 如果想在 Nacos 上給不同實例打上 metadata.version,再在 Gateway 的負載均衡策略里篩選可用實例,就能實現更精細的路由。
  3. Nacos 配置管理如何與 Gateway 結合?

    • Gateway 的路由規則或限流規則也可以存放在 Nacos Config 中,實現動態刷新;
    • 或者使用 Apollo / Spring Cloud Config 的方式管理網關配置。關鍵是要有統一的配置中心,避免重復修改、維護困難。
  4. 性能和高可用

    • Nacos:建議做集群部署(3 節點以上 odd 數目),并優化數據庫寫入/讀取;
    • Gateway:可橫向擴容,多實例配合 Nginx 或負載均衡器;
    • Nginx:也要做多節點或 keepalived / LVS 等方案防止單點;
    • 在高流量場景,應重點關注網關與微服務的壓測和監控(QPS、RT、內存、CPU)。
  5. 可觀測與日志

    • 建議在 Gateway 層做統一的鏈路追蹤、埋點監控、日志收集(如 Zipkin / SkyWalking / SLS),更容易排查服務調用問題;
    • Nginx Access Log 只提供最外層訪問日志,有助于了解外部訪問頻次、來源 IP 等。

五、總結

  • Nacos:服務發現 + 配置中心
  • Gateway:微服務網關層(路由、鑒權、限流、灰度)
  • Nginx:對外入口或邊緣代理(SSL、靜態資源、緩存、與 Gateway 集群負載均衡)

推薦架構

  1. Nginx 在外部扮演“CDN/反向代理”角色,可將請求分發到內部 Gateway 集群;
  2. GatewayNacos 深度整合,通過服務名或元數據查找后端實例并進行更多流量治理;
  3. 微服務(如訂單、庫存、支付等)都在 Nacos 注冊并實現動態上下線管理;
  4. 若需要更精細的灰度、藍綠發布,可在 Gateway 層結合 Nacos metadata 做路由篩選;
  5. 如果有 K8s 等容器平臺,也可結合 Ingress / Service Mesh 進行更先進的流量管理和服務發現。

通過此種分層,既能讓 Nginx 繼續發揮在邊緣側(安全、緩存、靜態資源)的優勢,又能讓 Gateway + Nacos 充分利用 Spring Cloud Alibaba 生態的微服務治理功能,形成一個高可用、高擴展、易運維的分布式架構體系。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67026.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67026.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67026.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Next.js 實戰 (十):中間件的魅力,打造更快更安全的應用

什么是中間件&#xff1f; 在 Next.js 中&#xff0c;中間件&#xff08;Middleware&#xff09;是一種用于處理每個傳入請求的功能。它允許你在請求到達頁面之前對其進行修改或響應。 通過中間件&#xff0c;你可以實現諸如日志記錄、身份驗證、重定向、CORS配置、壓縮等任務…

ElasticSearch-文檔元數據樂觀并發控制

文章目錄 什么是文檔&#xff1f;文檔元數據文檔的部分更新Update 樂觀并發控制 最近日常工作開發過程中使用到了 ES&#xff0c;最近在檢索資料的時候翻閱到了 ES 的官方文檔&#xff0c;里面對 ES 的基礎與案例進行了通俗易懂的解釋&#xff0c;讀下來也有不少收獲&#xff0…

實驗二 數據庫的附加/分離、導入/導出與備份/還原

實驗二 數據庫的附加/分離、導入/導出與備份/還原 一、實驗目的 1、理解備份的基本概念&#xff0c;掌握各種備份數據庫的方法。 2、掌握如何從備份中還原數據庫。 3、掌握數據庫中各種數據的導入/導出。 4、掌握數據庫的附加與分離&#xff0c;理解數據庫的附加與分離的作用。…

技術中臺與終搜——2

文章目錄 5、語言處理與自動補全技術探測5.1 自定義語料庫5.1.1 語料庫映射OpenAPI5.1.2 語料庫文檔OpenAPI 5.2 產品搜索與自動補全5.2.1 漢字補全OpenAPI5.2.2 拼音補全OpenAPI 5.3 產品搜索與語言處理5.3.1 什么是語言處理&#xff08;拼寫糾錯&#xff09;5.3.2 語言處理Op…

15_業務系統基類

創建腳本 SystemRoot.cs 因為 業務系統基類的子類 會涉及資源加載服務層ResSvc.cs 和 音樂播放服務層AudioSvc.cs 所以在業務系統基類 提取引用資源加載服務層ResSvc.cs 和 音樂播放服務層AudioSvc.cs 并調用單例初始化 using UnityEngine; // 功能 : 業務系統基類 public c…

k8s優雅重啟

理論上處于terminating狀態的pod&#xff0c;k8s 就會把它從service中移除了&#xff0c;只用配置一個優雅停機時長就行了。kubectl get endpoints 驗證 因此&#xff0c;優雅重新的核心問題&#xff0c;是怎么讓空閑長連接關閉&#xff0c;再等待處理中的請求執行完。 一些底…

【Linux】華為服務器使用U盤安裝統信操作系統

目錄 一、準備工作 1.1 下載UOS官方系統 &#xff11;.&#xff12;制作啟動U盤 1.3 服務器智能管理系統iBMC 二、iBMC設置U盤啟動 一、準備工作 1.1 下載UOS官方系統 服務器CPU的架構是x86-64還是aarch64&#xff09;,地址&#xff1a;統信UOS生態社區 - 打造操作系統創…

27. 【.NET 8 實戰--孢子記賬--從單體到微服務】--簡易報表--報表服務

報表是每個記賬應用所具備的功能&#xff0c;要實現報表功能就需要把賬本的核心功能&#xff08;記賬&#xff09;完成&#xff0c;因此報表服務作為本專欄第一部分單體應用開發中最后一個要實現的功能&#xff0c;這一篇文章很簡單&#xff0c;我們一起來實現一個簡單的報表服…

基于 Node.js 的天氣查詢系統實現(附源碼)

項目概述 這是一個基于 Node.js 的全棧應用,前端使用原生 JavaScript 和 CSS,后端使用 Express 框架,通過調用第三方天氣 API 實現天氣數據的獲取和展示。 主要功能 默認顯示多個主要城市的天氣信息 支持城市天氣搜索 響應式布局設計 深色主題界面 優雅的加載動畫 技術棧 …

cursor重構谷粒商城04——vagrant技術快速部署虛擬機

前言&#xff1a;這個系列將使用最前沿的cursor作為輔助編程工具&#xff0c;來快速開發一些基礎的編程項目。目的是為了在真實項目中&#xff0c;幫助初級程序員快速進階&#xff0c;以最快的速度&#xff0c;效率&#xff0c;快速進階到中高階程序員。 本項目將基于谷粒商城…

leetcode 面試經典 150 題:簡化路徑

鏈接簡化路徑題序號71題型字符串解法棧難度中等熟練度??? 題目 給你一個字符串 path &#xff0c;表示指向某一文件或目錄的 Unix 風格 絕對路徑 &#xff08;以 ‘/’ 開頭&#xff09;&#xff0c;請你將其轉化為 更加簡潔的規范路徑。 在 Unix 風格的文件系統中規則如下…

如何在gitee/github上面搭建obsidian的圖床

在搭建圖床之前我們需要知道圖床是一個什么東西,圖床顧名思義就是存放圖片的地方&#xff0c;那么我們為什么要搭建圖床呢&#xff1f;因為我們在寫博客的時候&#xff0c;很多同學都是在本地使用typora或者是obsidian進行markdown語法的文章的書寫&#xff0c;文件格式通常都是…

JVM堆空間

JVM&#xff08;Java虛擬機&#xff09;堆空間是Java內存管理的核心區域之一&#xff0c;用于存儲Java對象實例。以下是關于JVM堆空間的詳細介紹&#xff1a; 1. 堆空間的作用 ? 存儲對象實例&#xff1a;幾乎所有的Java對象實例&#xff08;通過new關鍵字創建的對象&#xf…

Redis 的熱 Key(Hot Key)問題及解決方法

Redis 的熱 Key&#xff08;Hot Key&#xff09;問題及解決方法 1. 什么是 Redis 熱 Key&#xff1f; Redis 熱 Key&#xff08;Hot Key&#xff09;指的是訪問頻率極高的 Key&#xff0c;通常會造成以下問題&#xff1a; 單 Key 訪問量過大&#xff1a;熱點 Key 可能被高并…

SSM東理咨詢交流論壇

&#x1f345;點贊收藏關注 → 添加文檔最下方聯系方式咨詢本源代碼、數據庫&#x1f345; 本人在Java畢業設計領域有多年的經驗&#xff0c;陸續會更新更多優質的Java實戰項目希望你能有所收獲&#xff0c;少走一些彎路。&#x1f345;關注我不迷路&#x1f345; 項目視頻 js…

http的請求體各項解析

一、前言 做Java開發的人員都知道&#xff0c;其實我們很多時候不單單在寫Java程序。做的各種各樣的系統&#xff0c;不管是PC的 還是移動端的&#xff0c;還是為別的系統提供接口。其實都離不開http協議或者https 這些東西。Java作為編程語言&#xff0c;再做業務開發時&#…

gradle生命周期鉤子函數

文章目錄 0. 總結表格1. 構建初始階段gradle.settingsEvaluated()gradle.projectsLoaded() 2. 配置階段gradle.beforeProject()gradle.afterProject()gradle.projectEvaluated()gradle.afterEvaluate()gradle.taskGraph.whenReady 3. 執行階段gradle.taskGraph.beforeTaskgradl…

Qt Enter和HoverEnter事件

介紹 做PC開發的過程中或多或少都會接觸到鼠標的懸停事件&#xff0c;Qt中處理鼠標懸停有Enter和HoverEnter兩種事件 相同點 QEvent::Enter對應QEnterEvent&#xff0c;描述的是鼠標進入控件坐標范圍之內的行為&#xff0c;QEnterEvent可以抓取鼠標的位置&#xff1b;QEvent…

【云安全】云原生-Docker(五)容器逃逸之漏洞利用

漏洞利用逃逸 通過漏洞利用實現逃逸&#xff0c;主要分為以下兩種方式&#xff1a; 1、操作系統層面的內核漏洞 這是利用宿主機操作系統內核中的安全漏洞&#xff0c;直接突破容器的隔離機制&#xff0c;獲得宿主機的權限。 攻擊原理&#xff1a;容器本質上是通過 Linux 的…

如何優化深度學習模型來提高錯別字檢測準確率?

為了優化深度學習模型以提高錯別字檢測的準確率,可以從以下幾個方面入手: 1. 數據增強 數據增強是提高模型泛化能力的有效方法。通過在訓練數據中引入噪聲,模型可以學習到更多變的模式,從而提高對未見數據的識別能力。 刪除字符:以一定概率刪除文本中的一個字符。增加字…