1. kong介紹
Kong是一款基于OpenResty(Nginx+Lua模塊)編寫的高可用、易擴展的,由Mashape公司開源的API Gateway項目。Kong是基于NGINX和Apache Cassandra或PostgresQL構建的,能據供易于使用的RSTTAP[來操作和配置API管理系統,所以它可以水平擴展多個Kong服務器,通過前置的負載均衡配置把請求均勻地分發到名今Senver,來應對大批量的網絡請求。
2. Kong 架構
- 組件架構
1. Kong server:基于nginx服務器,用來接收api請求
2. Apache cassandra/postgresql 存儲數據。
3. Kong dashboard: 官方推薦ul管理工具,
Kong采用插件機制進行功能定制,插件集(可以0或N個)在API請求響應循環的生命周期中被執行。插件使用Lua編寫,目前已有幾個基礎功能:HTTP基本認證、密鑰認證、CORs(Cross-Origin Resource sharing,跨域資源共享)、TCP、UDP、文件日志、API請求限流、請求轉發以及Nginx監控。
2. 網關架構
- RESTFul APis--------->管理api的入口
- Kong 插件層--------->基于lua語言開發,支持第三方插件,攔截請求/響應生命周期
- 集群&數據存儲
- OPenResty--------->kong 網關的底層引擎,提供響應周期的hooks,對nginx服務進行擴容
- Nginx
- Kong核心基于OpenResty構建,實現了請求/響,應的Lua處理化,
- Kong插件攔截請求/響應;
- Kong Restful 管理AP!提供了APIAPI消費者/插件的管理:
- 數據中心用于存儲Kong集群節點信息、AP1、消費者、插件等信息,目前提供了PostgresQL和Cassandra支持,如果需要高可用建議使用Cassandra;
- Kong集群中的節點通過gossip協議自動發現其他節點,當通過一個Kong節點的管理AP!進行一些變更時也會通知其他節點。每個Kong節點的配置信息是會緩存的,如插件,那么當在某一個Kong節點修改了插件配置時,需要通知其他節點配置的變更。
3. kong的安裝使用
https://blog.csdn.net/qq_39962403/article/details/135777218
官方安裝說明文檔
https://docs.konghq.com/gateway/latest/ #kong版本說明
https://docs.konghq.com/gateway/3.6.x/install/linux/rhel/ #安裝luninx版本
https://docs.konghq.com/gateway/3.6.x/install/docker/ #docker安裝
https://www.postgresql.org/download/linux/redhat/ #pgsql安裝說明
安裝kong數據
docker network create kong-net
docker run -d --name kong-database \--network=kong-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-net \-e "KONG_DATABASE=postgres" \-e "KONG_PG_HOST=kong-database" \-e "KONG_PG_USER=kong" \-e "KONG_PG_PASSWORD=kong" \-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \kong:2.0.3 kong migrations bootstrap
安裝kong服務
docker run -d --name kong \--network=kong-net \-e "KONG_DATABASE=postgres" \-e "KONG_PG_HOST=kong-database" \-e "KONG_PG_USER=kong" \-e "KONG_PG_PASSWORD=kong" \-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \-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, 0.0.0.0:8444 ssl" \-p 8000:8000 \-p 8443:8443 \-p 8001:8001 \-p 8444:8444 \kong:2.0.3
驗證
http://172.16.226.7:8001/
**默認情況下kong 綁定了四個4端口
- Proxy 8000: 接收客戶端的http請求,并轉發到后端的upstream
- Proxy 8443: 接收客戶端的https請求,并轉發到后端的upstream
- admin 8001: 接收管理員的http請求,進行kong的管理
- admin 8444:接收管理員的https請求,進行kong的管理**
安裝kong-ui控制臺
docker volume create konga-postgresql
安裝kong-ui數據看
docker run -d --name konga-database \--network=kong-ee-net \-p 5433:5432 \-v konga-postgresql:/var/lib/postgresql/data \-e "POSTGRES_USER=konga" \-e "POSTGRES_DB=konga" \-e "POSTGRES_PASSWORD=konga" \postgres:9.6
初始化kong-ui數據看
docker run --rm --network=kong-ee-net \
pantsel/konga:latest \
-c prepare \
-a postgres \
-u postgres://konga:konga@konga-database:5432/konga
啟動kong-ui 服務
docker run -d -p 1337:1337 \--name konga \--network=kong-ee-net \-e "DB_ADAPTER=postgres" \-e "DB_URI=postgres://konga:konga@konga-database:5432/konga" \-e "NODE_ENV=production" \-e "DB_PASSWORD=konga" \pantsel/konga
登陸驗證
http://172.16.226.7:1337/#!/connections
4. kong的使用
Nginx 下的負載均衡配置
upstream tulingma11-product-upstream {server 192.168.65.190:8866 weight=100;server 192.168.65.190:8867 weight=100;}
server {listen 80;1ocation /pms/ {proxy_pass http://tulingma11-product-upstream;}
}
kong組件介紹
kong組件
說明
service
service 對應服務,可以直接指向一個 AP| 服務節點(host 參數設置為 ip+ port),也可以指定一個upstream 實現負載均衡。簡單來說,服務用于映射被轉發的后端 API的節點集合
route
route 對應路由,它負責匹配實際的請求,映射到 service 中
upstream
upstream 對應一組 API 節點,實現負載均衡
target
target 對應一個 AP| 節點
創建upstream
調用kong api創建一個名為demo-upstream的upstream
api操作
curl -X POST http://172.16.226.7:8001/upstreams --data "name=demo-upstream"
界面操作
創建target
api操作
curl -X POST http://172.16.226.7:8001/upstreams/demo-upstream/targets --data "target=172.16.226.13:80" --data "weight=100"
[圖片]
界面操作
創建service
api操作
curl -X POST http://172.16.226.7:8001/services --data "name=demo-upstream" --data "host=demo-upstream" --data "path=/pms"
[圖片]
界面操作
創建route
api操作
curl -X POST http://172.16.226.7:8001/services/demo-upstream/routes --data "name=demo-upstream" --data "paths[]=/pms"
界面操作
驗證測試返回結果一致
http://172.16.226.13/
http://172.16.226.7:8000/pms
5. 基本插件的使用
https://www.bilibili.com/video/BV1jY411p7qm?p=5&spm_id_from=pageDriver&vd_source=37f81c1b36b3818cbad621bcbe5c3e49
配置Basic Auth插件
#在服務上配置插件
cur1 -x POST http://127.0.0.1:8001/services/{service}/plugins \
--data "name=basic-auth" \
--data "config.hide_credentias=true"
#在路由上配置插件
cur1 -x PosT http://127.0.0.1:8001/routes/{route_id}/plugins\
--data "name=basic-auth"
--data "config.hide_credentials=true"
JWT身份認證
service緯度添加
routes維度添加
consumers維度添加
Kong限流配置
Kong 提供了 Rate Limiting,插件,實現對請求的限流功能,避免過人的請求量過大,將后端服務打掛,
Rate limiting 支持秒!分/小時/日/月/年多種時間維度的限流,并且可以組合使用。例如說:限制每秒最多 100 次請求,并且每分鐘最多1000 次請求。
Rate limiting 支持 consumer、credentia1、ip 三種基礎維度的限流,默認為 consumer。例如說:設置每個IP 允許每秒請求的次數。計數的存儲,支持使用 loca1、cluster、redis 三種方式進行存儲,默認為 cluster :
- 1oca1:存儲在 Nginx 本地,實現單實例限流
- c1uster:存儲在 Cassandra 或 PostgresQL 數據庫,實現集群限流
- redis :存儲在 Redis 數據庫,實現集群限流。
Rate limiting,采用的限流算法是計數器的方式,所以無法提供類似令牌桶算法的平滑限流能力。
配置每秒通過一個請求超過閾值報錯
黑白名單配置
配置路由上的插件需要查詢 router_id,查詢方法 http://172.16.226.7:8001/routes