操作场景
您需要为需要转发的服务配置路由,以便网关能根据路由匹配条件进行路由匹配,并将请求转发到对应的服务地址从而实现动态代理。本文介绍云原生 API 网关路由匹配方式,以及如何为云原生网关添加路由并验证转发效果。
路由匹配说明
路由属性
根据不同的协议,云原生 API 网关支持配置不同属性用于进行路由匹配:
请求协议 | 用于路由匹配的属性 |
HTTP/HTTPS | 请求 HTTP 方法(Request HTTP method) |
| 主机名(Host) |
| 请求头(Request Header,自定义请求头) |
| 请求路径(Request path) |
| 请求 SNI(Request SNI),仅用于 HTTPS 场景 |
TCP/TLS 协议 | 请求目标(Request Destination) |
| 请求 SNI(Request SNI),仅用于 TLS 场景 |
gRPC/gRPCS 协议 | 主机名(Host) |
| 请求头(Request Header,自定义请求头) |
| 请求路径(Request path) |
| 请求 SNI(Request SNI),仅用于 GRPCS 场景 |
配置路由时,每个属性都是可选的,但至少需要指定上述属性中的一个。例如,仅指定 Host 为 “
*.example.com
”,则所有来自该域名及其子域名的请求都可能匹配此路由。路由属性说明
主机名(Host)
云原生 API 网关支持以下两种主机名:
精确主机名:基于 Host 头进行路由是最常见的方式,可通过路由的 Host 字段配置。例如,配置 Host 为
["example.com", "service.com"]
,则客户端请求的 Host 头必须为这两个值之一才能匹配该路由。通配符主机名:为了提供灵活性,云原生 API 网关支持配置带有通配符的主机名,通配符主机名在域的最左侧 或最右侧标签中只能包含一个星号。例如
*.example.com
将允许主机值(例如 a.example.com
)与 x.y.example.com
匹配。example.*
将允许主机值(例如 example.com
)、与example.org
匹配。请求头(Request Header)
除 Host 头外,也可以使用其他自定义请求头进行路由。例如,配置 headers.region=north,则请求头中包含 Region: North 的请求将匹配该路由。
说明:多个请求头之间是逻辑 “与” 关系,而其值是逻辑 “或” 关系,即请求必须包含所有配置的 headers 键,且对于每个键,其值只需匹配其中一个配置值即可。
请求路径(Request path)
云原生 API 网关支持配置以下路径匹配方式:
前缀匹配:请求 URL 以配置的路由路径前缀开头即能匹配,例如配置
/api/v1/
,则 /api/v1/users
、/api/v1/orders
等都可匹配。正则匹配:通过正则表达式定义路由匹配规则,请求 URL 符合正则模式才能匹配,例如
/api/v1/[a-z]+/[0-9]+
可匹配 /api/v1/users/123
。请求 HTTP 方法(Request HTTP method)
请求方法指根据 HTTP 方法(例如 GET、POST、PUT 等)匹配请求。请求方法支持配置多个值,默认值为空(即不根据方法进行路由)。
例如,配置请求方法为
["GET", "HEAD"]
的路由,将匹配 GET 和 HEAD 请求,但不匹配 POST 或 DELETE 请求。您可以为不同的 HTTP 方法配置不同的插件,例如对 GET 请求不进行认证,对 POST 请求应用认证和限流插件。请求目标(Request Destination)
仅适用于 TCP 和 TLS 路由,通过目标端口进行匹配。
请求 SNI(Request SNI)
在使用安全协议(https、grpcs、tls)时,Server Name Indication 可作为路由属性。例如,配置 SNI 为
["foo.test", "example.com"]
的路由,将匹配在 TLS 连接的 SNI 扩展中设置了相应主机名的传入请求。SNI 路由适用于 TLS 及基于 TLS 的其他协议(如 HTTPS),且在路由匹配时,只要路由中指定的任何一个 SNI 与请求的 SNI 匹配即可。SNI 在 TLS 握手时确定,连接建立后无法修改,因此使用同一 keepalive 连接的多个请求在进行路由匹配时将具有相同的 SNI 主机名,与 Host 头无关。虽然可以创建 SNI 和 Host 头不匹配的路由,但通常不建议这样做。请求匹配条件
对于一个请求要匹配路由,必须满足以下条件:
1. 请求中必须包含路由配置中设置的所有字段。例如,如果路由配置了 Host 和 paths,则请求中必须有对应的主机名和路径信息。
2. 请求中字段的值必须至少匹配配置值中的一个。例如,路由的 Host 配置为
["example.com", "test.com"]
,则请求的 Host 头为 “example.com” 或 “test.com” 时满足条件;若 paths 配置为 ["/api/v1/products", "/api/v1/orders"]
,请求路径为 “/api/v1/products/list” 或 “/api/v1/orders/123” 等以配置路径开头的都可匹配。请求匹配优先级
当一个请求可能匹配多个路由时,按照以下优先级进行匹配:
1. 根据匹配到的路由属性数量进行判断:匹配到的路由属性数量越多,优先级越高。
2. 根据主机名 Host 进行判断:使用精确 Host 的请求>使用通配 Host 的请求。
3. 根据请求头进行判断:匹配到的请求头数量越多,优先级越高。
4. 根据路径进行判断:正则匹配 > 前缀匹配。
对于正则匹配,存在以下优先级:
1. 根据正则优先级(Regex priority)进行匹配:默认为0,值越大优先级越高。
2. 正则优先级相同时,依据创建时间进行判断:创建时间越早,优先级越高。
操作步骤
添加路由
1. 登录 微服务平台控制台。
2. 在左侧导航栏单击路由管理,在页面上方选择好实例后,单击服务页签。
3. 点击要配置的服务名称,进入服务路由管理页面。
4. 在左上角单击新建,填写路由基本信息。
当后端请求协议为 HTTP、HTTPS 时,需要配置的参数如下:
参数 | 是否必选 | 说明 |
路由名称 | 否 | 路由名称允许为空,支持中文,英文大小写,数字,-_~。 |
请求协议 | 是 | 支持 HTTP&HTTPS、HTTPS。 |
匹配规则 | 是 | 请求方法、请求路径、Host 需至少配置一种;Header 可选配置。 |
Strip Path | 否 | 当通过请求路径匹配到路由时,从后端服务请求 URL 中去除匹配前缀。默认开启。 |
保留 Host | 否 | 请求后端时是否使用请求 Host,默认关闭。 |
请求缓冲 | 否 | 默认开启。开启时,网关会缓存客户端请求,再分块转发到后端服务;关闭后,网关在接受到客户端请求后将直接转发给后端服务。如果配置的插件需读取请求 body,不支持关闭缓冲。 |
响应缓冲 | 否 | 默认开启。开启时,网关会先缓存后端服务响应,再统一返回客户端;关闭后,网关将直接将响应数据返回客户端。如果关联的插件需读取响应 body,不支持关闭缓冲。 |

