Google App Engine API + 静态架构

Google App Engine API + static architecture

我正在尝试(配置)构建 JS 客户端 + NodeJS 服务器应用程序以将其托管在 Google Cloud AppEngine(可能还有其他 GCP 资源)上的最佳方式。所以我在这里寻找建议/最佳实践。

我们有一个 API 服务器 运行 正在非默认 AppEngine 服务上运行,并且希望能够 运行 几个,例如development/staging/production 同一项目的版本(如果可能)。

我们想在此系统上托管/提供我们的静态客户端应用程序,因为我们想使用相同的域来指向它。

在我们正常的基于服务器的设置中,客户端应用程序在 domain.com/ 上 proxied/served,对 API 的请求在 domain.com/v1/

我一直在研究不同的选项 - 在 AppEngine 上托管一个单独的静态站点 运行ning 并使用 dispatch.yaml 尝试路由请求 - 此选项似乎不适用于域前缀,只有通配符,例如

dispatch:
- url: "my-client-service-project.appspot.com/"
  service: my-client-service
- url: "my-client-service-project.appspot.com/v1/*"
  service: my-backend-service

不起作用,但是:

- url: "*/v1/*"
  service: my-backend-service

有,我们不想要,因为我们想 运行 dev, staging & 生产 如果可能的话。

我一直在寻找的另一个选项是将静态文件夹托管为我的应用程序的一部分,但我似乎也无法正常工作,这是我的 app.yaml 中的片段:

handlers:
  - url: /.*
    static_files: client/dist/index.html
    upload: frontend/dist/index.html
  - url: /v1/*
    script: dist/index.js

我的猜测是 script 可能与 Python 应用程序的工作方式不同,但我可能是错的 - 文档不是很清楚。

理想情况下,我想在存储上托管客户端前端静态文件并指向 AppEngine API 服务器(而不是专门指向客户端的域,例如 /v1/auth/login而不是 my-backend-service-project.appspot.com/v1/

参考文献:

Node.js + static content served by Google App Engine

https://cloud.google.com/appengine/docs/flexible/nodejs/serving-static-files

https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed#routing_via_url

https://cloud.google.com/appengine/docs/standard/python/config/appref

https://cloud.google.com/appengine/docs/standard/python/config/dispatchref

首先:您混淆了标准和灵活的 env 文档 - 这不是一个好主意,因为它们的工作方式不同。参见

由于您的应用是 Node.JS,因此您必须使用灵活的环境,scriptstatic_files 不适用于 app.yaml。这就是为什么您无法让它们工作的原因。

列表中的第一个参考显示了提供静态文件的选项。但我有点质疑您使用共享 GCS 选项的愿望 - 无论 dev/staging/production 环境如何,它都会提供相同的内容,所以:

  • 你不能有不同的客户端环境
  • 您如何看待选择特定的服务器端环境,因为客户端引用只能指向一个方向(即环境,如果我理解正确的话)?

如果您希望使用单个域意味着您仍然可以使用(该域的)不同子域,并且如果您愿意使用自定义域,这 可能 感兴趣:

更新:

Node.JS 目前在标准环境中也可用,因此您可以使用这些功能,请参阅:

将此答案作为对@Dan Corneliscu 的答案的补充,因为我认为它非常有用,并且总结了您做错了什么以及在您提供的场景类型中可以实现什么。无论如何,我想提供更多可能有用的信息。

至于您建议的 调度规则 方法不起作用的原因,您应该相应地更新应用程序中的路径。他们现在应该听 /v1/your_endpoint 而不是他们以前可能听过的 /your_endpoint。仅更改 dispatch 文件是不够的。然后还要确保 Dispatch routes 字段已填充到控制台的 App Engine > Services tab 中。

此外,您建议的替代方法确实无法使用 static_files,但您可以按照本指南进行解释 how to serve Static Files from a GAE Flexible application