找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

975

积分

0

好友

139

主题
发表于 5 天前 | 查看: 10| 回复: 0

微服务架构与API网关的实践中,经常需要对客户端请求的URL路径进行重写,以适配后端服务的实际接口规范。例如,前端应用发起/api/v1/users的请求,而后端服务期望的路径是/users。此时,URL路径重写功能就显得至关重要。

Envoy Gateway作为基于Envoy Proxy构建的新一代Kubernetes原生网关,提供了强大且灵活的路由与请求/响应修改能力。本文将结合实际场景,详细演示如何在Envoy Gateway中配置URL重写功能,涵盖路径前缀替换、完整路径替换以及主机名重写。

Envoy Gateway架构示意图

实战一:重写URL前缀路径

场景需求
客户端请求路径为http://example.local/api/v1/who,但后端服务实际监听的路径是/who。我们的目标是通过网关自动将请求路径由/api/v1/who重写为/who

配置方法
通过创建HTTPRoute资源并配置URLRewrite过滤器来实现。关键点在于pathtype设置为ReplacePrefixMatch

cat <<'EOF' | kubectl apply -f -
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: simple
spec:
  hostnames:
  - example.local
  parentRefs:
  - group: gateway.networking.k8s.io
    kind: Gateway
    name: simple-gw
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /api/v1/who # 客户端访问的路径前缀
    filters:
    - type: URLRewrite
      urlRewrite:
        path:
          type: ReplacePrefixMatch # 替换匹配到的前缀
          replacePrefixMatch: /who # 重写后的路径
    backendRefs:
    - name: simple
      port: 80
EOF

验证效果
应用配置后,客户端访问/api/v1/who的请求将被网关透明地转发到后端服务的/who端点。

验证URL前缀重写

实战二:重写URL完整路径

场景需求
客户端可能会请求/status/healthz/status/readyz等不同路径,而后端服务仅提供一个统一的健康检查端点/ping。此时需要将匹配特定前缀的所有路径完整替换为目标路径。

配置方法
使用ReplaceFullPath类型,将匹配到的整个路径进行替换。

cat <<'EOF' | kubectl apply -f -
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: simple
spec:
  hostnames:
  - example.local
  parentRefs:
  - group: gateway.networking.k8s.io
    kind: Gateway
    name: simple-gw
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /status # 匹配以/status开头的所有路径
    filters:
    - type: URLRewrite
      urlRewrite:
        path:
          type: ReplaceFullPath # 替换整个路径
          replaceFullPath: /ping # 统一重写为/ping
    backendRefs:
    - name: simple
      port: 80
EOF

验证效果
无论客户端请求/status/healthz还是/status/readyz,网关都会将其重写为/ping后转发给后端。

验证URL完整路径重写

实战三:重写请求主机名

场景需求
在SaaS或多租户应用中,常使用不同子域名来区分租户,例如tenant1.simple.comtenant2.simple.com。后端服务可能需要一个统一的主机头(如www.simple.com)来进行处理。网关可以在转发前重写Host请求头。

配置方法
URLRewrite过滤器中配置hostname字段。

cat <<'EOF' | kubectl apply -f -
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: simple
spec:
  hostnames:
  - "*.simple.com" # 匹配所有simple.com的子域名
  parentRefs:
  - group: gateway.networking.k8s.io
    kind: Gateway
    name: simple-gw
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /
    filters:
    - type: URLRewrite
      urlRewrite:
        hostname: www.simple.com # 将请求的Host头重写为www.simple.com
    backendRefs:
    - name: simple
      port: 80
EOF

验证效果
访问tenant1.simple.comtenant2.simple.com时,后端服务接收到的请求的Host头都将变为www.simple.com

验证主机名重写

总结

通过Envoy Gateway的URLRewrite过滤器,我们可以轻松实现请求路径前缀、完整路径以及主机名的灵活重写。这一功能有效解耦了前端客户端与后端微服务的接口约定,提升了系统集成的灵活性与整洁度,是构建现代云原生应用网关层的关键能力之一。




上一篇:二级域名与子目录SEO策略:权重集中与架构选择的实战指南
下一篇:大模型职业发展路径全解析:六大岗位职责与系统学习指南
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-17 19:58 , Processed in 0.130162 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表