说明:
1. 如需配置正则路由,只需将请求路径配置为正则表达式即可。
2. Host 大小写敏感。
当后端请求协议为 TCP/UDP 时,填写路由名称和请求端口即可。

5. 单击下一步,进入路由后端配置,确认后端服务信息无误后提交。

单服务:表示当前路由转发请求到后端单个服务。
多服务:暂不支持多服务。
6. 单击提交,完成路由创建,在路由管理 > 路由列表页面,可以看到创建好的路由,代表创建成功。

7. 在路由列表右上角,您可以切换至 YAML 视图查看信息,

验证请求转发
发起 API 请求,验证转发到注册中心/容器集群中的服务。
应用场景1:强制 HTTPS
场景说明
HTTPS 通过数字证书、加密算法以及非对称密钥等技术对信息进行加密处理,有效的保证了数据在传输过程中的安全性和完整性。在一些信息安全要求极高的场景下,需要实现只有 HTTPS 请求才能访问服务,如果是 HTTP 请求则需要完成 HTTP 到 HTTPS 的自动跳转,整个过程对用户来讲是透明的、无感知的。
操作方式
1. 创建/编辑路由指定请求协议为 HTTPS,设置重定向状态码为 301(即 Moved Permanently,永久重定向)。

2. 使用 HTTP 请求路由,可以看到请求返回 301 状态码(表示跳转),Location 重定向为 HTTPS 请求。

