开源API网关Kong


Kong 是一个在 Nginx 运行的 Lua 应用程序,由 lua-nginx-module 实现。Kong 和 OpenResty 一起打包发行,其中已经包含了 lua-nginx-module。OpenResty 不是 Nginx 的分支,而是一组扩展其功能的模块。

1. 两个主要组件
  • Kong Server,基于 nginx 的服务器,用来接收 API 请求。
  • Apache Cassandra,用来存储操作数据。
2. 安装部署 (测试环境:http://konga.local/#!/dashboard, host : 192.168.0.231 konga.local),当前版本:v1.3.0
a. 基础安装 (Docker为例)

Kong 支持多种常见的操作环境下安装部署, 如: CentOS,Debian,Ubuntu,Docker,K8S 等,安装详情参见官方文档 Kong 各环境安装部署,支持数据库模式和非数据库模式部署。

以 Docker 为例部署脚本

  • 数据库模式
# 创建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" \
    postgres:9.6

# 初始化数据
> docker run --rm \
    --network=kong-net \
    -e "KONG_DATABASE=postgres" \
    -e "KONG_PG_HOST=kong-database" \
    -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
    kong:latest kong migrations bootstrap

# 运行Kong
# 端口:8000 Http,8443 Https,8001 Admin API Http,8444 Admin API https
> docker run -d --name kong \
     --network=kong-net \
     -e "KONG_DATABASE=postgres" \
     -e "KONG_PG_HOST=kong-database" \
     -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:latest
  • 文件存储模式
# 创建专属网络
> docker network create kong-net

# 创建Docker卷
> docker volume create kong-vol

# 查看卷
> docker volume inspect kong-vol

# 运行Kong,kong.yml为配置文件
# 端口:8000 Http,8443 Https,8001 Admin API Http,8444 Admin API https
> docker run -d --name kong \
     --network=kong-net \
     -v "kong-vol:/usr/local/kong/declarative" \
     -e "KONG_DATABASE=off" \
     -e "KONG_DECLARATIVE_CONFIG=/usr/local/kong/declarative/kong.yml" \
     -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:latest
b. kong 仪表板
# konga (推荐)
> docker run -p 1337:1337
    --network {{kong-network}} \ // optional
    -e "TOKEN_SECRET={{somerandomstring}}" \
    -e "DB_ADAPTER=the-name-of-the-adapter" \ // 'mongo','postgres','sqlserver'  or 'mysql'
    -e "DB_HOST=your-db-hostname" \
    -e "DB_PORT=your-db-port" \ // Defaults to the default db port
    -e "DB_USER=your-db-user" \ // Omit if not relevant
    -e "DB_PASSWORD=your-db-password" \ // Omit if not relevant
    -e "DB_DATABASE=your-db-name" \ // Defaults to 'konga_database'
    -e "DB_PG_SCHEMA=my-schema"\ // Optionally define a schema when integrating with prostgres
    -e "NODE_ENV=production" \ // or 'development' | defaults to 'development'
    --name konga \
    pantsel/konga

# kong-dashboard
> docker run --name=kong-dashboard -p 8080:8080 pgbi/kong-dashboard start \
  --kong-url http://kong:8001
  --basic-auth user1=password1 user2=password2
3. 基础功能(konga为例)

API开放平台 java开源项目_docker

应用级菜单

  1. Connections Kong连接,用于配置Kong的AdminAPI地址,配置成功之后,将会开启Kong级菜单。
  2. Snapshots 快照,用于存储Kong节点快照,可快速恢复节点配置。

API网关菜单

  1. Consumers API网关消费者,用于各类认证以及限流控制等;
  2. Services 服务,用于配置上游服务的信息,主要包括服务名称、上游的Host以及Port等;
  3. Routes 路由,用于配置下游的路由信息,定义服务的出口路径,主要包括路由名称、Host、Path、Methods以及Http/Https等;
  4. Plugins 插件,可配置于Service或Route,主要包括认证、安全、限流、监控、日志以及自定义几大模块,官方提供了较为全面的基础插件功能;
  5. Upstreams 类nginx中的Upstream,用于配置上游的服务信息;
  6. Certificates 证书管理。

服务配置

1.添加服务: Services -> Create Services

实例:

API开放平台 java开源项目_运维_02

说明:由于这里的Kong部署在K8S环境中,所以可以直接使用K8S中的服务名+端口号来定义服务的Host和Port。

2.添加路由: Services -> Service Detail -> Routes -> Add Route

实例:

API开放平台 java开源项目_负载均衡_03

配置完成之后,我们就可以访问我们的服务了。

# https://192.168.0.231:31617/config 或 http://192.168.0.231:32740/config Host: config.kong
> curl -ik -H "Host":"config.kong" https://192.168.0.231:31617/config/basic/dev
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Date: Thu, 17 Oct 2019 02:05:16 GMT
Server: Kestrel
X-Kong-Upstream-Latency: 3
X-Kong-Proxy-Latency: 10007
Via: kong/1.3.0

{"logLevel":"Debug",...}

插件配置

插件添加有两个入口:
1.服务插件 Servcies -> Service Detail -> Plugins -> Add Plugin
2.路由插件 Routes -> Route Detail -> Plugins -> Add Plugin

认证

# 1.Basic 认证
# Header: Authorization Basic base64(username:password)

# 2.Jwt认证
# 支持三种认证参数传递:uri param,cookie and header,可自定义键名
# key claim一般为iss
# jwt生成 & 校验:https://jwt.io/

# 3.OAuth2认证
# 认证地址:oauth2/authorize
# 获取token地址: oauth2/token
# 刷新token地址: oauth2/token

安全

# 1. Acl 访问控制列表
# 2. Cors  跨域资源共享
# 3. Ip Restriction IP限制
# 4. Bot Detection 机器人检测

限流

# 1. Rate Limiting 速率限制
# 2. Response Ratelimiting 响应速率限制
# 3. Request Size Limiting  请求大小限制
# 4. Request Termination 请求阻断/终止

日志

监控

请求转发

自定义

4. Admin API

AdminAPI