Kong-网关核心基础概念(上游-消费者-服务-路由)及-key-auth、Basic-auth,Rate Limiting-插件使用配置

安装Kong

关于Kong的核心概念和插件

上游(UPSTREAM)

上游本质是后端服务集群的逻辑分组,包含一组具体的“服务实例”(Kong中称为Target),并附带对这组实例的管理策略(如负载均衡算法、健康检查、超时控制等)。

  • 核心作用:作为Kong与后端服务的“中间层”,隔离网关与具体服务实例,让网关无需关心单个服务的IP/端口变化,只需通过上游统一调度请求。
  • 类比理解:可将上游看作“服务集群的名称牌”(如“用户服务集群”“订单服务集群”);而集群中的每台服务器(如192.168.1.100:8080192.168.1.101:8080)就是该上游下的Target。

上游的核心价值在于通过内置策略,解决后端服务的负载均衡、高可用、动态扩展问题,无需侵入业务代码。

在Kong中添加API的流程如下:

  1. 首先需要添加服务(Service):Kong用Service来标识它管理的上游API和微服务。
  2. 为Service添加路由(Route):Route定义请求到达Kong后如何转发到对应的Service,一个Service可对应多个Route。
  3. 配置完成后,即可通过Kong代理请求。

Kong通过8001端口暴露RESTful管理API,所有配置操作(如添加Service和Route)都通过该API完成。  
Kong管理API端口说明

插件的三种启用方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 1. 在服务上启用插件
curl -X POST http://127.0.0.1:8001/services/handsome-product/plugins \
  --data "name=rate-limiting" \
  --data "config.second=1" \
  --data "config.limit_by=ip"
 
# 2. 在路由上启用插件
curl -X POST http://127.0.0.1:8001/routes/{route_id}/plugins \
  --data "name=rate-limiting" \
  --data "config.second=5" \
  --data "config.hour=10000"
 
# 3. 在消费者上启用插件
curl -X POST http://127.0.0.1:8001/plugins \
  --data "name=rate-limiting" \
  --data "consumer_id={consumer_id}" \
  --data "config.second=5" \
  --data "config.hour=10000"
  • name参数:设置为rate-limiting表示使用限流插件。
  • config.second参数:设置每秒允许的请求次数(如1表示每秒1次)。
  • config.limit_by参数:设置限流维度(如ip表示基于IP限流)。

后端服务准备(ThinkPHP8)

本次在后端8080端口运行一个ThinkPHP8实例。  
后端服务运行状态

直接访问8080端口测试:  
直连后端服务测试结果

创建消费者(Consumer)

概念介绍

在Kong中,消费者(Consumer) 用于标识和管理使用API的客户端实体(可以是用户、应用程序、第三方系统等),是实现精细化API治理(如认证、授权、限流、监控)的基础。

通过消费者,我们可以:

  • 记录每个调用主体的API使用情况(如调用次数、响应时间),用于计费、监控或排查问题。
  • 对特定消费者执行熔断、限流等操作。

创建普通消费者及凭证

创建普通消费者  
或者使用api端点创建消费者

1
2
3
4
curl -i -X POST \
--url http://localhost:8001/consumers/ \
--data "username=basic-user" \
--data "custom_id=basic-01"

普通消费者credentials配置
或者使用api端点创建凭证

1
2
3
curl -X POST http://localhost:8001/consumers/basic-user/basic-auth \
--data "username=28.7Blog" \
--data "password=202019"

创建匿名消费者及凭证

创建匿名消费者  
匿名消费者credentials配置

创建服务(Service)

