Kong Api Gateway

什么是API 网关

在微服务的架构中一个应用可能背拆分许多个小的服务系统这些小系统可能自成一体有自己的硬件资源、数据库、框架甚至连语言都各不相同这些小系统通常以Restfull API风格的借口提供给前端或者其他系统调用一个应用可能会被拆分上百上千个API管理起来极其不变这个时候出现了API网关API网关提供了一个统一的入口将流量转发给对应的后端取得数据后再一次返回并且在次基础上提供各种认证鉴权流控等等功能让后端专心于自己的业务。

使用API 网关带来以下几个好处

  • 统一API入口
  • 隔离后端
  • 认证鉴权流控
  • 负载均衡
  • 降低后端开发对API安全性的考虑

其实无论是否是微服务的架构只要用到了认证鉴权流控功能我觉得都应该使用API网关这将大大减低后端开发的成本和速度未来扩展也方便。

下面是开源的几种方案

名称说明
TykTyk是一个开放源码的API网关它是快速、可扩展和现代的。Tyk提供了一个API管理平台其中包括API网关、API分析、开发人员门户和API管理面板。Try 是一个基于Go实现的网关服务。
KongKong是一个可扩展的开放源码API Layer(也称为API网关或API中间件)。Kong 在任何RESTful API的前面运行通过插件扩展它提供了超越核心平台的额外功能和服务。
OrangeOrange和Kong类似也是基于OpenResty的一个API网关程序是由国人开发的。
ZuulZuul是一种提供动态路由、监视、弹性、安全性等功能的边缘服务。Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器。
apiaxleNodejs 实现的一个 API 网关。
api-umbrellaRuby 实现的一个 API 网关。

在以上的产品中还是比较推荐是用kong的kong基于nginx使用了lua语言这将大大提供了性能和稳定性。

为什么是 Kong

在这里插入图片描述
Kong 的插件机制是其高可扩展性的根源Kong 可以很方便地为路由和服务提供各种插件网关所需要的基本特性Kong 都如数支持

  • Cloud-Native 云原生: 与平台无关Kong可以从裸机运行到Kubernetes。
  • Dynamic Load Balancing 动态路由Kong 的背后是 OpenResty+Lua所以从 OpenResty 继承了动态路由的特性。
  • Circuit-Breaker 熔断。
  • Health Checks 健康检查。
  • Logging 日志: 可以记录通过 Kong 的 HTTPTCPUDP 请求和响应。
  • Security 鉴权: 权限控制IP 黑白名单同样是 OpenResty 的特性。
  • SSL: Setup a Specific SSL Certificate for an underlying service or API.
  • 监控: Kong 提供了实时监控插件。
  • 认证: 如数支持 HMAC, JWT, Basic, OAuth2.0 等常用协议。
  • Rate-limiting限流Block and throttle requests based on many variables.
  • REST API: 通过 Rest API 进行配置管理从繁琐的配置文件中解放。
  • 可用性: 天然支持分布式。
  • 高性能: 背靠非阻塞通信的 nginx性能自不用说。
  • Plugins 插件机制: 提供众多开箱即用的插件且有易于扩展的自定义插件接口可以使用 Lua或者go等自行开发插件。

上面这些特性中反复提及了 Kong 背后的 OpenResty实际上使用 Kong 之后Nginx 可以完全摒弃Kong 的功能是 Nginx 的父集。

安装Kong

Kong支持PostgreSQL 9.5+ 和Cassandra 3.xx 作为其数据存储。所以在暗转Kong之前我们需要先安装配置好数据库并且给Kong创建好数据库和用户名等等。

Kong提供了丰富的安装方式你可以基于docker来安装kong也可以使用包管理器来安装它当然也可以通过源码编译安装。

通过包管理器来安装

yum install https://download.konghq.com/gateway-3.x-rhel-8/Packages/k/kong-enterprise-edition-3.1.1.1.rhel8.amd64.rpm

检查一下都安装到哪个目录了。

[root@Kong ~]# whereis kong
kong: /etc/kong /usr/local/bin/kong /usr/local/kong

如上/ect/kong目录为配置文件目录安装后会有一个官方的默认配置文件kong.conf.default 复制这个文件为kong.conf即可启动Kong.

/usr/local/kong为Kong的运行目录Kong启动后会生成nginx的配置文件放在此目录当然缓存文件也会存放在这个目录中。

Kong的配置文件中如果没有启用某一项目配置那么Kong会使用其默认的配置文件.

Kong基于openresty所以通过包管理器来安装也会安装openresty安装目录为/usr/local/openresty/

