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