iT邦幫忙

2025 iThome 鐵人賽

DAY 7
0
Cloud Native

與雲原生精靈共舞:APISIX使用者的兩年旅程系列 第 7

Ch3 - 用 APISIX 打造虛擬百貨公司:路由、上游與服務核心三概念

  • 分享至 

  • xImage
  •  

國道高乘載管制是交通部高速公路局為提升國道行車安全與效率而實施的措施,要求車輛乘載人數達到一定標準才能通行......

國道實施高乘載管制路段及時段內,僅下列之車輛可駛入,其餘未於表列之車輛一律禁止進入

  1. 乘載3人(含)以上(含駕駛及小孩)之小型車
  2. 駕駛或乘客持有身心障礙證明之小型車
  3. 駕駛或乘客持有孕婦證明之小型車(同時出示孕婦健康手冊及附照片身分證明)

-- 節錄自高速公路資訊網。取用日期:2025-09-07

先回到Quick Start中建立的Dashboard服務的Web畫面,在左邊選單上有這麼些選項:Route(路由)、Upstream(上游)、Service(服務)。
要使用APISIX,首先需要先了解這三個概念。特別是路由部分最爲重要。

https://ithelp.ithome.com.tw/upload/images/20250921/20112470i8JkALsLu7.png

就像是「什麼是API網關」中介紹的,APISIX最重要的任務,就是決定第7層HTTP網路封包的去留方向。而路由就有點像是在建立檢票口、收費站;也有點像是在設定路牌、命名路名、還有添加交通號誌。

可以這麼想像:現在建立一個新竹地區百貨公司的方向牌。這就是建立一個路由。

高速公路急轉彎

那麼有來的封包、有路牌,那也應該要至少有個目的地,甚至可以不止一個目的地。新竹地區的百貨公司並不是只有一家,有新竹巨城、新竹SOGO、新竹大遠百,還有竹北大遠百。如果目的地是要去新竹地區百貨公司,這些目標都在這個集合內。這個目的地集合叫做上游(Upstream),而實際目的地叫做目標(Target)或節點(Node)。(有時候上游可能也就直接指上游節點)

https://ithelp.ithome.com.tw/upload/images/20250921/20112470Rlqp1Hu87N.png

最後,服務(Service)就像是一組可重複用於不同路由的規定,特定路由可能有特定的規則(可透過透過Plugin實現),但有些時候需要的規則其實是相似的,「不要重複造輪子」能夠抽取出來共用最好。就像是當實施國道高乘載管制時,一般不會僅有一個地方實施,而是多個路段一起實施。

實際建立

前置作業 - 安裝 http-server

先透過Node.js安裝http-server,以建立簡易的靜態網頁伺服器。

npm i -g http-server

建立百貨公司

建立百貨公司服務目錄:

mkdir 竹北大遠百 新竹大遠百 新竹巨城 新竹SOGO 

新竹百貨公司
(圖片修改自原作者:T Gordon ChengRick888chenRick888chen)

然後在每個資料夾下建立index.html,並輸入以下內容,以及調整百貨公司名稱:

<!doctype html>
<html lang="zh-Hant">
  <head>
    <meta charset="UTF-8"/>
    <title>新竹巨城</title>
  </head>
  <body>
    <h1>歡迎來到「新竹巨城」</h1>
  </body>
</html>

百貨公司開店

在每個百貨公司下啓動http-server:

http-server ./

https://ithelp.ithome.com.tw/upload/images/20250921/20112470uxgodMSMgK.png

以下開店例子:

百貨公司名稱 監聽端口
新竹巨城 8081
新竹SOGO 8082
新竹大遠百 8083
竹北大遠百 8084

設定上游群集

開啓APISIX Dashboard管理介面,在選單找到Upstream,然後建立一個新的上游群集「新竹百貨公司」,並這麼填入:

https://ithelp.ithome.com.tw/upload/images/20250921/20112470r8SW5X8ocs.png

欄位 內容
Name 新竹百貨公司
Target Host: 127.0.0.1:8081
Host: 127.0.0.1:8082
Host: 127.0.0.1:8083
Host: 127.0.0.1:8084

由於之前APISIX是由Docker啓動的容器,因此實際上IP應該要改成本機位置。例如192.168.56.3

建立路由規則

然後同樣在APISIX Dashboard管理介面,找到Route設定並建立新路由「新竹百貨公司」。

欄位 內容
Name 新竹百貨公司
Host xn--55qx5d0y0ax0p39ed04a.com
Path /*
Priority 大於0的整數。(如果仍保留quick start建立的httpbin路由則需要調整)

https://ithelp.ithome.com.tw/upload/images/20250921/20112470mh11kf3wGC.png

然後在下一步的上游設定,找到「新竹百貨公司」的上游群集完成建立。

https://ithelp.ithome.com.tw/upload/images/20250921/201124705SA4tPALkh.png

拜訪「新竹百貨公司」

在上一步設定的路由中,指定Host爲xn--55qx5d0y0ax0p39ed04a.com,這是透過punycode編碼的中文域名「新竹百貨公司.com」。這就像是路牌一樣,通常會由DNS伺服器提供這個路牌的詳細資訊,但這次實驗,我們透過修改hosts文件來達成這一目的。在hosts文件添加:

127.0.0.1   xn--55qx5d0y0ax0p39ed04a.com

然後在瀏覽器瀏覽 http://新竹百貨公司.com:9080/ ,你可以重新整理幾次頁面看看,會發現每次都到了不同的新竹百貨公司。

https://ithelp.ithome.com.tw/upload/images/20250921/20112470ed4UJSXNOF.png

https://ithelp.ithome.com.tw/upload/images/20250921/20112470EzMnbeE3ci.png

https://ithelp.ithome.com.tw/upload/images/20250921/20112470adYYZzjuov.png

https://ithelp.ithome.com.tw/upload/images/20250921/20112470ql0jSprsVm.png

建立「高乘載管制」規定

在APISIX Dashboard管理介面,找到Service設定並建立新服務「高乘載管制」。

https://ithelp.ithome.com.tw/upload/images/20250921/20112470hzHKArjhfn.png

並在Plugin啓用limit-count設定:

https://ithelp.ithome.com.tw/upload/images/20250921/20112470YOHMJAfbtM.png

count: 1
time_window: 60
key_type: var
key: remote_addr
rejected_code: 429
rejected_msg: 高乘載管制
policy: local
allow_degradation: false
show_limit_quota_header: true

要在Dashboard上顯示limit-count的Plugin,需要調整apisix_dashboard_config/config.yaml,添加:

plugins:                          # plugin list (sorted in alphabetical order)
  - limit-conn
  - limit-count
  - limit-req

套用「高乘載管制」

在重新調整「新竹百貨公司」路由,增加指定使用「高乘載管制」服務(路由也有Plugin設定,也就是特定路由可以有自己的交通規則):

https://ithelp.ithome.com.tw/upload/images/20250921/20112470biQTGmnxaQ.png

現在如果過於常逛新竹百貨公司,就可能被暫時拒於門外。

https://ithelp.ithome.com.tw/upload/images/20250921/20112470uUXThGgY5Q.png


上一篇
Ch2 - 什麼是API網關?API網關的角色:網路數據流的守門人
系列文
與雲原生精靈共舞:APISIX使用者的兩年旅程7
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言