Express-Gateway:如何基于URL模式选择服务端点?
你的核心需求(把x.mydomain.com请求转发到x.internal.com)完全可以实现,而且能彻底摆脱硬编码大量apiEndpoints和CNAME的维护负担,下面给你具体的实现思路和配置示例:
1. 用通配符匹配所有子域名请求
首先保留你原有的通配符apiEndpoints配置,这样所有子域名的请求都会进入这条规则:
apiEndpoints: legacy: host: '*.mydomain.com' paths: '/v1/*'
2. 在Proxy政策中动态构造目标URL
不用提前定义固定的serviceEndpoints,而是直接在proxy政策里用请求上下文变量动态生成目标地址。主流API网关(比如Express Gateway、Tyk、Kong等)都支持在配置中使用表达式引用请求元数据(比如主机名、路径参数)。
以Express Gateway为例,你可以这样编写pipeline配置:
pipelines: default: apiEndpoints: - legacy policies: - proxy: - action: # 通过表达式替换主机名后缀,动态生成目标地址 target: "{{replace(request.hostname, '.mydomain.com', '.internal.com')}}"
这里的request.hostname会获取当前请求的完整主机名(比如customer1.mydomain.com),replace函数会自动把.mydomain.com替换成.internal.com,最终得到customer1.internal.com作为转发目标。
如果你的网关支持捕获组变量,还能更精准地提取子域名前缀:
apiEndpoints: legacy: # 用捕获组定义子域名变量 host: '{subdomain}.mydomain.com' paths: '/v1/*' pipelines: default: apiEndpoints: - legacy policies: - proxy: - action: target: "{{subdomain}}.internal.com"
这种方式更直观,直接引用捕获到的subdomain变量拼接目标URL即可。
3. 简化DNS配置:使用Wildcard CNAME
另外,你可以在DNS层面配置一条Wildcard CNAME记录,把*.mydomain.com直接指向你的网关地址。这样新客户的子域名不用单独添加CNAME记录,自动就能被网关接收处理,进一步降低维护成本。
总结
这种动态配置方案完全替代了硬编码大量apiEndpoints的模式,不管新增多少客户子域名,都不需要修改网关配置,只需要确保内部服务x.internal.com能正常访问即可。
内容的提问来源于stack exchange,提问作者unexplored

