又肝了下微服务 API 网关“金刚”,也是蛮香的~
摘要: 原創出處 http://www.iocoder.cn/Kong/install/ 「芋道源碼」歡迎轉載,保留摘要,謝謝!
-
1. 概述
-
2. 快速安裝
-
3. Kong 控制臺
-
4. 動態負載均衡
-
5. 限流限速
-
6. JWT 身份驗證
-
666. 彩蛋
大家好,我是艿艿,一個很肝的小胖子~
前端時間寫了篇《國產微服務網關 APISIX,有點意思,直接開錘,換掉家門口的 Nginx》文章,有灰常多的留言讓寫寫關于 Kong 的內容,于是乎艿艿又莽了這篇文章~良心如我!
1. 概述
“如下 Kong 簡介的內容,基于 Kong Github、Kong 官方文檔、《API 網關之 Kong 簡介》梳理~
另外也推薦下 Kong 的“競品” APISIX,一款國產的微服務 API 網關,目前已經進入 Apache 中孵化。想要學習的胖友,可以點擊傳送門學習!
Kong 是由 Mashape 公司開源的云原生、高性能、可擴展的微服務 API 網關。它基于 OpenResty 實現,使用 Cassandra 或 PostgreSQL 存儲數據。
Kong Logo?
“-
OpenResty:通過 Lua 擴展 Nginx 實現的可伸縮的 Web 平臺。
-
Cassandra:Key/Value 存儲系統。
-
PostgreSQL:數據庫服務器。
?
-
Kong 提供了?RESTful Admin API,可用于管理員進行 Kong 的配置。
1.1 特性
Kong 網關具有以下的特性:
-
可擴展性:通過簡單地添加更多的服務器,可以輕松地進行橫向擴展,這意味著您的平臺可以在一個較低負載的情況下處理任何請求。
-
模塊化::可以通過添加新的插件進行擴展,這些插件可以通過 RESTful Admin API 輕松配置。
“在 https://docs.konghq.com/hub/ 地址下,可以看到 Kong 內置了豐富的插件。
-
在任何基礎架構上運行:Kong 網關可以在任何地方都能運行。可以在云或內部網絡環境中部署 Kong,包括單個或多個數據中心設置,以及 public,private 或 invite-only APIs。
“在 https://konghq.com/install/ 地址中,可以看到 Kong 支持在各種環境下的安裝。
1.2 架構
Kong 的整體架構如下所示:
Kong 整體架構?
“友情提示:自上往下看哈~注意加粗部分的字!
-
Kong?RESTful 管理 API,提供了 API、API消費者、插件、upstreams、證書等管理。
-
Kong?插件攔截請求/響應,類似于 Java Servlet 中的過濾器,實現請求/響應的 AOP 處理。
-
Kong?數據存儲用于存儲 Kong 集群節點信息、API、消費者、插件等信息,目前提供了 Cassandra 和 PostgreSQL 支持。如果需要高可用,建議使用 Cassandra。
-
Kong?集群中的節點通過 gossip 協議自動發現其它節點。當通過一個 Kong 節點的管理 API 進行一些變更時,也會通知其他節點。每個 Kong 節點的配置信息是會緩存的,例如插件,那么當在某一個 Kong 節點修改了插件配置時,需要通知其他節點配置的變更。
-
Kong 核心基于?OpenResty,使用?Lua?進行請求/響應的處理。
1.3 插件
Kong 內置了豐富的插件,提供了強大的功能以及集成能力,同時我們又可以基于插件機制自行進行拓展。
插件體系?
-
Authentication 身份認證插件:Kong 提供了 Basic Authentication、Key authentication、OAuth2.0 authentication、HMAC authentication、JWT、LDAP authentication 等等實現。
-
Security 安全控制插件:ACL(訪問控制)、CORS(跨域資源共享)、動態SSL、IP 限制、爬蟲檢測等等實現。
-
Traffic Control 流量控制插件:請求限流(基于請求計數限流)、上游響應限流(根據 upstream 響應計數限流)、請求大小限制等等實現。限流支持本地、Redis 和集群三種限流模式。
-
Analytics & Monitoring 分析監控插件:對接 Datadog、Prometheus、Zipkin 等等監控系統的實現。
-
Transformations 協議轉換插件:請求轉換(在轉發到 upstream 之前修改請求)、響應轉換(在 upstream 響應返回給客戶端之前修改響應)。
-
Logging 日志應用插件:支持 TCP、UDP、HTTP、File、Syslog、StatsD、Loggly 等等方式傳輸日志。
-
Serverless 插件:提供對 AWS Lambda、Azure Functions、Apache OpenWhisk、Kong 自帶 Serverless Functions 等等的 ?Serverless 解決方案的支持。
-
Deployment 插件
1.4 請求流程
為了更好地使用 Kong 網關,我們需要理解它處理 API 接口的典型請求工作流程:
請求流程?
Kong 是每個 API 請求的入口點(Endpoint):
-
當 Kong 運行時,每個對 API 的請求將先被 Kong 命中,然后這個請求將會被代理轉發到最終的 API 接口。
-
在請求(Requests)和響應(Responses)之間,Kong 將會執行已經事先安裝和配置好的插件,授權 API 訪問操作。
2. 快速安裝
在《Kong 文檔 —— 安裝》下,官方提供了多種安裝方式,這里我們采用?CentOS?系統。
Kong 安裝方式?
“友情提示:如果胖友會使用 Docker 的話,安裝起來會比較便捷,可參考如下文章:
-
《Kong 與 Konga 之 Docker 部署》
-
《Kong 文檔 —— Docker 方式安裝》
2.1 安裝 PostgreSQL
相比 Cassandra 來說,我們會更加熟悉 PostgreSQL,所以我們采用?PostgreSQL?作為 Kong 的數據存儲。在《Kong 文檔 —— CentOS 安裝》提到,PostgreSQL 最低要求?9.5+?版本,這里我們采用?12?版本。
“友情提示:如下所有的命令行操作,是在?root?用戶下執行。如果胖友使用非?root?用戶,請額外增加?sudo?命令。
2.1.1 安裝
① 打開《PostgreSQL 文檔 —— CentOS 安裝》,選擇 PostgreSQL?12?+ CentOS?7?后獲得安裝方式。如下圖所示:
PostgreSQL 安裝步驟?
② 執行如下命令,進行 PostgreSQL 的安裝:
#?添加?PostgreSQL?的?RPM $?yum?install?https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm#?安裝?PostgreSQL?Server?12 $?yum?install?postgresql12-server#?初始化數據庫 $?/usr/pgsql-12/bin/postgresql-12-setup?initdb PostgreSQL 安裝成功③ 執行如下命令,進行 PostgreSQL 的啟動:
#?設置?PostgreSQL?開機啟動服務 $?systemctl?enable?postgresql-12#?啟動?PostgreSQL?服務 $?systemctl?start?postgresql-12#?查看?PostgreSQL?狀態 $?systemctl?status?postgresql-12 PostgreSQL 啟動成功?
2.1.2 配置
安裝完成之后,會自動創建如下:
-
在 Linux 中,創建一個 Linux 系統用戶?postgres【管理 PostgreSQL 數據庫的系統管理員】。
-
在 PostgreSQL 中,創建 PostgreSQL 用戶?postgres【數據庫超級管理員】,以及數據庫?postgres【用戶?postgres?的默認數據庫】。
① 使用?passwd postgres?命令,我們來初始化下?postgres?用戶的密碼。詳細如下圖所示:
修改?postgres?用戶的密碼② 為了安全以及滿足 Kong 初始化的需求,需要創建一個 Linux 用戶?kong,并創建對應的 PostgreSQL 用戶?kong?和數據庫?kong。操作命令如下:
#?創建一個?Linux?用戶?`kong` $?adduser?kong#?切換到?Linux?系統用戶?`postgres`,因為它是?PostgreSQL?數據庫的系統管理員 $?su?postgres#?進入?PostgreSQL?控制臺 $?psql#?設置用戶?`postgres`?的密碼【僅僅首次需要】 $?\password?postgres?#?注意開頭的?\?必須有!#?創建一個 PostgreSQL 用戶?`kong`,和上面創建的 Linux 用戶?`kong`?對應。 $?create?user?kong?with?password?'123456';?#?密碼?'123456'?根據自己需要,進行隨機生成~ #?創建一個?PostgreSQL?數據庫?`kong` $?create?database?kong?owner?kong; #?將數據庫?`kong`?授權給?PostgreSQL?用戶?`kong` $?grant?all?privileges?on?database?kong?to?kong;#?退出?PostgreSQL?控制臺 $?\q 新建?kong?數據庫③ PostgreSQL 有四種身份認證方式:
“-
trust:凡是連接到服務器的,都是可信任的。只需要提供 PostgreSQL 用戶名,可以沒有對應的操作系統同名用戶。
-
password 和 md5:對于遠程訪問,需要提供 PostgreSQL 用戶名和密碼。對于本地連接,提供 PostgreSQL 用戶名密碼之外,還需要有操作系統訪問權(用操作系統同名用戶驗證)。password 和 md5 的區別,就是遠程訪問時傳輸的密碼是否用 md5 加密。
-
ident:對于遠程訪問,從 ident 服務器獲得客戶端操作系統用戶名,然后把操作系統作為數據庫用戶名進行登錄對于本地連接,實際上使用了 peer。
-
peer:對于本地訪問,通過客戶端操作系統內核來獲取當前系統登錄的用戶名,并作為 PostgreSQL 用戶名進行登錄。
在?/var/lib/pgsql/12/data/pg_hba.conf?文件中,PostgreSQL 可以看到目前的配置情況。如下圖所示:
/var/lib/pgsql/12/data/pg_hba.conf?配置文件(默認)默認配置下,我們無法在本地或者遠程使用 PostgreSQL 用戶名和密碼直接連接,因為本地使用?peer?認證方式,遠程使用?ident?認證方式。解決方法比較簡單,將本地和遠程的認證方式修改成?trust?或者?password?即可。
下面,我們修改?/var/lib/pgsql/12/data/pg_hba.conf?文件,注釋掉所有默認配置,并添加一條?host all all 0.0.0.0/0 trust?默認,無論遠程還是本地訪問,任何 PostgreSQL 用戶和數據庫,都使用?trust?認證方式。最終如下圖所示:
/var/lib/pgsql/12/data/pg_hba.conf?配置文件(修改)?
“友情提示:線上環境,考慮到安全性,建議使用相對細粒度的配置。例如說,將?0.0.0.0/0?修改成指定的內網網段。
修改完成后,執行?sudo systemctl restart postgresql-12?命令,重啟 PostgreSQL 數據庫。重啟完成后,執行?psql -U kong -d kong -h 127.0.0.1 -p 5432?命令,使用 PostgreSQL 用戶名?kong?連接 PostgreSQL 數據庫?kong,又因為是?trust?認證方式,所以無需附帶密碼。
④ 默認配置下,PostgreSQL 只允許本地連接,所以我們需要修改?/var/lib/pgsql/12/data/postgresql.conf?文件,添加?listen_address?配置項為?*,允許遠程連接。如下圖所示:
/var/lib/pgsql/12/data/postgresql.conf?配置文件(修改)修改完成后,執行?sudo systemctl restart postgresql-12?命令,重啟 PostgreSQL 數據庫。重啟完成后,使用 Navicat 了解 PostgreSQL 數據庫,如下圖所示:
Navicat 連接 PostgreSQL 數據庫2.2 安裝 Kong
《Kong 文檔 —— CentOS 安裝》,進行?CentOS?系統下的 Kong 的安裝。
2.2.1 安裝
① 瀏覽器打開 http://docs.konghq.com/install/aws-linux/ 地址,郵件下載 Kong 的 RPM 包。如下圖所示:
Kong RPM 包下載然后,執行?wget?命令,進行 Kong 的 RPM 包的下載。操作命令如下:
$?wget?-O?"kong.rpm"?https://bintray.com/kong/kong-rpm/download_file?file_path=amazonlinux/amazonlinux/kong-2.0.4.aws.amd64.rpm-
其中?-O "kong.rpm"?代表下載文件的命名。
-
最后一串 URL 代表下載文件的地址,
② 執行?yum install kong.rpm --nogpgcheck?命令,進行 Kong 的安裝。
2.2.2 配置
① Kong 的默認配置文件是?/etc/kong/kong.conf.default,使用?cp /etc/kong/kong.conf.default /etc/kong/kong.conf?命令,復制一份新的配置文件。
復制完成后,我們修改?/etc/kong/kong.conf?配置文件,設置使用 PostgreSQL 數據庫。如下圖所示:
/etc/kong/kong.conf?配置文件② 執行?kong migrations bootstrap -c /etc/kong/kong.conf?命令,進行 Kong 的 PostgreSQL 數據庫的表初始化。完成后,使用 Navicat 看到如下表:
初始化 PostgreSQL 表③ 執行?kong start -c /etc/kong/kong.conf?命令,執行 Kong 的啟動。啟動成功時,會看到?Kong started?日志。
默認情況下,Kong 綁定 4 個端口:
-
Proxy?8000:接收客戶端的 HTTP 請求,并轉發到后端的 Upstream。
-
Proxy?8443:接收客戶端的?HTTPS?請求,并轉發到后端的 Upstream。
-
Admin?8001:接收管理員的 HTTP 請求,進行 Kong 的管理。
-
Admin?8444:接收管理員的?HTTPS?請求,進行 Kong 的管理。
簡單測試如下:
#?請求?Proxy?端口 $?curl?http://127.0.0.1:8000 {"message":"no?Route?matched?with?those?values"}? #?因為我們暫時沒配置 Kong 路由。#?請求?Admin?端口 $?curl?http://127.0.0.1:8001 {"plugins":{"enabled_in_cluster":[],"available_on_server":{...?//?省略? #?注意,考慮到安全性,Admin 端口只允許本機訪問。3. Kong 控制臺
Kong 分成免費版和企業版,畢竟都要吃飯的。免費版本的 Kong 是不提供 Kong 的控制臺,只能通過 Kong Admin API 進行 Kong 的維護和管理,顯然非常不方便。所幸開源社區提供了兩個做的不錯的 Kong 控制臺項目:
-
Kong Dashboard,已經有 15 個月左右未維護,不支持 Kong 2.x 版本。
-
Konga,更新頻繁,支持 Kong 2.X 版本。
因此,現在一般采用 Konga 作為 Kong 的控制臺。界面如下圖所示:
Konga 界面?
-
基于 Kong Admin API 管理所有 Kong 的對象。
-
支持從數據庫、文件、API 等遠程數據源導入 Consumer。
-
管理多個 Kong 界面。
-
備份,恢復,通過快照遷移 Kong 節點。
-
通過健康檢查監控 Kong 節點和 API 狀態。
-
支持 Email 和 Slack 消息通知方式。
-
支持多用戶,可以設置不同的權限。
-
支持 MySQL、PostgreSQL、MongoDB 數據庫。
下面,我們來一起進行 Konga 的安裝與學習。
“友情提示:如果胖友會使用 Docker 的話,安裝起來會比較便捷,可參考如下文章:
-
《Kong 與 Konga 之 Docker 部署》
-
《Konga 文檔 —— Production Docker Image》
3.1 安裝 NodeJS 環境
因為 Konga 是基于 NodeJS 開發的項目,所以需要安裝 NodeJS 相關的環境。執行命令如下:
“Node 的安裝,可參考 https://github.com/nodesource/distributions 倉庫。
#?安裝?NodeJS?14.x?和?NPM $?curl?-sL?https://rpm.nodesource.com/setup_12.x?|?bash?- $?yum?install?nodejs?npm?-y#?打印版本 $?node?--version v12.17.0 $?npm?--version 6.14.5#?安裝?gulp、bower、sails $?npm?install?-g?gulp $?npm?install?-g?bower $?npm?install?-g?sails “-
NodeJS:運行在服務端的 JavaScript。
-
npm:npm 是 JavaScript 世界的包管理工具,并且是 NodeJS 平臺的默認包管理工具。通過 npm 可以安裝、共享、分發代碼,管理項目依賴關系。
-
gulp:一個自動化構建工具,開發者可以使用它在項目開發過程中自動執行常見任務。
-
bower:一個針對Web開發的包管理器。該工具主要用來幫助用戶輕松安裝 CSS、JavaScript、圖像等相關包,并管理這些包之間的依賴。
-
sails:NodeJS 的 MVC 框架。
3.2 安裝 Konga
① 克隆 Konga 的源碼,并下載 NodeJS 相關依賴包,并進行操作命令如下:
#?安裝?Git,已安裝可忽略 $?yum?install?git $?git?clone?https://github.com/pantsel/konga.git#?下載?NodeJS?相關依賴包 $?cd?kongga $?npm?i#?解決?bower?相關依賴包 $?npm?run?bower-deps目前 Konga 支持使用 MySQL、PostgreSQL、SQLServer、MongoDB 四種數據庫。下面,我們以?PostgreSQL?作為 Konga 的數據庫舉例子。
② 創建 Konga 的 PostgreSQL 數據庫?konga,命令行操作如下:
#?創建一個?Linux?用戶?`konga` $?adduser?konga#?進入?PostgreSQL?控制臺 #?因為我們切換了?PostgreSQL?的認證方式為?trust?方式,所以可以這樣連接 $?psql?-U?postgres?-h?127.0.0.1?-p?5432#?創建一個 PostgreSQL 用戶?`konga`,和上面創建的 Linux 用戶?`konga`?對應。 $?create?user?konga?with?password?'123456';?#?密碼?'123456'?根據自己需要,進行隨機生成~ #?創建一個?PostgreSQL?數據庫?`konga` $?create?database?konga?owner?konga; #?將數據庫?`konga`?授權給?PostgreSQL?用戶?`konga` $?grant?all?privileges?on?database?konga?to?konga;#?退出?PostgreSQL?控制臺 $?\q 新建?konga?數據庫?
“友情提示:Konga 暫時不支持?12 版本的 PostgreSQL,所以下面艿艿卒了,只是“演示”整個過程。
建議使用?9.x?版本的 PostgreSQL 哈!
③ 執行?cp .env_example .env?命令,復制出?.env?配置文件,接入 PostgreSQL 作為數據庫。配置內容如下:
PORT=1337 NODE_ENV=production KONGA_HOOK_TIMEOUT=120000 DB_ADAPTER=postgres DB_URI=postgresql://konga:123456@localhost:5432/konga KONGA_LOG_LEVEL=warn TOKEN_SECRET=some_secret_token .env?配置文件④ 執行如下命令,初始化 PostgreSQL 數據庫:
$?node?./bin/konga.js?prepare?[--adapter?postgres?--uri?postgresql://konga:123456@127.0.0.1:5432/konga] 初始化 PostgreSQL 數據庫?
“= = 因為艿艿安裝的 PostgreSQL 版本過高,所以后面艿艿臨時先使用 MySQL 作為 Konga 的數據庫。下圖是艿艿使用 MySQL 時候的操作:
MySQL 示例?
最終 PostgreSQL 數據庫?konga?的表如下圖所示:
konga?表⑤ 執行如下命令,啟動 Konga 服務:
$?npm?run?production >?kongadmin@0.14.9?production?/root/konga >?node?--harmony?app.js?--prod默認配置下,Konga 啟動在?1337?端口。
⑥ 使用瀏覽器,訪問 <http://127.0.0.1:1337/> 地址,進入 Konga 首頁。因為 Konga 暫無**默認**管理員,所以自動跳轉創建頁面。如下圖所示: Konga 注冊界面按照自己的喜好,輸入「賬號/郵箱/密碼」進行管理員的創建。創建完成后,重新訪問 http://127.0.0.1:1337/ 地址,進入 Konga 登陸界面。如下圖所示:
Konga 注冊界面輸入「賬號/密碼」登陸 Konga。因為未配置 Kong 的 Admin URL 地址,所以進行添加。如下圖所示:
Konga 初始化 Kong 界面添加完 Admin URL 地址后,我們就可以在?Konga?界面中看到?Kong?的信息。如下圖所示:
Kong 信息至此,我們已經完成了 Konga 的安裝,胖友可以自己點點 Konga 的界面,愉快的玩耍吧~
“旁白君:后續,我們會一邊進行 Kong 的學習,一邊演示在 Konga 中的展示。
4. 動態負載均衡
本小節,我們來實現對后端服務提供的 API 接口進行負載均衡。考慮到方便,艿艿在 https://github.com/YunaiV/SpringBoot-Labs 倉庫提供了一個 Spring Boot 項目?lab-56-demo01,如下圖所示:
Spring Boot 項目最終示例的效果,如下圖所示:
項目效果最終我們使用 Kong 實現負載均衡的效果等同于如下 Nginx 的配置:
upstream demo-upstream {server localhost:18081 weight=100;server localhost:18082 weight=50; }server {listen 80;location /demo-api/ {proxy_pass http://demo-upstream;} }下面,我們來通過 Kong?Admin API?進行上述的負載均衡的配置。
4.1 創建 upstream 和 target
① 調用 Kong Admin API?/upstreams,創建名字為?demo-upstream?的?upstream:
$?curl?-X?POST?http://127.0.0.1:8001/upstreams?--data?"name=demo-upstream" Kong upstream② 調用 Kong Admin API?/upstreams/{upstream}/targets,創建 Spring Boot 項目對應的 2 個?target:
“注意,{upstream}?路徑參數,為 upstream 的名字。
#?端口?18080?對應的?target $?curl?-X?POST?http://127.0.0.1:8001/upstreams/demo-upstream/targets?--data?"target=10.8.8.34:18080"?--data?"weight=100" #?端口?28080?對應的?target $?curl?-X?POST?http://127.0.0.1:8001/upstreams/demo-upstream/targets?--data?"target=10.8.8.34:28080"?--data?"weight=50" “友情提示:艿艿這里 Spring Boot 項目啟動在 IP 為 10.8.8.34 的服務器上。
Kong target③ 如上的配置,效果等同于如下 Nginx 的配置:
upstream demo-upstream {server localhost:18081 weight=100;server localhost:18082 weight=50; }4.2 創建 service 和 route
① 調用 Kong Admin API?/services,創建名字為?demo-service?的?service:
$?curl?-X?POST?http://127.0.0.1:8001/services?--data?"name=demo-service"?--data?"host=demo-upstream"?-
host?參數,用于設置對應的?upstream?的名字。
② 調用 Kong Admin API?services/${service}/routes,創建一個請求路徑為?path?的?route:
“注意,{service}?路徑參數,為 upstream 的名字。
$?curl?-X?POST?http://localhost:8001/services/demo-service/routes?--data?"name=demo-route"?--data?"paths[]=/demo-api" Kong route?
Kong route③ 如上的配置,效果等同于如下 Nginx 的配置:
server {listen 80;location /demo-api/ {proxy_pass http://demo-upstream;} }4.3 簡單測試
不斷執行?curl http://127.0.0.1:8000/demo-api/demo/echo?命令,請求 Kong 網關來負載均衡轉發到后端的 Spring Boot 項目,結果如下:
echo:18080 echo:18080 echo:28080...負載均衡請求到多個節點,符合預期~
4.4 簡單小結
在上面,我們看到了 Kong 的?upstream、target、service、route?四個對象,一起來簡單小節下:
service + route + upstream + target?
| service | service 對應服務,可以直接指向一個 API 服務節點(host?參數設置為 ip + port),也可以指定一個 upstream 實現負載均衡。簡單來說,服務用于映射被轉發的后端 API 的節點集合 |
| route | route 對應路由,它負責匹配實際的請求,映射到?service?中 |
| upstream | upstream 對應一組?API 節點,實現負載均衡 |
| target | target 對應一個?API 節點 |
在 Kong 中,還有 Consumer、Plugin、Tag、Certificate、Target 等等對象,胖友可以閱讀《Kong 文檔 —— Admin API》了解更多。
另外,胖友如果想用 Konga 通過圖形界面來配置,可以參考閱讀《Kong 配置 service 和 route 實現簡單 API 代理》文章。
5. 限流限速
Kong 提供了 Rate Limiting 插件,實現對請求的限流功能,避免過大的請求量過大,將后端服務打掛。
Rate Limiting 支持秒/分/小時/日/月/年多種時間維度的限流,并且可以組合使用。例如說:限制每秒最多 100 次請求,并且每分鐘最多 1000 次請求。
Rate Limiting 支持?consumer、credential、ip?三種基礎維度的限流,默認為?consumer。例如說:設置每個 IP 允許每秒請求的次數。計數的存儲,支持使用?local、cluster、redis?三種方式進行存儲,默認為?cluster:
-
local:存儲在 Nginx 本地,實現單實例限流。
-
cluster:存儲在 Cassandra 或 PostgreSQL 數據庫,實現集群限流。
-
redis:存儲在 Redis 數據庫,實現集群限流。
Rate Limiting 采用的限流算法是計數器的方式,所以無法提供類似令牌桶算法的平滑限流能力。
“友情提示:Kong 企業版提供了 [https://docs.konghq.com/hub/kong-inc/rate-limiting-advanced/](Rate Limiting Advanced) 插件,提供平滑限流的功能,且性能更加優秀。
The Rate Limiting Advanced plugin for Kong Enterprise is a re-engineered version of the incredibly popular Kong Rate Limiting plugin, with greatly enhanced configuration options and performance.
下面,我們在「4. 動態負載均衡」小節的基礎上,對名字為?demo-service?的?service?進行限流。
5.1 創建 Rate Limiting 插件
調用 Kong Admin API?services/${service}/plugins,創建 Rate Limiting 插件的配置:
$?curl?-X?POST?http://127.0.0.1:8001/services/demo-service/plugins?\--data?"name=rate-limiting"??\--data?"config.second=1"?\--data?"config.limit_by=ip"-
name?參數,設置為?rate-limiting?表示使用 Rate Limiting 插件。
-
config.second?參數,設置為 1 表示每秒允許 1 次請求。
-
config.limit_by?參數,設置為?ip?表示使用 IP 基礎維度的限流。
?
“友情提示:Rate Limiting 插件還支持給?route、consumer?設置限流配置,胖友可以閱讀《Kong 文檔 —— Rate Limiting》學習。
5.2 簡單測試
快速使用?curl http://127.0.0.1:8000/demo-api/demo/echo?命令?2?次,會被 Kong 限流,返回結果如下:
{"message":"API?rate?limit?exceeded"}6. JWT 身份驗證
Kong 提供了 JWT 插件,實現使用 JWT 進行認證,保護后端服務的安全性。
可能有胖友不了解 JWT 認證方式,可以先閱讀如下文章:
-
《JSON Web Token - 在Web應用間安全地傳遞信息》
-
《八幅漫畫理解使用 JSON Web Token 設計單點登錄系統》
下面,我們在「4. 動態負載均衡」小節的基礎上,對名字為?demo-service?的?service?進行 JWT 身份認證。
6.1 創建 JWT 插件
① 調用 Kong Admin API?services/${service}/plugins,創建 JWT 插件的配置:
$?curl?-X?POST?http://127.0.0.1:8001/services/demo-service/plugins?\--data?"name=jwt"-
name?參數,設置為?jwt?表示使用 JWT 插件。
② 使用?curl http://127.0.0.1:8000/demo-api/demo/echo?命令,會被 Kong 安全攔截。返回結果如下:
{"message":"Unauthorized"} “友情提示:JWT 插件還支持給?route、consumer?設置 JWT 認證方式,胖友可以閱讀《Kong 文檔 —— JWT》學習。
6.2 創建用戶
① 調用 Kong Admin API?consumers,創建一個 Consumer 消費者(用戶):
$?curl?-i?-X?POST?http://localhost:8001/consumers/?\--data?"username=yunai"-
username?參數,設置用戶名為?yunai。
?
Kong Consumer 02② 調用 Kong Admin API?consumers/{username}/{plugin},生成該消費者的 JWT 信息:
“{username}?路徑參數,為 Consumer 的用戶名。
{plugin}?路徑參數,為 Plugin 的插件名。
-
注意?key?和?secret?的結果,稍后會使用到。
使用 JWT Debugger 功能,生成 JWT?Token。示例如下圖所示:
JWT Debugger 生成 Token③ 重新訪問 http://127.0.0.1:8000/demo-api/demo/echo 地址,帶上剛生成的 JWT?Token。操作命令如下:
$?curl?http://127.0.0.1:8000/demo-api/demo/echo?\-H?"Authorization:?Bearer?eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJWYkM2M1ltRWc1N2ZnVlNMc0tzckJIY1ZlOW51OVhMWCJ9.rbWcXb-c1AwA3haiMWKStOcTCjkgVw1gmYMFeV8In6w" echo:18080成功!美滋滋~
666. 彩蛋
至此,我們已經完成 Kong 的初步學習。想要進一步深入的胖友,除了可以閱讀《Kong 文檔》之外,也可以閱讀如下系列:
-
《Kong(一)簡介及部署》
-
《Kong(二)admin-api(結合實例比官網還詳細)》
-
《Kong(三))Proxy 規則》
-
《Kong(四)負載均衡理論及實現)》
-
《Kong(五)CentOS7 部署 PostgreSQL 和 kong 總結)》
-
《Kong(六)集群搭建部署》
-
《Kong(七)認證》
-
《Kong(八)配置說明》
總結
以上是生活随笔為你收集整理的又肝了下微服务 API 网关“金刚”,也是蛮香的~的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 老板:kill -9 的原理都不知道就敢
- 下一篇: 小姐姐用动图展示 10 大 Git 命令