基本上我们不需要去修改这个目录如果需要修改nginx的配置我们可以通过Kong的配置文件注入nginx配置Kong在启动的时候会生成nginx的配置文件。

启动Kong

Kong提供了CLI以此来控制Kong的启动停止等等的操作我们可以通过kong --help命令来查看CLI提供了哪些功能如下

[root@Kong ~]# kong --help
No such command: --help
 
Usage: kong COMMAND [OPTIONS]
 
The available commands are:
 check
 health
 migrations
 prepare
 quit
 reload
 restart
 roar
 start
 stop
 version
 
Options:
 --v              verbose
 --vv             debug

对应的参数功能如下

参数功能
check检查配置文件
health检查节点的健康状态
migrations迁移数据库再第一次配置Kong时候必须要运行此命令用来初始化数据库… 数据库的信息保存再配置文件中所以使用此命令需要通过-c指定配置文件在migrations参数中还可以跟上list、up、reset的参数其中list是显示当前迁移的信息up参数查询缺少的部分并且修复、reset的重置所有的迁移
prepare在配置的前缀目录中准备Kong前缀。这个命令可以用于从nginx二进制文件启动Kong而不使用’kong start’
quit优雅的停止Kong在退出之前会先处理完已经接受到的请求
reload重载配置文件
restart重启Kong
start启动kong通过 -c 来指定配置文件
stop停止运行kong
version查看版本
–v以上任意参数都可以加张-v选项此选项会打印出信息。
–vv以上任意参数都可以加张-v选项此选项会打印出更为丰富的debug信息。

现在来启动Kong因为是第一次启动所以需要先运行迁移命令以初始化数据库。

[root@Kong ~]$ kong migrations list -v
....

迁移成功之后可以使用kong start来启动Kong

 kong start --vv
 ....

指定了–vv之后会打印出启动的debug信息启动成功之后会自动再后台以daemon的方式运行。

启动之后我们看一下Kong默认监听了那些端口

[root@Kong ~]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:8443            0.0.0.0:*               LISTEN      2369/nginx: master  
tcp        0      0 127.0.0.1:8444          0.0.0.0:*               LISTEN      2369/nginx: master  
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      2369/nginx: master  
tcp        0      0 127.0.0.1:8001          0.0.0.0:*               LISTEN      2369/nginx: master  

Kong 默认监听了4个端口分别是

  • 8000API网关http代理端口
  • 8443API网关https代理端口
  • 8001Kong管理API的http端口
  • 8444Kong管理API的https端口

再观察一下启动的进程名称均为nginx。

Kong的默认运行目录在/usr/local/kong。其中里面的nginx.conf 和 nginx-kong.conf 就是Kong在启动的时候自动生成的nginx配置文件啦。

配置文件详解

Kong配置文件是Kong服务的核心文件它配置了Kong以怎么的方式运行并且依赖于这个配置生成Nginx的配置文件本文通过解读Kong配置文件以了解Kong的运行和配置。

在成功安装Kong以后会有一个名为kong.conf.default默认的配置文件示例,如果是通过包管理器安装的通常位于/etc/kong/kong.conf.default我们要将其复制为kong.conf以便于我们修改使用他。

在Kong的配置文件中约定了以下的几条规则

  • 配置文件中以#开头的行均为注释行程序不会读取这些内容。
  • 在官方提供的默认配置文件中以#开头的有值的配置项目均为默认配置。
  • 所有的配置项均可以在系统环境变量中配置但是必须要加上KONG_为前缀。
  • 值为布尔型的配置可以使用on/off或者true/false。
  • 值为列表的必须使用半角逗号分割。

Kong的配置大概分为几种分别是

  • 常规配置配置服务运行目录插件加载日志等等
  • NGINX配置配置Nginx注入例如监听IP和端口配置等等用于Kong在启动的时候生成Nginx配置文件
  • 数据库存储配置配数据库类型地址、用户名密码等等信息
  • 数据库缓存配置配置数据的缓存规则Kong会缓存诸如API信息、用户、凭证等信息以减少访问数据库次数提高性能
  • DNS解析器配置默认情况会使用系统设置如hosts和resolv.conf的配置你也可以通过DNS的解析器配置来修改
  • 其他杂项配置继承自lua-nginx模块的其他设置允许更多的灵活性和高级用法。

1、常规配置

在常规配置中主要是控制Kong一些运行时的一些配置主要有如下配置

