跳到主要内容
版本:3.9.x

设置路由优先级和匹配条件 (Ingress Controller)

API7 网关支持配置路由优先级和高级匹配条件,以控制如何将请求路由到后端服务。

本教程介绍了如何使用 API7 Ingress Controller 定义路由优先级和匹配规则,从而基于请求头、查询参数等实现细粒度的请求路由。

前置条件

  1. 安装 API7 企业版
  2. 安装 API7 Ingress Controller 并启动网关。

配置路由和规则

为 HTTPRoute 创建一个 Kubernetes manifest 文件,如下所示:

httpbin-route.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
namespace: api7
name: httpbin
spec:
parentRefs:
- name: apisix
rules:
- matches:
- path:
type: PathPrefix
value: /*
backendRefs:
- name: httpbin
port: 80

创建另一个 Kubernetes manifest 文件,在目标 HTTPRoute 上配置路由优先级和请求匹配条件:

route-policy.yaml
apiVersion: apisix.apache.org/v1alpha1
kind: HTTPRoutePolicy
metadata:
namespace: api7
name: http-route-policy
spec:
targetRefs:
- group: gateway.networking.k8s.io
kind: HTTPRoute
name: httpbin
priority: 10
vars:
- - http_x_test_name
- ==
- http-route-policy
- - arg_test
- ==
- http-route-policy

❶ 将 name 配置为目标 HTTPRoute 元数据名称。

❷ 配置目标 HTTPRoute 的优先级。较高的数值对应较高的优先级。

❸ 匹配带有 HTTP 请求头 X-Test-Name: http-route-policy 的请求。

❹ 匹配带有查询参数 test=http-route-policy 的请求。

只有当 vars 中的两个条件都满足时,请求才会匹配到该路由。有关这些表达式的更多信息,请参见内置变量API7 表达式

将配置应用到你的集群:

kubectl apply -f httpbin-route.yaml -f route-policy.yaml

配置多个目标

如果你想要以多个 HTTPRoute 中的路由为目标,你可以配置更多目标:

route-policy.yaml
apiVersion: apisix.apache.org/v1alpha1
kind: HTTPRoutePolicy
metadata:
namespace: api7
name: http-route-policy
spec:
targetRefs:
- group: gateway.networking.k8s.io
kind: HTTPRoute
name: httpbin
- group: gateway.networking.k8s.io
kind: HTTPRoute
name: httpbin-1
priority: 10
vars:
- - http_x_test_name
- ==
- http-route-policy
- - arg_test
- ==
- http-route-policy

验证

通过端口转发将网关服务端口暴露给本地机器:

kubectl port-forward svc/api7-ee-3-gateway-gateway 9081:9081 &

向不匹配任何条件的路由发送请求:

curl "http://127.0.0.1:9080/ip"

你应该会看到 HTTP/1.1 404 Not Found 响应。

向匹配其中一个条件的路由发送另一个请求:

curl "http://127.0.0.1:9080/ip?test=http-route-policy"

你也应该会看到 HTTP/1.1 404 Not Found 响应。

最后,向匹配所有条件的路由发送请求:

curl "http://127.0.0.1:9080/ip?test=http-route-policy" -H "X-Test-Name: http-route-policy"

你应该会看到类似以下的响应:

{
"origin": "127.0.0.1"
}