什么是网关
网关是一种高性能、低延迟的流量负载均衡服务。OpenResty 是一个基于 Nginx 与 LuaJIT 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大部分依赖。OpenResty 使你不再需要使用 C、C++ 编写复杂的扩展模块,使用 Lua 就能够快速构建出高性能网管系统。
Kong 是基于 Nginx 和 OpenResty。
Kong 的介绍
Kong 数据库支持 PostgreSQL、Cassandra。
Kong的基础配置
在默认情况下,Kong 监听以下端口:
- 8000:监听来自客户端的 Http 请求流量,并将其路由转发给上游服务器;
- 8443:监听传入的 HTTPS 请求流量,并将其路由转发给上游服务器;
- 8001:监听来自 Kong Admin API 的 Http 请求流量;
- 8444:监听来自 Kong Admin API 的HTTPS 请求流量;
Kong 的基础对象
Kong 的基础对象主要分为 8 大类,有:
- 路由(route)
- 服务(service)
- 上游(upstream)
- 目标(target)
- 消费者(consumer)
- 插件(plugin)
- 证书(certificate)
- SNI(Server Name Indication,服务器名称指示)
路由
路由定义了客户端请求与服务之间的匹配规则,它支持精准匹配、模糊匹配以及正则匹配,是请求的入口点。每个路由都与特定的服务相关联,一个服务下可以有一个或多个与之相关联的路由,每个路由匹配到的请求都将被代理到与该路由关联的服务。路由和服务之间的组合提供了自由、灵活、多变的路由机制,基于此,我们可以定义更为细粒度的匹配入口点。
一个路由至少需要一个匹配规则和协议。
-
对于 HTTP 协议,至少设置 methods、hosts、headers 或 paths。
- 对于 HTTPS 协议,至少设置 methods、hosts、headers、paths 或 snis。
- 对于 TCP 协议,至少设置 sources 或 destinations。
- 对于 TLS 协议,至少设置 sources 或 destinations 或 snis。
- 对于 GRPC 协议,至少设置 hosts、headers 或 paths。
- 对于 GRPCS 协议,至少设置 hosts、headers、paths 或 snis。
| 属性名称 | 说明 |
|---|---|
| name | 路由名称(可选) |
| protocols | 允许的协议列表。默认值 [“http”, “https”] |
| methods | 路由匹配的 HTTP 方法。 |
服务
服务是用于管理上游微服务的入口点,用于将客户端的请求流量发送给对应的上游服务器。其主要属性是 protocol、host、port 和 path。服务与路由相关联,一个服务下可以包含多个路由。路由是客户端请求的入口点,定义了匹配客户端请求和服务的规则。
| 属性名称 | 说明 |
|---|---|
| name | 服务名称(可选) |
| retries | 代理失败后的重试次数,默认值为 5。(可选) |
| protocol | 与上游服务器通信的协议。可接受的值为GRPC, GRPCS, HTTP, HTTPS, TCP, TLS。默认值为 HTTP。 |
| host | 上游服务器的名称或域名。 |
| port | 上游服务器的端口。默认值为 80。 |
| path | 从请求到上游服务器之间要附加的使用的路径。(可选) |
| connect_timeout | 建立从请求到上游服务器的连接的超时时间,默认 60000(毫秒)。(可选) |
| client_certificate | 在与上游服务器进行 TLS 握手时所使用的客户端证书。 |
上游
上游服务表示一个虚拟主机,我们可以对上游服务的多个目标节点进行负载均衡和健康检测。负载均衡支持多种散列的目标节点选择策略。健康检测有主动和被动两种模式,该机制既可以将探测到的不健康上游服务目标节点禁用,使之不再参与负载,也可以将之启用后重新参与负载。
| 属性名称 | 说明 |
|---|---|
| algorithm | 使用的负载均衡算法。默认值为round-robin(轮询) |
| tags | 与上游相关的一组可选字符串,用于分组和过滤。(可选) |
| host_header | 通过 Kong 代理请求时,主机头所使用的名称。(可选) |
目标
目标节点代表一个真实的物理服务,通常为 IP 地址和端口的组合,其中端口用来表示后端上游服务器上的某个具体节点实例。每个上游都可以包含多个目标节点地址,在运行过程中可以动态的添加或者删除。此外,每个目标节点还可以设置不同的权重。
因为上游维护着目标节点更改的历史记录,所以不能随意删除或者修改目标节点。若要禁用目标节点,需要先发布一个权重为 0 的新目标节点,再使用 DELETE 方法将之删除。
| 属性名称 | 说明 |
|---|---|
| target | 目标地址(IP 地址或者主机名)和端口(port)。如果主机名解析为 SRV 记录,则端口值将被 DNS 或 Consul 记录中的值覆盖。 |
| weight | 目标在上游负载均衡器内获得的权重(0 到 1000)。如果主机名解析为 SRV 记录,则权重值将被 DNS 记录中的值覆盖。默认值为100。(可选) |
| tags | 与目标相关的一组可选字符串,用于分组和过滤。(可选) |
消费者
消费者代表一个具体的用户,是客户端请求的发起者。消费者 ID 可以作为主要的数据存储,可以与业务数据库的用户信息相映射、关联,并为身份授权和鉴权功能提供更多策略。
| 属性名称 | 说明 |
|---|---|
| username | 消费者的唯一用户名。username 属性或 custom_id 属性需要与请求一起发送。 |
| custom_id | 用于存储实际业务消费者的唯一 ID。此字段或 username 属性需要与请求一起发送。 |
| tags | 与消费者相关的一组可选字符串,用于分组和过滤。(可选) |
插件
插件表示在请求/响应生命周期内执行的功能集。通过此机制,可以在 Kong 的服务和路由上添加、配置和扩展自定义功能,例如身份验证、限额及其他特殊的个性化需求。在向服务或路由添加某个插件配置后,客户端对该服务的每个请求都将运行此插件。插件也可以应用于某些特定消费者,或者被配置为全局插件。
对于每个请求,配置的插件只能运行一次。我们可以为插件设置外部参数,比如可以使用各种自定义的参数集合或者 Kong 的内置上下文参数。
插件配置的实体越多、越具体,其优先级就越高。其优先级顺序如下
- 插件组合配置:路由、服务和消费者。(消费者必须经过身份验证)
- 在路由和消费者的组合上配置的插件。(消费者必须经过身份验证)
- 在服务和消费者的组合上配置的插件。(消费者必须经过身份验证)
- 在路由和服务的组合上配置的插件。
- 在消费者上配置的插件。(消费者必须经过身份验证)
- 在路由上配置插件。
- 在服务上配置的插件。
- 全局插件。
| 属性名称 | 说明 |
|---|---|
| name | 插件的名称。 |
| route | 用于存储实际业务消费者的唯一 ID。此字段或 username 属性需要与请求一起发送。(可选) |
| service | 设置仅当指定服务中的某一个路由在接收到请求时,插件才会运行。其默认值为null。(可选) |
| comsumer | 设置仅当插件匹配到指定的消费者时,插件才会运行。其默认值为null。(可选) |
| enabled | 是否启用插件,默认值为TRUE。(可选) |
| tags | 与插件相关的一组可选字符串,用于分组和过滤。(可选) |
证书
证书对象代表公共证书,可以选择与之相对应的私钥配对。这些对象被 Kong 用来处理加密请求的 SSL/TLS 终端,或在验证客户端/服务的对等证书时用作受信任的 CA 存储。证书可以选择与 SNI 对象关联,以将证书/密钥对绑定到一个或多个主机域名上。
| 属性名称 | 说明 |
|---|---|
| cert | SSL 密钥对的 PEM 编码的公共证书链。 |
| key | SSL 密钥对的 PEM 编码的私钥。 |
| tags | 与证书相关的一组可选字符串,用于分组和过滤。(可选) |
SNI
SNI 表示从域名到证书的多对一映射,用来解决一个服务器使用多个域名和证书的问题。一个证书对象可以同时有多个与之相关联的域名。当 Kong 接收到 SSL 终端的请求时,将使用与其中的域名属性相关联的 SNI 来查找对应的泛域名证书对象。
| 属性名称 | 说明 |
|---|---|
| name | 与证书关联的 SNI 名称。 |
| tags | 与 SNI 相关的一组可选字符串,用于分组和过滤。(可选) |
| certificate | 与 SNI 域名相关联的证书的 ID(UUID)。只有证书具有与之关联的有效私钥,SNI 对象才能使用该证书。 |
对象之间的关系
| 对象 | 对象 | 关系 | 关联 |
|---|---|---|---|
| 服务 | 路由 | 1:N | 必须 |
| 服务 | 上游 | 1:1 | 可选 |
| 服务 | 插件 | 1:N | 可选 |
| 路由 | 插件 | 1:N | 可选 |
| 上游 | 目标 | 1:N | 必须 |
| 证书 | SNI | 1:N | 必须 |
| 插件 | 1:N | 可选 |

本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。