配置项默认值说明
prefix/usr/local/kong/配置Kong的工作目录相当于Nginx的工作目录这个目录存放运行时的临时文件和日志包括Kong启动的时候自动生成的Nginx的配置文件。每一个Kong经常必须有一个单独的工作目录
log_levelnoticeNginx的日志级别。日志存放logs/error.log
proxy_access_loglogs/access.log代理端口请求的日志文件可以设置为off来关闭日志的记录也可以通过设置绝对路径也可以设置相对路径。如果设置了相对路径则日志文件会保存在的目录下
proxy_error_loglogs/error.log代理端口请求的错误日志文件可以设置为off来关闭日志的记录也可以通过设置绝对路径也可以设置相对路径。如果设置了相对路径则日志文件会保存在的目录下
admin_access_loglogs/admin_access.logKong管理的API端口请求的日志文件可以设置为off来关闭日志的记录也可以通过设置绝对路径也可以设置相对路径。如果设置了相对路径则日志文件会保存在的目录下
admin_error_loglogs/error.logKong管理的API端口请求的错误日志文件可以设置为off来关闭日志的记录也可以通过设置绝对路径也可以设置相对路径。如果设置了相对路径则日志文件会保存在的目录下
pluginsbundledKong启动的时候加载的插件如果多个必须要使用半角逗号分割。默认情况下只有捆绑官方发行版本的插件通过 bundled 这个值来加载。加载插件只是Kong在启动的时候载入插件的代码但是并不会使用它如果要使用他还必须要通过管理API来配置 当然如果你不想加载任何插件可以使用off来关闭它值得强调的一点bundled值可以和其他插件名称一起使用bundled并不是一个插件名称它代表了随官方发行的所有插件。
anonymous_reportson如果Kong进程发生了错误会以匿名的方式将错误提交给Kong官方 以帮助改善Kong。

在常规的配置中主要配置了Kong运行的目录日志等信息。配置文件或者目录Kong必须要用权限访问否则会报错。

2、Nginx注入配置

Kong基于Nginx当然需要配置Nginx来满足Kong的运行要求Kong提供了Nginx的注入配置使得我们更轻松控制。

在Nginx注入配置中有如下配置

配置项默认值说明
proxy_listen0.0.0.0:8000, 0.0.0.0:8443 ssl配置Kong代理监听的地址和端口这个是Kong的入口API调用都将通过这个端口请求。这个配置和Ngxin中的配置一致通过SSL可以指定接受https的请求支持IPv4和IPv6
admin_listen127.0.0.1:8001, 127.0.0.1:8444 ssl配置Kong的管理API监听的端口和proxy_listen配置一样但是这个配置不建议监听在公网IP上。
nginx_usernobody nobody配置Nginx的用户名和用户组和Nginx的配置规则一样
nginx_worker_processesauto设置Nginx的进程书通常等于CPU核心数
nginx_daemonon是否以daemon的方式运行Ngxin
mem_cache_size128m内存的缓存大小可以使用k和m为单位
ssl_cipher_suitemodern定义Nginx提供的TLS密码可以配置的值有modern,intermediate, old, custom.
ssl_ciphers定义Nginx提供的TLS密码的列表参考Nginx的配置
ssl_cert配置SSL证书的crt路径必须是要绝对路径
ssl_cert_key设置SSL证书的key文件必须是绝对路径
client_ssloff……
client_ssl_cert……
client_ssl_cert_key……
admin_ssl_cert……
admin_ssl_cert_key……
headersserver_tokens, latency_tokens设置再相应客户端时候应该注入的头部可以设置的值如下– server_tokens: 注入’Via’和’Server’头部.– latency_tokens: 注入’X-Kong-Proxy-Latency’和’X-Kong-Upstream-Latency’ 头部.– X-Kong-: 只有在适当的时候注入特定的头部这个配置可以被设置为off。当然即便设置了off以后插件依然可以注入头部
trusted_ips定义可信的IP地址段通常不建议在此处限制请求应该再插件中过滤
real_ip_headerX-Real-IP
real_ip_recursiveoff这个值在Nginx配置中设置了同名的ngx_http_realip_module指令
client_max_body_size0配置Nginx接受客户端最大的body长度如果超过此配置 将返回413。 设置为0则不检查长度
client_body_buffer_size8k设置读取缓冲区大小如果超过内存缓冲区大小那么NGINX会缓存在磁盘中降低性能。
error_default_typetext/plain当请求’ Accept ‘头丢失Nginx返回请求错误时使用的默认MIME类型。可以配置的值为text/plain,text/html, application/json, application/xml.
在Nginx注入配置中配置了Nginx的基本的参数这些参数大部分和NGINX的配置值是一样的。

3、数据库存储配置

