1.Kong 介紹
Kong 是一款基于 OpenResty(Nginx + Lua 模塊)編寫(xiě)的高可用潮峦、易擴(kuò)展的酱床,由 Mashape 公司開(kāi)源的 API Gateway 項(xiàng)目除呵。Kong 是基于 NGINX 和 Apache Cassandra 或 PostgreSQL 構(gòu)建的吼渡,能提供易于使用的 RESTful API 來(lái)操作和配置 API 管理系統(tǒng)宋彼,所以它可以水平擴(kuò)展多個(gè) Kong 服務(wù)器酷誓,通過(guò)前置的負(fù)載均衡配置把請(qǐng)求均勻地分發(fā)到各個(gè) Server赫悄,來(lái)應(yīng)對(duì)大批量的網(wǎng)絡(luò)請(qǐng)求原献。
官網(wǎng): https://konghq.com/
Kong 主要有三個(gè)組件:
Kong Server :基于 nginx 的服務(wù)器馏慨,用來(lái)接收 API 請(qǐng)求。
Apache Cassandra/PostgreSQL :用來(lái)存儲(chǔ)操作數(shù)據(jù)姑隅。
Kong dashboard:官方推薦 UI 管理工具写隶,當(dāng)然,也可以使用 restfull 方式 管理 admin api讲仰。
Kong 采用插件機(jī)制進(jìn)行功能定制慕趴,插件集(可以是 0 或 N 個(gè))在 API 請(qǐng)求響應(yīng)循環(huán)的生命周期中被執(zhí)行。插件使用 Lua 編寫(xiě)鄙陡,目前已有幾個(gè)基礎(chǔ)功能:HTTP 基本認(rèn)證冕房、密鑰認(rèn)證、CORS(Cross-Origin Resource Sharing趁矾,跨域資源共享)耙册、TCP、UDP毫捣、文件日志详拙、API 請(qǐng)求限流、請(qǐng)求轉(zhuǎn)發(fā)以及 Nginx 監(jiān)控蔓同。
1.1 Kong 網(wǎng)關(guān)的特性
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 輕松配置;
在任何基礎(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冷冗。
1.2 Kong 網(wǎng)關(guān)架構(gòu)
Kong 核心基于 OpenResty 構(gòu)建,實(shí)現(xiàn)了請(qǐng)求/響應(yīng)的 Lua 處理化惑艇;
Kong 插件攔截請(qǐng)求/響應(yīng)蒿辙;
Kong Restful 管理 API 提供了 API/API 消費(fèi)者/插件的管理;
數(shù)據(jù)中心用于存儲(chǔ) Kong 集群節(jié)點(diǎn)信息滨巴、API思灌、消費(fèi)者、插件等信息恭取,目前提供了 PostgreSQL 和 Cassandra 支持泰偿,如果需要高可用建議使用 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)配置的變更晋南。
2.Kong 環(huán)境搭建
2.1 基于 centos7 搭建
環(huán)境: PostgreSQL 9.6 + CentOS 7
2.1.1 PostgreSQL
下載地址:https://www.postgresql.org/download/linux/redhat/
安裝命令
選擇 PostgreSQL 9.6 + CentOS 7 后獲得安裝方式:
啟動(dòng) postgresql 后查看狀態(tài):
配置 postgresql
為了安全以及滿足 Kong 初始化的需求,需要?jiǎng)?chuàng)建一個(gè) Linux 用戶 kong羔砾,并創(chuàng)建對(duì)應(yīng)的 PostgreSQL 用戶 kong 和數(shù)據(jù)庫(kù) kong
# 創(chuàng)建一個(gè) Linux 用戶 `kong`
復(fù)制代碼
PostgreSQL 有四種身份認(rèn)證方式:
trust:凡是連接到服務(wù)器的负间,都是可信任的。只需要提供 PostgreSQL 用戶名姜凄,可以沒(méi)有對(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)行登錄脆粥。
默認(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/9.6/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)證方式柑爸。
默認(rèn)配置下,PostgreSQL 只允許本地連接盒音,所以我們需要修改 /var/lib/pgsql/9.6/data/postgresql.conf 文件表鳍,添加 listen_address 配置項(xiàng)為 *馅而,允許遠(yuǎn)程連接。
修改完成后进胯,執(zhí)行 sudo systemctl restart postgresql-9.6 命令用爪,重啟 PostgreSQL 數(shù)據(jù)庫(kù)。
通過(guò) Navicat 可以連接到 postgresql 數(shù)據(jù)庫(kù):
2.1.2 安裝 kong
centos7 下安裝 kong:
https://download.konghq.com/gateway-1.x-centos-7/Packages/k/
安裝命令
sudo yum install kong-1.5.1.el7.amd64.rpm </code>
復(fù)制代碼
配置 kong
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ù)。
執(zhí)行 kong migrations bootstrap -c /etc/kong/kong.conf 命令就缆,進(jìn)行 Kong 的 PostgreSQL 數(shù)據(jù)庫(kù)的表初始化帖渠。
navicat 中可以看到表信息
執(zhí)行 kong start -c /etc/kong/kong.conf 命令,執(zhí)行 Kong 的啟動(dòng)竭宰。
<code data-type="codeline">#啟動(dòng)命令</code><code data-type="codeline">kong start -c /etc/kong/kong.conf </code><code data-type="codeline"># 停止命令</code><code data-type="codeline">kong stop</code><code data-type="codeline"># 重新加載kong</code><code data-type="codeline">kong reload</code></pre>
復(fù)制代碼
啟動(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 的管理。
# 請(qǐng)求 Proxy 端口
復(fù)制代碼
2.2 基于 docker 搭建
前提:準(zhǔn)備好 docker 環(huán)境
Kong 安裝有兩種方式一種是沒(méi)有數(shù)據(jù)庫(kù)依賴的 DB-less 模式励背,另一種是 with a Database 模式春霍。我們這里使用第二種帶 Database 的模式,因?yàn)檫@種模式功能更全叶眉。
2.2.1 docker 安裝 Kong
構(gòu)建 Kong 的容器網(wǎng)絡(luò)
首先我們創(chuàng)建一個(gè) Docker 自定義網(wǎng)絡(luò)终畅,以允許容器相互發(fā)現(xiàn)和通信。在下面的創(chuàng)建命令中 kong-net
是我們創(chuàng)建的 Docker 網(wǎng)絡(luò)名稱竟闪,當(dāng)然你可以使用你認(rèn)為合適的名稱离福。
docker network create kong-net
復(fù)制代碼
搭建數(shù)據(jù)庫(kù)環(huán)境
Kong 目前使用 Cassandra(Facebook 開(kāi)源的分布式的 NoSQL 數(shù)據(jù)庫(kù)) 或者 PostgreSql,你可以執(zhí)行以下命令中的一個(gè)來(lái)選擇你的 Database。請(qǐng)注意定義網(wǎng)絡(luò) --network=kong-net
炼蛤。
- Cassandra 容器:
<code data-type="codeline">docker run -d --name kong-database \</code><code data-type="codeline"> --network=kong-net \</code><code data-type="codeline"> -p 9042:9042 \</code><code data-type="codeline"> cassandra:3</code></pre>
復(fù)制代碼
- PostgreSQL 容器:
<code data-type="codeline">docker run -d --name kong-database \</code><code data-type="codeline"> --network=kong-net \</code><code data-type="codeline"> -p 5432:5432 \</code><code data-type="codeline"> -e "POSTGRES_USER=kong" \</code><code data-type="codeline"> -e "POSTGRES_DB=kong" \</code><code data-type="codeline"> postgres:9.6</code>
復(fù)制代碼
這里有個(gè)小問(wèn)題妖爷。如果你使用的是 PostgreSQL,想掛載卷持久化數(shù)據(jù)到宿主機(jī)。通過(guò) -v
命令是不好用的絮识。這里推薦你使用 docker volume create
命令來(lái)創(chuàng)建一個(gè)掛載绿聘。
docker volume create kong-volume
復(fù)制代碼
然后上面的 PostgreSQL 就可以通過(guò) - v kong-volume:/var/lib/postgresql/data
進(jìn)行掛載了。
<code data-type="codeline">docker run -d --name kong-database \</code><code data-type="codeline"> --network=kong-net \</code><code data-type="codeline"> -p 5432:5432 \</code><code data-type="codeline"> -v kong-volume:/var/lib/postgresql/data \</code><code data-type="codeline"> -e "POSTGRES_USER=kong" \</code><code data-type="codeline"> -e "POSTGRES_DB=kong" \</code><code data-type="codeline"> -e "POSTGRES_PASSWORD=kong" \</code><code data-type="codeline"> postgres:9.6</code>
初始化或者遷移數(shù)據(jù)庫(kù)
我們使用 docker run --rm
來(lái)初始化數(shù)據(jù)庫(kù)次舌,該命令執(zhí)行后會(huì)退出容器而保留內(nèi)部的數(shù)據(jù)卷(volume)熄攘。
<code data-type="codeline">docker run --rm \</code><code data-type="codeline"> --network=kong-net \</code><code data-type="codeline"> -e "KONG_DATABASE=postgres" \</code><code data-type="codeline"> -e "KONG_PG_HOST=kong-database" \</code><code data-type="codeline"> -e "KONG_PG_PASSWORD=kong" \</code><code data-type="codeline"> -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \</code><code data-type="codeline"> kong:latest kong migrations bootstrap</code>
navicat 中可以看到表信息
啟動(dòng) Kong 容器
完成初始化或者遷移數(shù)據(jù)庫(kù)后,我們就可以啟動(dòng)一個(gè)連接到數(shù)據(jù)庫(kù)容器的 Kong 容器彼念,請(qǐng)務(wù)必保證你的數(shù)據(jù)庫(kù)容器啟動(dòng)狀態(tài)挪圾,同時(shí)檢查所有的環(huán)境參數(shù) -e
是否是你定義的環(huán)境。
<code data-type="codeline"> --network=kong-net \</code><code data-type="codeline"> -e "KONG_DATABASE=postgres" \</code><code data-type="codeline"> -e "KONG_PG_HOST=kong-database" \</code><code data-type="codeline"> -e "KONG_PG_PASSWORD=kong" \</code><code data-type="codeline"> -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \</code><code data-type="codeline"> -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \</code><code data-type="codeline"> -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \</code><code data-type="codeline"> -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \</code><code data-type="codeline"> -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \</code><code data-type="codeline"> -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \</code><code data-type="codeline"> -p 8000:8000 \</code><code data-type="codeline"> -p 8443:8443 \</code><code data-type="codeline"> -p 8001:8001 \</code><code data-type="codeline"> -p 8444:8444 \</code><code data-type="codeline"> kong:latest</code></pre>
驗(yàn)證
可通過(guò) curl -i http://192.168.65.200:8001/
或者瀏覽器調(diào)用 http://192.168.65.200:8001/ 來(lái)驗(yàn)證 Kong Admin 是否聯(lián)通 逐沙。
2.3 安裝 Kong 管理 UI
Kong 企業(yè)版提供了管理 UI哲思,開(kāi)源版本是沒(méi)有的。但是有很多的開(kāi)源的管理 UI 吩案,其中比較好用的是 Konga棚赔。項(xiàng)目地址: https://github.com/pantsel/konga
Konga 主要是用 AngularJS 寫(xiě)的,運(yùn)行于 nodejs 服務(wù)端徘郭。具有以下特性:
管理所有 Kong Admin API 對(duì)象靠益。
支持從遠(yuǎn)程源(數(shù)據(jù)庫(kù),文件残揉,API 等)導(dǎo)入使用者捆毫。
管理多個(gè) Kong 節(jié)點(diǎn)。使用快照備份冲甘,還原和遷移 Kong 節(jié)點(diǎn)。
使用運(yùn)行狀況檢查監(jiān)視節(jié)點(diǎn)和 API 狀態(tài)途样。
支持電子郵件和閑置通知江醇。
支持多用戶。
易于數(shù)據(jù)庫(kù)集成(MySQL何暇,postgresSQL陶夜,MongoDB,SQL Server)裆站。
docker volume create konga-postgresql
<code data-type="codeline">docker run -d --name konga-database \</code><code data-type="codeline"> --network=kong-net \</code><code data-type="codeline"> -p 5433:5432 \</code><code data-type="codeline"> -v konga-postgresql:/var/lib/postgresql/data \</code><code data-type="codeline"> -e "POSTGRES_USER=konga" \</code><code data-type="codeline"> -e "POSTGRES_DB=konga" \</code><code data-type="codeline"> -e "POSTGRES_PASSWORD=konga" \</code><code data-type="codeline"> postgres:9.6</code>
初始化 PostgreSQL 數(shù)據(jù)庫(kù)
<code data-type="codeline">docker run --rm --network=kong-net \</code><code data-type="codeline"> pantsel/konga:latest -c prepare -a postgres -u postgres://konga:konga@konga-database:5432/konga</code>
復(fù)制代碼
相關(guān)命令解讀:
到此 Konga 的數(shù)據(jù)庫(kù)環(huán)境就搞定了条辟,通過(guò) Navicat 可以查看到 konga 數(shù)據(jù)庫(kù)及其數(shù)據(jù)表。
環(huán)境參數(shù)
Konga 還有一些可配置的環(huán)境參數(shù):
啟動(dòng) Konga
通過(guò)以下命令就可以啟動(dòng) Konga 容器了
<code data-type="codeline">docker run -d -p 1337:1337 \</code><code data-type="codeline"> --network kong-net \</code><code data-type="codeline"> -e "DB_ADAPTER=postgres" \</code><code data-type="codeline"> -e "DB_URI=postgres://konga:konga@konga-database:5432/konga" \</code><code data-type="codeline"> -e "NODE_ENV=production" \</code><code data-type="codeline"> -e "DB_PASSWORD=konga" \</code><code data-type="codeline"> --name konga \</code><code data-type="codeline"> pantsel/konga</code>
運(yùn)行完后宏胯,如果成功可以通過(guò) http://192.168.65.200:1337/ 鏈接到控制臺(tái)羽嫡。
通過(guò)注冊(cè)后進(jìn)入,然后在 dashboard 面板里面添加 Kong 的管理 Api 路徑 http://ip:8001
3. Kong 快速開(kāi)始
3.1 動(dòng)態(tài)負(fù)載均衡實(shí)現(xiàn)
nginx 下負(fù)載均衡配置
upstream tulingmall-product-upstream {
復(fù)制代碼
通過(guò) Kong Admin API 進(jìn)行上述的負(fù)載均衡的配置
https://docs.konghq.com/enterprise/2.4.x/admin-api/
創(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=tulingmall-product-upstream"
調(diào)用 Kong Admin API /upstreams/{upstream}/targets
杭棵,創(chuàng)建 tulingmall-product 服務(wù)對(duì)應(yīng)的 2 個(gè) target 。注意氛赐, {upstream}
路徑參數(shù)為 upstream 的名字魂爪。
<code data-type="codeline"># 192.168.65.190:8866 對(duì)應(yīng)的 target</code><code data-type="codeline">$ curl -X POST http://127.0.0.1:8001/upstreams/tulingmall-product-upstream/targets --data "target=192.168.65.190:8866" --data "weight=100"</code><code data-type="codeline"># 192.168.65.190:8867 對(duì)應(yīng)的 target</code><code data-type="codeline">$ curl -X POST http://127.0.0.1:8001/upstreams/tulingmall-product-upstream/targets --data "target=192.168.65.190:8867" --data "weight=100"</code>
創(chuàng)建 service 和 route
調(diào)用 Kong Admin API /services
先舷,創(chuàng)建名字為 tulingmall-product
的 service 烈拒。host 參數(shù)嫂丙,用于設(shè)置對(duì)應(yīng)的 upstream 的名字。
curl -X POST http://127.0.0.1:8001/services --data "name=tulingmall-product" --data "host=tulingmall-product-upstream" --data "path=/pms"
調(diào)用 Kong Admin API services/${service}/routes
惠险,創(chuàng)建一個(gè)請(qǐng)求路徑為 path
的 route 撩笆。注意捺球, {service}
路徑參數(shù),為 service 的名字浇衬。
curl -X POST http://localhost:8001/services/tulingmall-product/routes --data "name=tulingmall-product-route" --data "paths[]=/pms"
復(fù)制代碼
測(cè)試
curl http://127.0.0.1:8000/pms/productInfo/42
3.2 kong 限流配置
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ú)法提供類似令牌桶算法的平滑限流能力正什。
配置 Rate Limiting 插件
調(diào)用 Kong Admin API services/${service}/plugins
,創(chuàng)建 Rate Limiting 插件的配置:
# 服務(wù)上啟用插件
name
參數(shù)号杏,設(shè)置為rate-limiting
表示使用 Rate Limiting 插件埠忘。config.second
參數(shù),設(shè)置為 1 表示每秒允許 1 次請(qǐng)求。-
config.limit_by
參數(shù)莹妒,設(shè)置為ip
表示使用 IP 基礎(chǔ)維度的限流名船。也可以通過(guò) konga UI 操作添加 rate-limiting 插件
測(cè)試
請(qǐng)求超過(guò)閾值,會(huì)被 kong 限流
3.3 Basic Auth 身份認(rèn)證
配置 Basic Auth 插件
# 在服務(wù)上配置插件
通過(guò) konga UI 為路由添加 basic-auth 插件
創(chuàng)建用戶并添加 Basic 憑證
測(cè)試
3.4 JWT 身份認(rèn)證
配置 JWT 插件
調(diào)用 Kong Admin API services/${service}/plugins
旨怠,創(chuàng)建 JWT 插件的配置:
<code data-type="codeline">curl -X POST http://127.0.0.1:8001/services/tulingmall-product/plugins \</code><code data-type="codeline"> --data "name=jwt"</code>
-
name
參數(shù)渠驼,設(shè)置為jwt
表示使用 JWT 插件。
# 查看插件列表
復(fù)制代碼
通過(guò) konga UI 操作添加 jwt
插件
測(cè)試
請(qǐng)求被 kong 安全攔截
創(chuàng)建 Consumer
調(diào)用 Kong Admin API consumers
鉴腻,創(chuàng)建一個(gè) Consumer 消費(fèi)者:
<code data-type="codeline">$ curl -i -X POST http://localhost:8001/consumers/ \</code><code data-type="codeline"> --data "username=fox"</code>
創(chuàng)建 consumer 的 jwt 憑證
調(diào)用 Kong Admin API consumers/{username}/{plugin}
迷扇, 生成 該消費(fèi)者的 JWT 信息:
{username}
路徑參數(shù),為 Consumer 的用戶名爽哎。{plugin}
路徑參數(shù)蜓席,為 Plugin 的插件名。
可以指定算法 algorithm
课锌, iss
簽發(fā)者 key
厨内,密鑰 secret
,也可以省略渺贤,會(huì)自動(dòng)生成雏胃。
<code data-type="codeline">$ curl -i -X POST http://localhost:8001/consumers/fox/jwt/ \</code><code data-type="codeline">-d "algorithm=HS256" \</code><code data-type="codeline">-d "key=fox123" \</code><code data-type="codeline">-d "secret=uFLMFeKPPL525ppKrqmUiT2rlvkpLc9u"</code>
復(fù)制代碼
<code data-type="codeline">{</code><code data-type="codeline"> "rsa_public_key":null,</code><code data-type="codeline"> "algorithm":"HS256",</code><code data-type="codeline"> "id":"3dc4d177-8a7a-4edc-bc88-ee7aa2447fc7",</code><code data-type="codeline"> "tags":null,</code><code data-type="codeline"> "consumer":{</code><code data-type="codeline"> "id":"8e7fb82d-68ef-4f2b-a30c-613866378525"</code><code data-type="codeline"> },</code><code data-type="codeline"> "secret":"uFLMFeKPPL525ppKrqmUiT2rlvkpLc9u",</code><code data-type="codeline"> "created_at":1625803149,</code><code data-type="codeline"> "key":"fox123"</code><code data-type="codeline">}</code>
復(fù)制代碼
查看 fox 的 jwt 憑證
curl -X GET localhost:8001/consumers/fox/jwt
復(fù)制代碼
生成 jwt token
業(yè)務(wù)服務(wù)器根據(jù) kong
生成的 jwt
憑證中的 algorithm、key(iss)志鞍、secret
進(jìn)行 token
的演算和下發(fā)瞭亮。請(qǐng)求 鑒權(quán)接口
需攜帶 Authorization: Bearer jwt
進(jìn)行請(qǐng)求。測(cè)試可以在 https://jwt.io/ 中通過(guò) Debugger 生成 jwt token
獲取到 jwt token 令牌:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJpc3MiOiJmb3gxMjMifQ.hqHGVujYheALxXpEVtgisA5pPTGfQYet0IKadnYPtj8
復(fù)制代碼
測(cè)試
<code data-type="codeline">curl http://192.168.65.200:8000/pms/productInfo/42 \</code><code data-type="codeline"> -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJpc3MiOiJmb3gxMjMifQ.hqHGVujYheALxXpEVtgisA5pPTGfQYet0IKadnYPtj8"</code>
復(fù)制代碼
3.5 黑白名單配置
配置插件
# 在服務(wù)上啟用插件
復(fù)制代碼
config.whitelist :白名單固棚,逗號(hào)分隔的 IPs 或 CIDR 范圍统翩。
config.blacklist :白名單,逗號(hào)分隔的 IPs 或 CIDR 范圍此洲。
<code data-type="codeline">curl -X POST http://127.0.0.1:8001/routes/ad515a07-bae4-4b54-a927-35bc6c85565b/plugins \</code><code data-type="codeline"> --data "name=ip-restriction" \</code><code data-type="codeline"> --data "config.whitelist=192.168.65.200"</code>
復(fù)制代碼
測(cè)試
當(dāng)前本機(jī)器 IP 地址為: 192.168.65.103
將本機(jī) ip 加入到白名單