我正在为全球外部 HTTP(S) 负载均衡器设置流量管理。我有两个后端 Cloud Run 服务,
serverless-lb-www-service
和 serverless-lb-api-service
,我想从同一 IP/域提供服务。
我想这样配置它们:
example.com
-> serverless-lb-www-service
example.com/api
-> serverless-lb-api-service
我可以使用简单的路由规则来服务流量半预期:
路径 | 后端 |
---|---|
/* | 无服务器-lb-www-服务 |
/API | 无服务器-lb-api-服务 |
/api/* | 无服务器-lb-api-服务 |
但是,我遇到了一个问题,我尝试访问不是根 API 端的端点,例如
example.com/api/test
。我总是能看到我所期望的回应 example.com/api
。
我相信这与我的API(运行express.js)接收路径
/api
有关,而它期望从那里提供该路线/test
。我想我可能需要设置重写以在访问 API 时删除 /api
任何帮助将不胜感激。谢谢
更新
我可以确认 API 中记录的请求都带有
/api
前缀。我可以通过更改所有 API 路由处理程序以在生产环境中使用 /api
前缀来解决我的问题。然而,我仍然宁愿通过路径重写来做到这一点,这样应用程序代码在所有环境中都是相同的
您可以自定义主机和路径规则。您可以通过此链接按照步骤操作。它还使用 Cloud Run 服务,可能会帮助您解决重写路径问题。
注意:如果链接不会重定向并显示“自定义主机和路径规则”步骤,请一直向下滚动。
您可以使用包含 URL 重写的 URL 映射来完成您想要的任务。
这是您的用例的示例,其中匹配
/api/test
的路由将被重写到您的 api 服务,就像 /test
:
defaultService: projects/xxx/global/backendServices/your-default-backend
name: path-matcher
routeRules:
- matchRules:
- prefixMatch: /
priority: 1
service: projects/xxx/global/backendServices/serverless-lb-www-service
- matchRules:
- pathTemplateMatch: /api/{path=**}
priority: 2
service: projects/xxx/global/backendServices/serverless-lb-api-service
routeAction:
urlRewrite:
pathTemplateRewrite: /{path}
这里是 URL 映射文档的链接:https://cloud.google.com/load-balancing/docs/url-map-concepts