数据库配置的模块配置数据库相关的连接信息等等。主要有如下配置

配置项默认值说明
databasepostgres设置数据库类型Kong支持两种数据库一种是postgres一种是cassandra
PostgreSQL配置如果database设置为postgres以下配置生效
pg_host127.0.0.1设置PostgreSQL的连接地址
pg_port5432设置PostgreSQL的端口
pg_userkong设置PostgreSQL的用户名
pg_password设置PostgreSQL的密码
pg_databasekong设置数据库名称
pg_ssoff是否开启ssl连接
pg_ssl_verifyoff如果启用了’ pg_ssl ‘则切换服务器证书验证。
cassandra配置如果database设置为cassandra以下配置生效
cassandra_contact_points127.0.0.1……
cassandra_port9042……
cassandra_keyspacekong……
cassandra_timeout5000……
cassandra_ssloff……
cassandra_ssl_verifyoff……
cassandra_usernamekong……
cassandra_password……
cassandra_consistencyONE……
cassandra_lb_policyRoundRobin……
cassandra_local_datacenter……
cassandra_repl_strategySimpleStrategy……
cassandra_repl_factor1……
cassandra_data_centersdc1:2,dc2:3……
cassandra_schema_consensus_timeout10000……

4、数据库缓存配置

配置了Kong持久化存储显然如果每次的请求都需要去查询数据库中的相关信息那无疑是非常消耗资源性能和稳定性也会大大降低作为一个API网关肯定是不能忍的解决这个问题的办法就是缓存Kong将数据缓存在内存中这样会大大提高性能本节介绍Kong的缓存配置。

配置项默认值说明
db_update_frequency5节点更新数据库的时间以秒为单位。
db_update_propagation0数据库节点的更新时间。如果使用了Cassandra数据库集群那么如果数据库有更新最多需要db_update_propagation时间来同步所有的数据库副本。如果使用PostgreSQL或者单数据库这个值可以被设置为0
db_cache_ttl0缓存生效时间单位秒。如果设置为0表示永不过期 。Kong从数据库中读取数据并且缓存在ttl过期后会删除这个缓存然后再一次读取数据库并缓存
db_resurrect_ttl30缓存刷新时间单位秒。当数据存储中的陈旧实体无法刷新时(例如数据存储不可访问)应该对其进行恢复。当这个TTL过期时将尝试刷新陈旧的实体。

DNS解析器配置

默认情况下DNS解析器将使用标准配置文件/etc/hosts和/etc/resolv.conf。如果设置了环境变量LOCALDOMAIN和RES_OPTIONS那么后一个文件中的设置将被覆盖。

配置项默认值说明
dns_resolver配置DNS服务器列表用半角逗号分割每个条目使用ip[:port]的格式这个配置仅提供给Kong使用不会覆盖节点系统的配置如果没有配置则使用系统的设置。接受IPv4和IPv6的地址。
dns_hostsfile/etc/hosts配置Kong的hosts文件这个配置同样仅提供给Kong使用不会覆盖节点系统的配置。需要说明的是这个文件仅读取一次读取的内容会缓存再内存中如果修改了此文件必须要重启Kong才能生效。
dns_orderLAST,SRV,A,CNAME解析不同记录类型的顺序。“LAST”类型表示最后一次成功查找的类型(用于指定的名称)
dns_stale_ttl4配置DNS记录缓存过期时间
dns_not_found_ttl30这个配置值不知道该如何理解
dns_error_ttl1……
dns_no_syncoff如果启用了该项那么在DNS缓存过期之后每一次请求都会发起DNS查询。在禁用此项时那么相同的域名多次请求会同步到一个查询中共享返回值。

在DNS配置中我们基本上不需要更改官网的配置给出了最优的配置。如果我们需要在host文件中定义后端绑定的域名一定要在编辑hosts文件后重载Kong的配置或者重启Kong无论hosts的文件是否是/etc/hosts否则都不会生效的。

其他杂项配置

杂项配置基本上关于LUA的配置如果不熟悉请不要修改按照官方默认即可。

配置项默认值说明
lua_ssl_trusted_certificate….
lua_ssl_verify_depth1
lua_package_path./?.lua;./?/init.lua;….
lua_package_cpath….
lua_socket_pool_size30….

API 管理详解

安装好了Kong那么如何使用和管理它呢Kong附带了一个管理的API接口我们通过这个API接口来管理所有的API以及其他的资源这个接口具有最高的权限所以在生产环境中我们要特别注意这个接口的权限通常我们不会将这个接口暴露在外网中。

