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