Kong Gateway管理员使用对象模型来定义其期望的流量管理策略。在该模型中,两个重要的对象是服务(services)和路由(routes)。服务和路由被协调地配置,以定义请求和响应在系统中经过的路由路径。
下面的高级概述显示请求到达路由(routes),并将其转发到服务(services),响应则沿相反路径进行返回:

服务是什么
在Kong Gateway中,服务是对现有上游应用程序的抽象。服务可以存储插件配置、策略等一系列对象,并且它们可以与路由关联。
在定义一个服务时,管理员需要提供一个名称和与上游应用程序的连接信息。连接细节可以在url字段中以单个字符串的形式提供,也可以单独提供协议、主机、端口和路径的值。
服务与上游应用程序之间存在一对多的关系,这使得管理员能够创建复杂的流量管理行为。
路由是什么
路由是指向上游应用程序内部资源的路径。将路由添加到服务中可以允许对底层应用程序进行访问。在Kong Gateway中,路由通常映射到通过Kong Gateway应用程序公开的端点。路由还可以定义匹配请求到相关服务的规则。因此,一个路由可以引用多个端点。基本的路由应该具有名称、路径或路径列表,并引用现有的服务。
您还可以使用以下选项配置路由:
- 协议(Protocols):用于与上游应用程序进行通信的协议。
 - 主机(Hosts):与路由匹配的域名列表。
 - 方法(Methods):与路由匹配的HTTP方法。
 - 头部(Headers):请求头部中预期出现的值列表。
 - 重定向状态码(Redirect status codes):HTTPS状态码。
 - 标签(Tags):可选的一组字符串,用于对路由进行分组。
 
管理服务和路由
以下教程将通过Kong Gateway管理员API来管理和测试服务和路由。Kong Gateway还提供其他配置管理选项,包括Kong Konnect和decK。
在本教程的这个部分中,您将完成以下步骤:
- 创建一个指向httpbin API的服务,该API提供了对HTTP请求和响应进行测试的功能。
 - 通过提供一个URL路径来定义路由,客户端可以在运行中的Kong Gateway上访问该路径。
 - 使用新的httpbin服务来回显一个测试请求,帮助您了解Kong Gateway是如何代理API请求的。
 
管理服务
1. 创建服务
要添加一个新的服务,请向Kong Gateway的Admin API的/services路由发送一个POST请求:
curl -i -s -X POST http://localhost:8001/services \
 --data name=example_service \
 --data url='http://httpbin.org'
 
这个请求指示Kong Gateway创建一个新的服务,映射到上游URL http://httpbin.org。
在我们的示例中,请求体包含两个字符串:
- name: 服务的名称
 - url: 用于填充服务的主机、端口和路径属性的参数
 
如果您的请求成功,您将从Kong Gateway收到一个201的响应头,确认您的服务已创建,响应正文将类似于:
{
 "host": "httpbin.org",
 "name": "example_service",
 "enabled": true,
 "connect_timeout": 60000,
 "read_timeout": 60000,
 "retries": 5,
 "protocol": "http",
 "path": null,
 "port": 80,
 "tags": null,
 "client_certificate": null,
 "tls_verify": null,
 "created_at": 1661346938,
 "updated_at": 1661346938,
 "tls_verify_depth": null,
 "id": "3b2be74e-335b-4f25-9f08-6c41b4720315",
 "write_timeout": 60000,
 "ca_certificates": null
}
 
没有在创建请求中显式提供的字段将根据当前Kong Gateway配置自动赋予默认值。
2. 查看服务配置
当您创建一个服务时,Kong Gateway会为它分配一个唯一的ID,如上面的响应中所示。id字段或创建服务时提供的名称可以用于在后续请求中标识该服务。这是服务的URL,其形式为/services/{服务名称或ID}。
要查看服务的当前状态,请向服务URL发送一个GET请求。
curl -X GET http://localhost:8001/services/example_service
 
一个成功的请求将在响应正文中包含您的服务的当前配置,如以下片段所示:
{
 "host": "httpbin.org",
 "name": "example_service",
 "enabled": true,
 ...
}
 
3. 更新服务
可以通过向服务URL发送PATCH请求来动态更新现有的服务配置。
要将服务的重试次数从5更改为6,请发送以下PATCH请求:
curl --request PATCH \
 --url localhost:8001/services/example_service \
 --data retries=6
 
响应正文包含了完整的服务配置,包括更新后的值:
{
 "host": "httpbin.org",
 "name": "example_service",
 "enabled": true,
 "retries": 6,
 ...
}
 
4. 列出服务
您可以通过向基本的/services URL发送GET请求来列出所有当前的服务。
curl -X GET http://localhost:8001/services
 
Admin API文档提供了完整的服务更新规范。
您还可以通过在浏览器中导航到以下URL来查看Kong Manager UI中的服务配置:
Kong Manager OSS:http://localhost:8002/services
 Kong Manager Enterprise:http://localhost:8002/default/services,其中default是工作区名称。
管理路由
1. 创建路由
路由定义了Kong Gateway如何代理请求。您可以通过向服务URL发送POST请求来创建与特定服务关联的路由。
在/mock路径上配置一个新的路由,将流量定向到之前创建的example_service服务:
curl -i -X POST http://localhost:8001/services/example_service/routes \
 --data 'paths[]=/mock' \
 --data name=example_route
 