服务(Service) 是Kong对后端API/微服务的抽象,用于定义后端服务的访问地址(如http://192.168.87.177:8080),是Kong转发请求的目标。

创建Service

创建路由(Route)

路由(Route) 定义了请求如何匹配到对应的Service(如通过路径、主机名、方法等规则),一个Service可关联多个Route。

创建Route

配置完成后,即可通过Kong代理后端服务。例如,访问192.168.87.177:8000/tp8即可通过Kong转发到对应的后端服务(Kong支持通过不同路径映射不同服务)。  

Kong代理访问测试

在Route中安装Basic Auth插件,用于验证用户身份。创建Basic Auth 我们可以使用消费者凭据进行认证,但是前提是需要创建消费者

图形化方法

安装Basic Auth插件  
Basic Auth插件配置

需填入匿名用户的Consumer ID  
配置匿名消费者ID

配置后,直接访问代理服务会失败(未携带认证信息):  
未认证访问失败

需在请求头中注入认证信息:

1
2
Authorization: Basic <Base64编码的user:pass>
// 示例:Authorization: Basic dXNlcjpwYXNz(对应用户名user,密码pass)

携带认证信息访问成功

这提示我们需要配置单点登录认证服务器,自动注入认证头部并标记唯一用户ID。  
通过认证服务器访问流程

插件:Key Auth(密钥认证)

1. 创建信任用户

1
2
3
curl -i -X POST \
  --url http://localhost:8001/consumers/ \
  --data "username=2022471677@qqcom"

返回数据:

1
2
3
4
5
6
7
8
{
  "custom_id": null,
  "id": "a21e3b92-76e1-455b-9804-1e49c3ed0ec6",
  "tags": null,
  "username": "2022471677@qqcom",
  "created_at": 1760016821,
  "updated_at": 1760016821
}

2. 添加密钥(Key)

1
2
3
curl -i -X POST \
  --url http://localhost:8001/consumers/2022471677@qqcom/key-auth/ \
  --data 'key=202019'

若密钥已存在,返回错误:

1
2
3
4
5
6
7
8
{
  "code": 5,
  "message": "UNIQUE violation detected on '{key=\"202019\"}'",
  "name": "unique constraint violation",
  "fields": {
    "key": "202019"
  }
}

插件说明:config.key_names参数默认值为['apiKey'],表示请求时可通过apiKey头部(或其他指定头部)传递密钥,任意一个匹配即可。

3. 使用API Key访问

正确API Key访问成功

4. 使用错误密钥访问

错误API Key访问失败

插件:Rate Limiting(频率限制)

速率限制用于控制在指定时间段内(秒、分钟、小时、天、月或年)可发出的HTTP请求数量。  

  • 若底层网关服务或路由无身份验证层,将通过客户端IP地址识别客户端。  
  • 若已配置身份验证插件,则通过使用者(consumer)进行识别。

该插件的高级版本 Rate Limiting Advanced 提供更多功能:  

  • 支持在滑动或固定窗口中应用多个限制  
  • 包含Redis Sentinel和Redis集群支持

 

Kong还提供多个专门的速率限制插件,包括针对LLM和GraphQL查询的速率限制。详情可参考《Kong Gateway 中的速率限制》,选择最适合您用例的插件。

在路由上启动插件

在路由上启动Rate Limiting插件

使用以下命令在路由上启用插件:

1
2
3
4
curl -X POST http://127.0.0.1:8001/routes/TP8_Route/plugins \
  --data "name=rate-limiting" \
  --data "config.second=5" \
  --data "config.hour=10000"

返回参数示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
{
    "id": "a1a63cad-e827-4eaf-aadb-b1d5c89bf5c0",
    "consumer": null,
    "protocols": [
        "grpc",
        "grpcs",
        "http",
        "https"
    ],
    "route": {
        "id": "7c5ed32d-0d89-47c5-9435-891fec7077b0"
    },
    "tags": null,
    "enabled": true,
    "name": "rate-limiting",
    "updated_at": 1760067842,
    "created_at": 1760067842,
    "instance_name": null,
    "service": null,
    "config": {
        "month": null,
        "year": null,
        "fault_tolerant": true,
        "hide_client_headers": false,
        "redis_ssl": false,
        "redis_ssl_verify": false,
        "header_name": null,
        "error_message": "API rate limit exceeded",
        "sync_rate": -1,
        "redis": {
            "password": null,
            "ssl": false,
            "ssl_verify": false,
            "server_name": null,
            "username": null,
            "database": 0,
            "port": 6379,
            "host": null,
            "timeout": 2000
        },
        "redis_database": 0,
        "redis_timeout": 2000,
        "redis_host": null,
        "policy": "local",
        "redis_username": null,
        "redis_password": null,
        "limit_by": "consumer",
        "redis_port": 6379,
        "redis_server_name": null,
        "error_code": 429,
        "path": null,
        "second": 5,
        "minute": null,
        "hour": 10000,
        "day": null
    }
}

前端审计

Rate Limiting插件前端审计界面

超过阈值时的阻断效果

当请求次数超过设定阈值时,插件会触发阻断:  
请求超过速率限制时的阻断提示