如果Kong是以集群的状态的运行的那么你只需要将管理API的请求发送到其中的一个节点中Kong会自动同步信息到其他的节点。Kong默认监听8001和8444两个端口用接受管理API的请求8001为http端口8444为https端口

Kong支持application/x-www-form-urlencoded和application/json两种类型POST的数据我们需要以json的格式发送。

Kong大概有以下几个管理对象

  • 节点信息
  • 服务
  • 路由
  • 用户
  • 插件
  • 证书
  • SNI
  • 上游信息
  • 目标

1、查看节点信息

接口信息

接口名称查看节点详细信息
请求端点/
请求方法GET
返回状态HTTP 200 OK

请求参数:

请求示例

curl -s http://127.0.0.1:8001 | python -m json.tool

2、查看节点状态

这个接口查询节点的状态主要是显示nginx进程处理连接的情况以及数据库连接的情况。

如果Kong是以集群的方式运行那么如果要查看其他节点的情况必须要要一个一个访问节点的此接口。

因为Kong是基于nginx的你也可以直接使用Nginx的监控工具。

接口信息

接口名称查看节点状态
请求端点/status
请求方法GET
返回状态HTTP 200 OK

请求参数:

请求示例

curl -s http://127.0.0.1:8001/status  | python -m json.tool

返回值

{
    "database": {
        "reachable": true
    },
    "server": {
        "connections_accepted": 111,
        "connections_active": 1,
        "connections_handled": 111,
        "connections_reading": 0,
        "connections_waiting": 0,
        "connections_writing": 1,
        "total_requests": 64
    }
}

在返回的数据中各个值的含义如下

  • total_requests客户端请求的总数。
  • connections_active当前活动客户端连接数包括等待连接。
  • connections_accepted已接受的客户端连接总数。
  • connections_handled已处理连接的总数。通常参数值与accept相同除非已达到某些资源限制。
  • connections_readingKong正在读取请求标头的当前连接数。
  • connections_writingnginx将响应写回客户端的当前连接数。
  • connections_waiting等待请求的当前空闲客户端连接数。

服务是每一个后端真实接口的抽象它与路由关联客户端发起请求如果路由匹配到了那么会将这个请求代理到与匹配路由相关联的服务中。

3、添加服务

接口信息

接口名称添加服务
请求端点/status
请求方法GET
返回状态HTTP 200 OK

请求参数:

参数名类型默认值是否必须说明
namestring服务名称全局唯一
protocolstringhttp和上游通讯的协议取值http或https
hoststring上游服务器的主机
portint80上游服务器的端口
pathstring上游服务器请求中的路径必须以 /开头
retriesint5代理失败时要执行的重试次数
connect_timeoutint60000与上游连接的超时时间单位毫秒
write_timeoutint60000向上游发送请求两次连续写操作的超时时间 单位毫秒
read_timeoutint60000用于向上游服务器发送请求的两次连续读取操作之间的超时 单位毫秒

如果在创建服务的时候没有指定name那么Kong并不会自动创建name但是会创建UUID形式的IDKong在调用、匹配等等的操作都是可以基于这个ID所以这个ID绝对是全局唯一的。

如果在创建服务的时候没有指定name那么Kong并不会自动创建name但是会创建UUID形式的IDKong在调用、匹配等等的操作都是可以基于这个ID所以这个ID绝对是全局唯一的。

在其他的对象管理中name字段可能是必须的通常这个name资源也是全局唯一的即便如此Kong也会创建ID字段也可以通过这个ID字段来匹配。

在服务对象中能组合起来成为上游服务也是唯一的也就是说在一个服务中无法同时存在 http和https如果上游提供http和https服务同时也需要Kong代理它们的话那必须要设置两个服务。

4、查询服务

接口信息*

接口名称查询服务
请求端点/services/{name or id}
请求方法GET
返回状态HTTP 200 OK

请求参数:

请求示例

curl -s http://127.0.0.1:8001/services/{service_id}  | python -m json.tool

返回值

{
    "database": {
        "reachable": true
    },
    "server": {
        "connections_accepted": 111,
        "connections_active": 1,
        "connections_handled": 111,
        "connections_reading": 0,
        "connections_waiting": 0,
        "connections_writing": 1,
        "total_requests": 64
    }
}

5、查询所有服务

接口信息*

接口名称查询所有服务
请求端点/services/
请求方法GET
返回状态HTTP 200 OK

请求参数:

参数名类型默认值是否必须说明
offsetstring分页偏移用于定义列表中的唯一
sizeiny100每页返回数量

请求示例

