路由(Routes)
路由决定在请求到达Kong Gateway之后如何(以及是否)将其发送到其服务。服务代表后端API,而路由定义了对客户端暴露的内容。
一个单独的服务可以有多个路由。一旦匹配到路由,Kong Gateway会将请求代理到其关联的服务。
路由与服务的交互
路由与服务结合使用,可以让您通过Kong Gateway向应用程序暴露服务。Kong Gateway通过使用路由将服务与应用程序进行抽象。由于应用程序始终使用路由进行请求,因此对服务的更改(如版本控制)不会影响应用程序的请求方式。路由还允许多个应用程序使用同一个服务,并根据使用的路由应用不同的策略。
例如,如果有一个外部应用程序和一个内部应用程序需要访问example_service服务,但是外部应用程序在查询服务的频率上应受到限制,以确保不会发生拒绝服务的情况。如果为服务配置了速率限制策略,并且当内部应用程序调用服务时应用该策略,那么内部应用程序也会受到限制。路由可以解决这个问题。
在上述例子中,可以创建两个路由,例如/external和/internal,并且这两个路由都可以指向example_service服务。可以配置策略来限制使用/external路由的频率,并将该路由提供给外部客户端使用。当外部客户端尝试通过Kong Gateway使用/external访问服务时,他们会受到速率限制。但是当内部客户端通过Kong Gateway使用/internal访问服务时,内部客户端不会受到限制。
请求是如何路由的
对于每个传入的请求,Kong Gateway必须根据定义的路由决定由哪个服务处理。在3.0版本中,Kong Gateway引入了一个新的路由器,可以在两种模式下运行,传统兼容模式(traditional_compat mode)和表达式模式(expressions mode)。传统兼容模式的配置方式与先前版本相同,而表达式模式使用了新的配置方案。建议新的部署使用表达式路由器,因为它更强大和具有更多表达能力。
路由器的默认模式是traditional_compat,以下部分描述了它的运行方式。traditional_compat模式旨在与Kong Gateway 3.x之前的版本中的路由器行为相同。有关表达式模式的描述,请参阅How to Configure Routes using Expressions - v3.5.x | Kong Docs。
通常情况下,路由器会根据优先级对所有定义的路由进行排序,并使用优先级最高的匹配路由来处理请求。如果有多个具有相同优先级的匹配路由,则不定义将使用哪个匹配路由,Kong Gateway将根据其内部数据结构的组织方式选择其中一个来使用。
如果一个路由包含前缀或正则表达式路径,那么路由的优先级将针对每个路径单独计算,并相应地路由请求。
在traditional_compat模式下,路由的优先级按照以下降序重要性顺序确定:
1. 优先级分数(Priority points)
2. 通配符主机(Wildcard hosts)
3. 头部计数(Header count)
4. 正则表达式和前缀路径(Regular expressions and prefix paths)
优先级分数(Priority points)
对于路由的每个方法、主机、头部和SNIs的存在,将为该路由添加一个"优先级点"。 "优先级点"的数量确定了路由被考虑的整体顺序。具有更高"优先级点"值的路由将在具有较低值的路由之前考虑。这意味着如果一个路由有定义方法,而第二个路由有定义方法和头部,那么第二个路由将比第一个路由更早被考虑。
通配符主机(Wildcard hosts)
在具有相同"优先级点"值的路由中,那些具有任何通配符主机(wildcard host)指定的路由将在没有指定任何通配符主机(或没有主机)的路由之后被考虑。
头部计数(Header count)
根据所指定的头部数量,对生成的组进行排序,具有较高数量头部的路由优先级高于具有较少数量头部的路由。
正则表达式和前缀路径(Regular expressions and prefix paths)
在具有相等优先级的结果路由组中,路由器按照以下方式对路由进行排序:
- 首先考虑具有正则表达式路径的路由,并根据其regex_priority值进行排序。具有较高regex_priority值的路由将优先考虑于具有较低regex_priority值的路由。
- 没有正则表达式路径的路由按照它们路径的长度进行排序。具有较长路径的路由将优先考虑于具有较短路径的路由。
对于具有多个路径的路由,每个路径将被单独考虑以确定优先级。实际上,这意味着对于每个路径都存在单独的路由。
正则表达式(Regular expressions)
在路由中使用的正则表达式比简单的前缀路由需要更多的资源来进行评估。如果必须评估许多正则表达式来路由请求,Kong Gateway引入的延迟可能会增加,CPU使用率也可能会增加。在具有数千个路由的安装中,通过将正则表达式路由替换为简单的前缀路由,可以改善Kong Gateway的吞吐量和延迟。如果需要使用正则表达式来执行精确路径匹配,则使用表达式路由器( expressions router)将显着提高Kong Gateway在这种情况下的性能。
自版本3.0起,如果路由器在expressions或traditional_compatible模式下运行,Kong Gateway将使用Rust编程语言附带的正则表达式引擎。之前的版本使用PCRE库来评估正则表达式。虽然这两个引擎在很大程度上是兼容的,但两者之间存在细微差异。如果您在使用正则表达式路由时遇到问题,请参考您使用的引擎的相关文档。
使用路由动态重写请求的URL
路由可以动态配置,将请求的URL重写为上游的不同URL。例如,您的旧版上游端点可能有一个基本URI,如/api/old/。然而,您希望公开访问的API端点现在被命名为/new/api。为了将服务的上游端点路由到新的URL,您可以设置一个路径为/api/old/的服务,并设置一个路径为/new/api的路由。
Kong Gateway还可以通过在路由路径和请求转换高级插件中使用正则表达式捕获组来处理更复杂的URL重写情况。例如,当您必须将/api/<function>/old替换为/new/api/<function>时,可以使用这种方法。
Kong Gateway 3.0.x或更高版本附带了一个新的路由器。新的路由器可以使用正则表达式捕获组,使用一种称为Expressions的领域特定语言来描述路由。Expressions可以使用正则表达式将路由或路径描述为模式。
路由的插件
您还可以使用插件与路由进行交互。这使您能够进一步提升Kong Gateway的路由能力。
以下是一些相关插件:
- LDAP认证高级版:通过用户名和密码保护,为Kong Gateway集群、路由和服务提供安全性。
- 双向TLS认证:通过客户端证书和双向TLS认证,为路由和服务提供安全性。
- 基于请求头的路由:根据请求头来路由请求。
- 高级路由转换器:通过改变上游服务器、端口或路径来转换路由。
路由配置
在您开始对一个服务进行请求之前,您必须为其添加一个路由。
您可以使用以下方法将路由添加到Kong Gateway的服务中:
- 通过Admin API发送HTTP请求
- 使用Kong Manager用户界面创建路由