如果路由成功创建,API将返回一个201响应代码和一个类似于以下的响应正文:
{
 "paths": [
   "/mock"
 ],
 "methods": null,
 "sources": null,
 "destinations": null,
 "name": "example_route",
 "headers": null,
 "hosts": null,
 "preserve_host": false,
 "regex_priority": 0,
 "snis": null,
 "https_redirect_status_code": 426,
 "tags": null,
 "protocols": [
   "http",
   "https"
 ],
 "path_handling": "v0",
 "id": "52d58293-ae25-4c69-acc8-6dd729718a61",
 "updated_at": 1661345592,
 "service": {
   "id": "c1e98b2b-6e77-476c-82ca-a5f1fb877e07"
 },
 "response_buffering": true,
 "strip_path": true,
 "request_buffering": true,
 "created_at": 1661345592
}
 
2. 查看路由配置
与服务一样,当您创建一个路由时,Kong Gateway会为其分配一个唯一的ID,如上面的响应中所示。id字段或创建路由时提供的名称可以用于在后续请求中标识路由。路由 URL 可以采用以下两种形式之一:
- /services/{服务名称或ID}/routes/{路由名称或ID}
 - /routes/{路由名称或ID}
 
要查看example_route路由的当前状态,请向路由URL发送一个GET请求:
curl -X GET http://localhost:8001/services/example_service/routes/example_route
 
响应正文包含了您的路由的当前配置:
{
 "paths": [
   "/mock"
 ],
 "methods": null,
 "sources": null,
 "destinations": null,
 "name": "example_route",
 "headers": null,
 "hosts": null,
 "preserve_host": false,
 "regex_priority": 0,
 "snis": null,
 "https_redirect_status_code": 426,
 "tags": null,
 "protocols": [
   "http",
   "https"
 ],
 "path_handling": "v0",
 "id": "189e0a57-205a-4f48-aec6-d57f2e8a9985",
 "updated_at": 1661347991,
 "service": {
   "id": "3b2be74e-335b-4f25-9f08-6c41b4720315"
 },
 "response_buffering": true,
 "strip_path": true,
 "request_buffering": true,
 "created_at": 1661347991
}
 
3. 更新路由
与服务一样,可以通过向路由URL发送PATCH请求来动态更新路由。
标签是一个可选的字符串集合,可以与路由关联用于分组和过滤。您可以通过向服务端点发送PATCH请求并指定一个路由来分配标签。
通过为路由分配一个值为tutorial的标签来更新路由:
curl --request PATCH \
 --url localhost:8001/services/example_service/routes/example_route \
 --data tags="tutorial"
 
上面的示例使用了服务和路由名称字段作为路由URL。
如果成功应用了标签,响应正文将包含以下JSON值:
...
"tags":["tutorial"]
...
 
4. 列出路由
Admin API还支持列出当前配置的所有路由:
curl http://localhost:8001/routes
 
该请求将返回HTTP 200状态码和一个JSON响应正文,其中包含在此Kong Gateway实例上配置的所有路由的对象数组。您的响应应该如下所示:
{
 "next": null,
 "data": [
   {
     "paths": [
       "/mock"
     ],
     "methods": null,
     "sources": null,
     "destinations": null,
     "name": "example_route",
     "headers": null,
     "hosts": null,
     "preserve_host": false,
     "regex_priority": 0,
     "snis": null,
     "https_redirect_status_code": 426,
     "tags": [
       "tutorial"
     ],
     "protocols": [
       "http",
       "https"
     ],
     "path_handling": "v0",
     "id": "52d58293-ae25-4c69-acc8-6dd729718a61",
     "updated_at": 1661346132,
     "service": {
       "id": "c1e98b2b-6e77-476c-82ca-a5f1fb877e07"
     },
     "response_buffering": true,
     "strip_path": true,
     "request_buffering": true,
     "created_at": 1661345592
   }
 ]
}
 
Admin API文档中提供了管理路由对象的完整规范。
您还可以通过在浏览器中导航到以下URL来查看Kong Manager UI中的路由配置:http://localhost:8002/default/routes,其中default是工作区名称。
代理请求
Kong是一个API网关,它接收来自客户端的请求,并根据当前的配置将它们路由到适当的上游应用程序。使用之前配置的服务和路由,您现在可以通过http://localhost:8000/mock访问https://httpbin.org/。
默认情况下,Kong Gateway的Admin API在端口8001上监听管理请求,这有时被称为控制平面。客户端使用端口8000进行数据请求,这通常被称为数据平面。
Httpbin提供了一个/anything资源,它会将关于发送给它的请求的信息回复给客户端。通过Kong Gateway代理一个请求到/anything资源上。
curl -X GET http://localhost:8000/mock/anything
 
您应该会看到类似以下的响应:
{
 "startedDateTime": "2022-08-24T13:44:28.449Z",
 "clientIPAddress": "172.19.0.1",
 "method": "GET",
 "url": "http://localhost/anything",
 "httpVersion": "HTTP/1.1",
 "cookies": {},
 "headers": {
   "host": "httpbin.org",
   "connection": "close",
   "accept-encoding": "gzip",
   "x-forwarded-for": "172.19.0.1,98.63.188.11, 162.158.63.41",
   "cf-ray": "73fc85d999f2e6b0-EWR",
   "x-forwarded-proto": "http",
   "cf-visitor": "{\"scheme\":\"http\"}",
   "x-forwarded-host": "localhost",
   "x-forwarded-port": "80",
   "x-forwarded-path": "/mock/anything",
   "x-forwarded-prefix": "/mock",
   "user-agent": "curl/7.79.1",
   "accept": "*/*",
   "cf-connecting-ip": "00.00.00.00",
   "cdn-loop": "cloudflare",
   "x-request-id": "1dae4762-5d7f-4d7b-af45-b05720762878",
   "via": "1.1 vegur",
   "connect-time": "0",
   "x-request-start": "1661348668447",
   "total-route-time": "0"
 },
 "queryString": {},
 "postData": {
   "mimeType": "application/octet-stream",
   "text": "",
   "params": []
 },
 "headersSize": 588,
 "bodySize": 0
}
 
                


