curl -s http://127.0.0.1:8001/services/?size=1  | python -m json.tool

返回值

{
    "data": [
        {
            "connect_timeout": 60000,
            "created_at": 1537986798,
            "host": "www.baidu.com",
            "id": "27f30248-fef1-4ddc-9fdc-4ca73f354c64",
            "name": "infvie_server",
            "path": null,
            "port": 80,
            "protocol": "http",
            "read_timeout": 60000,
            "retries": 5,
            "updated_at": 1537986798,
            "write_timeout": 60000
        }
    ],
    "next": "/services?offset=WyIyN2YzMDI0OC1mZWYxLTRkZGMtOWZkYy00Y2E3M2YzNTRjNjQiXQ",
    "offset": "WyIyN2YzMDI0OC1mZWYxLTRkZGMtOWZkYy00Y2E3M2YzNTRjNjQiXQ"
}

6、更新服务

接口信息*

接口名称更新服务
请求端点/services/{name or id}
请求方法PATCH
返回状态HTTP 200 OK

请求参数:

参数名类型默认值是否必须说明
namestring服务名称全局唯一
protocolstringhttp和上游通讯的协议取值http或https
hoststring上游服务器的主机
portint80上游服务器的端口
pathstring上游服务器请求中的路径必须以 /开头
retriesint5代理失败时要执行的重试次数
connect_timeoutint60000与上游连接的超时时间单位毫秒
write_timeoutint60000向上游发送请求两次连续写操作的超时时间 单位毫秒
read_timeoutint60000用于向上游服务器发送请求的两次连续读取操作之间的超时 单位毫秒

7、更新或者创建服务

接口信息*

接口名称查看节点详细信息
请求端点/services/{name or id}
请求方法PUT
返回状态HTTP 200 OK

请求参数:

参数名类型默认值是否必须说明
namestring服务名称全局唯一
protocolstringhttp和上游通讯的协议取值http或https
hoststring上游服务器的主机
portint80上游服务器的端口
pathstring上游服务器请求中的路径必须以 /开头
retriesint5代理失败时要执行的重试次数
connect_timeoutint60000与上游连接的超时时间单位毫秒
write_timeoutint60000向上游发送请求两次连续写操作的超时时间 单位毫秒
read_timeoutint60000用于向上游服务器发送请求的两次连续读取操作之间的超时 单位毫秒

8、删除服务

接口信息*

接口名称删除服务
请求端点/services/{name or id}
请求方法DELETE
返回状态HTTP 204 No Content

请求参数:

请求示例

curl -i  -X DELETE --url http://127.0.0.1:8001/services/{service_id}

9、添加路由

接口信息*

接口名称添加路由
请求端点/routes/
请求方法POST
返回状态HTTP 201 Created

请求参数:

参数名类型默认值是否必须说明
protocolslist[“http”, “https”]此路由允许的协议取值http或https
methodslistnull*否此路由允许的http 方法
hostslistnull*否此路由允许的域名
pathslist80上游服务器的端口
strip_pathbooltrue匹配到path时是否删除匹配到的前缀
preserve_hostbooltrue匹配到hosts时使用请求头部的值为域名向后端发起请求请求的头部为”host”,例如”host:api.abc.com”
servicestring关联服务id
write_timeoutint60000向上游发送请求两次连续写操作的超时时间 单位毫秒
read_timeoutint60000用于向上游服务器发送请求的两次连续读取操作之间的超时 单位毫秒

请求示例

curl -X POST http://localhost:8001/routes -H 'Content-Type: application/json' -d '{"name":"sase-server","protocols":["http","https"],"paths":["/"],"hosts":["10.41.38.4:9443"],"service":{"id":"5d3637d3-a4e9-4dc3-bf9d-a2381eb86148"}}'

值得注意的是methodshostspaths这三个参数必须要指定一个否则无法创建路由。

10、查看路由

接口信息*

接口名称查看路由
请求端点/routes/{id}
请求方法GET
返回状态HTTP 200 OK

请求参数:

请求示例

curl -s http://127.0.0.1:8001/routes/{route_id} | python -m json.tool

11、查询所有路由

接口信息*

接口名称查询所有路由
请求端点/routes
请求方法GET
返回状态HTTP 200 OK

请求参数:

参数名类型默认值是否必须说明
offsetstring分页偏移用于定义列表中的唯一
sizeiny100每页返回数量

请求示例

curl -s http://127.0.0.1:8001/routes/?size=1 | python -m json.tool

12、更新路由

接口信息

接口名称更新路由
请求端点/routes/{id}
请求方法PATCH
返回状态HTTP 200 OK

