日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

又肝了下微服务 API 网关“金刚”,也是蛮香的~

發布時間:2025/3/21 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 又肝了下微服务 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 整體

?

  • 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 service

② 調用 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 的?upstreamtargetserviceroute?四個對象,一起來簡單小節下:

service + route + upstream + target

?

Kong 組件說明
serviceservice 對應服務,可以直接指向一個 API 服務節點(host?參數設置為 ip + port),也可以指定一個 upstream 實現負載均衡。簡單來說,服務用于映射被轉發的后端 API 的節點集合
routeroute 對應路由,它負責匹配實際的請求,映射到?service?中
upstreamupstream 對應一?API 節點,實現負載均衡
targettarget 對應一?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 基礎維度的限流。

Kong Rate Limiting 01 Kong Rate Limiting 02

?

友情提示:Rate Limiting 插件還支持給?routeconsumer?設置限流配置,胖友可以閱讀《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 插件。

Kong JWT 01 Kong JWT 02

② 使用?curl http://127.0.0.1:8000/demo-api/demo/echo?命令,會被 Kong 安全攔截。返回結果如下:

{"message":"Unauthorized"} “

友情提示:JWT 插件還支持給?routeconsumer?設置 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 01

?

Kong Consumer 02

② 調用 Kong Admin API?consumers/{username}/{plugin},生成該消費者的 JWT 信息:

{username}?路徑參數,為 Consumer 的用戶名。
{plugin}?路徑參數,為 Plugin 的插件名。

$?curl?-i?-X?POST?http://localhost:8001/consumers/yunai/jwt/ {"rsa_public_key":?null,"created_at":?1590943621,"consumer":?{"id":?"8fa7e054-9cda-486f-b611-229bf7780969"},"id":?"1af4ee95-f5fb-484c-97da-b5b205bd07c8","tags":?null,"key":?"VbC63YmEg57fgVSLsKsrBHcVe9nu9XLX","secret":?"xtgiCmCLtF7khq7SoAsrZDfVCQGHk5Pl","algorithm":?"HS256" }
  • 注意?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 网关“金刚”,也是蛮香的~的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。