!!!請先閱讀須知!!!
在數位轉型的浪潮下,企業的後端服務日益複雜,如何高效、安全、穩定地管理這些服務成為一個關鍵挑戰。API 網關(API Gateway)作為所有外部請求的統一入口,扮演了至關重要的角色。在眾多 API 網關解決方案中,Apache APISIX 憑藉其高性能、豐富的插件生態和動態配置能力脫穎而出。
本文將從 APISIX 的三個核心概念:路由 (Route)、上游 (Upstream) 和 服務 (Service) 出發,透過建立一個虛擬的「新竹百貨公司」實例,深入淺出地演示如何利用 APISIX 實現流量分發、負載均衡以及服務治理(例如流量限制)。
要理解如何用 APISIX 構建虛擬百貨公司,我們必須先掌握其運作的基石。這三個概念構成了 APISIX 處理請求的完整流程:
路由是 APISIX 中最核心的功能,它決定了網路封包的去留方向。你可以將 Route 想像成道路上的路牌、演唱會的檢票口,或是高速公路的收費站。
新竹百貨公司.com
的請求所建立的規則。它會將所有發送到這個虛擬百貨公司網址的流量都導向我們定義的後端服務群集。上游是一組目的地(Target/Node)的集合。它代表著一組可以提供相同功能的後端服務群。
服務是一組可重複使用的規定或規則的集合。它將一些通用的配置(例如插件配置)進行模組化,以便套用到多個路由上,避免重複設定。
我們將透過一個完整的實作流程,將上述概念具體化,用 APISIX Dashboard(管理介面)來完成配置。
在開始配置 APISIX 之前,我們需要先建立一個能提供服務的「百貨公司」群集。這裡我們使用 http-server
這個簡單的工具來模擬靜態網頁服務。
http-server
: 這是用來快速啟動靜態伺服器的工具。megacity
(巨城), sogo
, fec
(遠東百貨) 等。在每個目錄中放入一個簡單的 HTML 檔案,標註這是哪個分店。# 巨城分店
http-server ./megacity -p 8081
# SOGO分店
http-server ./sogo -p 8082
# 遠東分店
http-server ./fec -p 8083
# ... 其他分店
現在,我們有了多個運行在不同端口($8081, 8082, 8083...$)的後端服務,它們就是我們虛擬百貨公司的不同分店。在 APISIX Dashboard 中,我們將定義「新竹百貨公司」這個集合。
新竹百貨公司
。127.0.0.1:8081
(巨城)127.0.0.1:8082
(SOGO)127.0.0.1:8083
(遠東)透過這個配置,APISIX 就知道當請求到達「新竹百貨公司」這個 Upstream 時,應該要在 $8081, 8082, 8083...$ 這些節點之間進行流量分發。
接下來,我們定義外部請求如何進入這個 Upstream。
新竹百貨公司主路由
。xn--55qx5d0y0ax0p39ed04a.com
(這是「新竹百貨公司.com」的 Punycode 編碼,用於確保瀏覽器兼容)。新竹百貨公司
Upstream。hosts
文件,將 xn--55qx5d0y0ax0p39ed04a.com
指向 APISIX 的運行端口,通常是 $9080$ 或 $9180$。
127.0.0.1 xn--55qx5d0y0ax0p39ed04a.com
http://xn--55qx5d0y0ax0p39ed04a.com:9080/
。光有流量分發還不夠,一個成熟的 API 網關必須具備服務治理的能力,例如限制惡意或過高的請求流量。我們將透過 Service 來實現這個功能。
我們將使用 APISIX 內建的 limit-count
插件來實現流量限制。
高乘載管制
。limit-count
插件。count
: 設定為 $1$ (在指定時間窗內允許的請求次數)。time_window
: 設定為 $60$ (時間窗長度,單位為秒)。key
: 設定為 $remote_addr
(以遠端 IP 地址作為計數依據)。這項配置的含義是:「在 $60$ 秒內,單一 IP 地址 (客戶端) 僅允許成功訪問我們的服務 $1$ 次。」
套用 Service: 修改步驟 3 建立的 新竹百貨公司主路由
。將其原本直接綁定 Upstream 的方式,改為綁定我們新建立的 高乘載管制
Service。
重新測試: 再次訪問 http://xn--55qx5d0y0ax0p39ed04a.com:9080/
。
第一次訪問: 成功看到隨機一家百貨公司的頁面。
立即重新整理(第二次訪問): 你會發現請求被 APISIX 拒絕,並返回一個錯誤提示,例如 $429$ Too Many Requests。
等待 $60$ 秒後訪問: 再次成功訪問。
驗證結果: 我們成功地將限流這個「高乘載管制」規定透過 Service 的形式模組化,並將其套用到了 Route 上。這不僅實現了服務治理,未來如果我們有更多的路由需要相同的限流策略,只需要將其綁定到這個 高乘載管制
Service 即可,極大地提升了配置的效率和維護性。
透過 APISIX 構建「虛擬新竹百貨公司」的實例,我們不僅理解了 Route (路由)、Upstream (上游) 和 Service (服務) 這三個核心概念的職責與協作關係,更實踐了 API 網關的兩大核心功能:
limit-count
),高效地為 Route 批量啟用如限流、認證、日誌等專業功能。APISIX 作為一個高性能的動態 API 網關,它的能力遠不止於此。在實際的生產環境中,它還可以結合更多的插件,例如:
總而言之,掌握 APISIX 的核心概念,就像擁有了數位世界中的交通指揮系統。它能確保虛擬百貨公司(或任何複雜的微服務架構)的請求能夠安全、高效、穩定地到達它們的目的地。
這篇內容完全由人工智慧AI生成,並且幾乎保留原本生成的內容。儘管我大致瀏覽過,小修部分,但不保證內容的正確、可靠性。
這篇的生成做法:是將原始文章「用 APISIX 打造虛擬百貨公司:路由、上游與服務核心三概念 」餵給AI生成摘要,再開新的與AI對話串,提供摘要請AI生成1000~5000技術文章。
|-----------| |-------------| |--------------|
| 原始文章 | ---> | AI摘要 | ----> | AI生成內容 |
|-----------| |-------------| |--------------|
現在的人工智慧AI發展真的很強,這完全是可以以假亂真的完整文章。雖然多少我能感覺AI生成的內容風格,但有可能是我使用的問題,並沒有去做人性化(Humanizer),並且我本來就知道內容是由AI生成的。因此雖然這樣說,但評價可能失準。(這算測不準原理嗎?)
比起「原篇」,其實可以發現缺少一些細節:像是並沒有提供「百貨公司」的HTML內容,畢竟這些部分在摘要生成時就已經遺失了。
另外,AI也不知道系列的其他篇文章,因此很難相互參考引用。但相比來說,AI生成的內容更是獨立完整的。
不過畢竟是概率生成的,多少還是有些地方有問題、奇怪的內容:hosts 文件的設定通常不會指定到服務運行的端口。但可能因為該文字組合的模式出現太多次,AI學到了這麼說:
修改 hosts 文件: 為了讓瀏覽器能找到我們的虛擬網址,我們需要修改本地電腦的 hosts 文件, 將 xn--55qx5d0y0ax0p39ed04a.com 指向 APISIX 的運行端口 ,通常是 $9080$ 或 $9180$。
此外,原篇並沒有在Service再設定Upstream,這可能是AI從其他地方學到的。(但我印象是正確的。我目前很少這樣做)
最後,雖然提供摘要的AI生成內容幾乎是可用的,但摘要的內容形式並不是我平常在註記想法的方式,而平常註記方式餵給AI生成的內容...一言難盡。所以說,我感覺如果要寫成提供給AI的摘要,不如我自己完成文章。