请求参数

参数名类型默认值是否必须说明
protocolslist[“http”, “https”]此路由允许的协议取值http或https
methodslistnull*否此路由允许的http 方法
hostslistnull*否此路由允许的域名
pathslist80上游服务器的端口
strip_pathbooltrue匹配到path时是否删除匹配到的前缀
preserve_hostbooltrue匹配到hosts时使用请求头部的值为域名向后端发起请求请求的头部为”host”,例如”host:api.abc.com”
servicestring关联服务id
write_timeoutint60000向上游发送请求两次连续写操作的超时时间 单位毫秒
read_timeoutint60000用于向上游服务器发送请求的两次连续读取操作之间的超时 单位毫秒

13、更新或者添加路由

接口信息

接口名称更新或者添加路由
请求端点/routes/{id}
请求方法PUT
返回状态HTTP 201 Created or HTTP 200 OK

请求参数

参数名类型默认值是否必须说明
protocolslist[“http”, “https”]此路由允许的协议取值http或https
methodslistnull*否此路由允许的http 方法
hostslistnull*否此路由允许的域名
pathslist80上游服务器的端口
strip_pathbooltrue匹配到path时是否删除匹配到的前缀
preserve_hostbooltrue匹配到hosts时使用请求头部的值为域名向后端发起请求请求的头部为”host”,例如”host:api.abc.com”
servicestring关联服务id
write_timeoutint60000向上游发送请求两次连续写操作的超时时间 单位毫秒
read_timeoutint60000用于向上游服务器发送请求的两次连续读取操作之间的超时 单位毫秒

14、查看和服务关联的路由

接口信息

接口名称查看和服务关联的路由
请求端点/services/{service name or id}/routes
请求方法GET
返回状态HTTP 200 OK

请求参数

请求示例

curl -s http://127.0.0.1:8001/services/{service_id}/routes | python -m json.tool

15、查看和路由关联的服务

接口信息

接口名称查看和路由关联的服务
请求端点/routes/{route id}/service
请求方法GET
返回状态HTTP 200 OK

请求参数

请求示例

curl -s http://127.0.0.1:8001/routes/{route_id}/service | python -m json.tool

16、删除路由

接口信息

接口名称删除路由
请求端点/routes/{id}
请求方法DELETE
返回状态HTTP 204 No Content

请求参数

请求示例

curl -s http://127.0.0.1:8001/routes/{route_id}| python -m json.tool

17、添加用户

接口信息

接口名称添加用户
请求端点/consumers
请求方法POST
返回状态HTTP 201 Created

请求参数

参数名类型默认值是否必须说明
usernamestring*否全局唯一用户名
custom_idstringnull*否全局唯一用户id

18、查询用户

接口信息

接口名称查看节点详细信息
请求端点/consumers/{username or id}
请求方法GET
返回状态HTTP 200 OK

请求参数:

请求示例

curl -s http://127.0.0.1:8001/consumers/{custom_id}| python -m json.tool

19、查询所有用户

接口信息

接口名称查询所有用户
请求端点/consumers
请求方法GET
返回状态HTTP 200 OK

请求参数:

参数名类型默认值是否必须说明
offsetstring分页偏移用于定义列表中的唯一
sizeiny100每页返回数量

请求示例

curl -s http://127.0.0.1:8001/consumers/size=10| python -m json.tool

20、更新用户

接口信息

接口名称更新用户
请求端点/consumers/{username or id}
请求方法GET
返回状态HTTP 200 OK

请求参数:

参数名类型默认值是否必须说明
usernamestring*否全局唯一用户名
custom_idstringnull*否全局唯一用户id

21、更新或者添加用户

接口信息

接口名称更新或者添加用户
请求端点/consumers/{username or id}
请求方法PUT
返回状态HTTP 201 Created or HTTP 200 OK

请求参数:

参数名类型默认值是否必须说明
usernamestring*否全局唯一用户名
custom_idstringnull*否全局唯一用户id

删除用户

接口信息

接口名称删除用户
请求端点/consumers/{username or id}
请求方法DELETE
返回状态HTTP 204 No Content

请求示例

curl -i -X DELETE --url http://192.168.0.184:8001/consumers/{custom_id} 

插件概述

Kong提供了一个插件的功能你可以通过配置指定某个服务或者路由或者用户启用某个插插件始终只运行一次所以对于不同的实体配置相同插件时就有优先级的概念。

