微服務 API Gateway kong 閘道器實踐及jwt-header外掛開發

maxingyu發表於2021-05-15

環境採用官方docker映象

因為公司使用者授權使用jwt,本文是針對jwt做的一些研究
環境這裡只寫命令不做過多介紹,詳細請看 官方文件

#拉取映象
docker pull kong/kong-gateway:2.3.3.2-alpine
#標記映象方便使用
docker images
docker tag <IMAGE_ID> kong-ee
#建立kong閘道器網路卡
docker network create kong-ee-net
#啟動資料庫
docker run -d --name kong-ee-database \
  --network=kong-ee-net \
  -p 5432:5432 \
  -e "POSTGRES_USER=kong" \
  -e "POSTGRES_DB=kong" \
  -e "POSTGRES_PASSWORD=kong" \
  postgres:9.6
#準備Kong資料庫
docker run --rm --network=kong-ee-net \
  -e "KONG_DATABASE=postgres" \
  -e "KONG_PG_HOST=kong-ee-database" \
  -e "KONG_PG_PASSWORD=kong" \
  -e "KONG_PASSWORD=<SOMETHING-YOU-KNOW>" \
  kong-ee kong migrations bootstrap
#使用Kong Manager啟動閘道器
docker run -d --name kong-ee --network=kong-ee-net \
  -e "KONG_DATABASE=postgres" \
  -e "KONG_PG_HOST=kong-ee-database" \
  -e "KONG_PG_PASSWORD=kong" \
  -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
  -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
  -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
  -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
  -e "KONG_ADMIN_LISTEN=0.0.0.0:8001" \
  -e "KONG_ADMIN_GUI_URL=http://<DNSorIP>:8002" \
  -p 8000:8000 \
  -p 8443:8443 \
  -p 8001:8001 \
  -p 8444:8444 \
  -p 8002:8002 \
  -p 8445:8445 \
  -p 8003:8003 \
  -p 8004:8004 \
  kong-ee

到此環境配置完畢,由於使用的是免費版,官方外掛庫收費的不能使用

檢驗安裝是否正確

curl -i -X GET --url http://<DNSorIP>:8001/services
#HTTP/1.1 200 OK

訪問 http://DNSorIP:8002 這是一個視覺化介面,不做過多介紹
由於是免費版,我們大部分操作都將是使用kong-admin-api新增配置

如何新增一個服務並代理

要注意埠的使用
kong是nginx+lua實現,api閘道器本質上是單一入口做代理到各個服務,從而達到對介面的管控如負載均衡,限流,許可權等
請求工具這裡我採用的是httpie也可使用curl,並且是在mac本地環境

新增服務

  1. http POST :8001/services name=example_service url=’專案地址’
  2. http :8001/services/example_service

ps專案地址可以是http://**.com/**,這樣的好處是可以根據介面字首更細粒度的管控許可權

新增代理路由

  • http :8001/services/example_service/routes paths:='["/mock"]' name=mocking

驗收成果

訪問 http :8000/mock 即為訪問 新增服務標籤內的專案地址

下面將進入jwt外掛的使用

官方jwt詳細文件
由於官方文件並不符合我想要的需求,我的需求是,代理到上游的時候頭部檔案要將jwt:payload_data內如使用者id解析出來放入header內,顯然需要自定義外掛或者修改官方外掛兩個辦法

看官方jwt外掛原始碼

  • claims為jwt:payload_data的解析結果
  • 紅框內就是自定義新增header的程式碼

微服務 API Gateway kong 閘道器實踐及jwt-header外掛開發

自定義開發

由於是容器內須注意,docker exec 需指定root使用者
使用luarocks開發lua元件包
github.com/luarocks/luarocks/wiki/...
luarocks元件庫的jwt-header例項
github.com/yesinteractive/kong-jwt...
除錯可在容器內執行kong reload,通過請求檢視,暫未找到簡易的除錯辦法

有待完善,盡作為筆記使用,可互相交流

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章