设置路由优先级和匹配条件 (Ingress Controller)
API7 网关支持配置路由优先级和高级匹配条件,以控制如何将请求路由到后端服务。
本教程介绍了如何使用 API7 Ingress Controller 定义路由优先级和匹配规则,从而基于请求头、查询参数等实现细粒度的请求路由。
前置条件
- 安装 API7 企业版。
- 安装 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"
}