多次配置插件的优先级如下

  • 在以下组合上配置的插件路由服务和使用者。 消费者意味着必须对请求进行身份验证。
  • 在Route和Consumer的组合上配置的插件。 消费者意味着必须对请求进行身份验证。
  • 在服务和使用者的组合上配置的插件。 消费者意味着必须对请求进行身份验证。
  • 在路由和服务的组合上配置的插件。
  • 在Consumer上配置的插件。 消费者意味着必须对请求进行身份验证。
  • 在路由上配置的插件。
  • 在服务上配置的插件。
  • 配置为全局运行的插件。

从以上的优先级可以看出全局配置的插件优先级最小而越具体的组合优先级越高。

23、添加插件

可以通过以下几种不同的方式添加插件

  • 对于每个Service/Route和consumer。不要设置consumer_id和设置service_id或route_id。
  • 适用于每个Service/Route和特定consumer。只有设定consumer_id。
  • 适用于每个consumer和特定Service。仅设置service_id警告某些插件只允许设置route_id
    对于每个consumer和特定的Route。仅设置route_id警告某些插件只允许设置service_id
    对于特定的Service/Route和consumer。设置两个service_id/ route_id和consumer_id。
并非所有插件都允许指定consumer_id。检查插件文档。

接口信息

接口名称添加插件
请求端点/plugins
请求方法POST
返回状态HTTP 201 Created

请求参数:

参数名类型默认值是否必须说明
namestring要添加的插件的名称。目前插件必须分别安装在每个Kong实例中。
consumer_idstringnull使用者的唯一标识符用于覆盖传入请求中此特定使用者的现有设置。
service_idstringnull服务的唯一标识符用于覆盖传入请求中此特定服务的现有设置。
route_idstringnull路由的唯一标识符它覆盖传入请求中此特定路由的现有设置。
configobjectnull插件的配置属性可以在Kong Hub的插件文档页面找到。
enabledbooltrue是否应用插件。默认值true。
tagslist与插件关联的一组可选字符串用于分组和筛选。

24、查询插件

接口信息

接口名称查询插件
请求端点/plugins{id}
请求方法GET
返回状态HTTP 200 OK

请求参数:

参数名类型默认值是否必须说明
idstring要检索的插件的唯一标识符

请求示例

curl -s  --url http://127.0.0.1:8001/plugins/{id}  | python -m json.tool

25、查询所有插件

接口信息

接口名称查询所有插件
请求端点/plugins/
请求方法GET
返回状态HTTP 200 OK

请求参数:

参数名类型默认值是否必须说明
idstring通过id查询
namestring通过name查询
consumer_idstring通过consumer_id查询
service_idstring通过service_id查询
route_idstring通过route_id查询
offsetstring分页偏移用于定义列表中的唯一
sizeiny100每页返回数量

请求示例

curl -s --url http://127.0.0.1:8001/plugins/?size=1 | python -m json.tool

26、更新或添加插件

接口信息

接口名称更新或添加插件
请求端点/plugins/
请求方法PUT
返回状态HTTP 201 Created or HTTP 200 OK

请求参数:

参数名类型默认值是否必须说明
namestring要添加的插件的名称。目前插件必须分别安装在每个Kong实例中。
consumer_idstringnull使用者的唯一标识符用于覆盖传入请求中此特定使用者的现有设置。
service_idstringnull服务的唯一标识符用于覆盖传入请求中此特定服务的现有设置。
route_idstringnull路由的唯一标识符它覆盖传入请求中此特定路由的现有设置。
configobjectnull插件的配置属性可以在Kong Hub的插件文档页面找到。
enabledbooltrue是否应用插件。默认值true。
tagslist与插件关联的一组可选字符串用于分组和筛选。

28、删除插件

接口信息

接口名称删除插件
请求端点/plugins/{plugin_id}
请求方法DELETE
返回状态HTTP 204 No Content

请求参数:

参数名类型默认值是否必须说明
plugin_idstring要删除的插件配置的唯一标识符
curl -s -X DELETE --url http://127.0.0.1:8001/plugins/{plugin_id} | python -m json.tool

29、查询已启用的插件

接口信息

接口名称查询已启用的插件
请求端点/plugins/enabled
请求方法GET
返回状态HTTP 200 OK

请求参数:

请求示例

curl -s -X GET --url http://127.0.0.1:8001/plugins/enabled | python -m json.tool

30、检索插件架构

接口信息

接口名称检索插件架构
请求端点/plugins/schema/{plugin_name}
请求方法GET
返回状态HTTP 200 OK

请求参数:

请求示例

curl -s -X GET --url http://192.168.0.184:8001/plugins/schema/{plugin_name} | python -m json.tool

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6