【问题标题】:Detecting a development App Server in Go, without the App Engine standalone SDK?在没有 App Engine 独立 SDK 的情况下在 Go 中检测开发应用服务器?
【发布时间】:2020-04-22 17:07:39
【问题描述】:

Go 包 google.golang.org/appengine 提供 IsDevAppServer,它报告 App Engine 应用程序是否正在开发应用程序服务器中运行(例如 localhost:8080)。但是,除非使用 (deprecated) 独立 SDK,否则这不起作用。实现见appengine.go#L57

用 Go 编写的新 GAE 应用程序基本上是一个常规的 Web 服务器,可以像任何 Go 程序一样在本地编译和启动;

  • 旧的; dev_appserver.py
  • 新的; go run main.go

检测开发服务器有助于防止在本地运行时出现 CORS 问题:

func setDevHeaders(w http.ResponseWriter) {
    w.Header().Set("Access-Control-Allow-Origin", "http://localhost:4200")
    w.Header().Set("Access-Control-Allow-Headers", "Content-Type")
    w.Header().Set("Access-Control-Request-Method", "POST, GET")
    w.Header().Set("Access-Control-Expose-Headers", "Content-Disposition")
}

如果需要,我可以分支:

if appengine.IsDevAppServer() {
    setDevHeaders(w)
}

在 App Engine 上运行的独立 Go 服务器中实现此目的的推荐方法是什么?

【问题讨论】:

    标签: google-app-engine go gcloud golang-migrate


    【解决方案1】:

    App Engine 标准 Go 环境会自动设置许多环境变量。你可以看看列表here

    您可以检查它们是否已设置,如果它们没有,那么您的代码正在本地运行(或至少未部署)。或者,您可以在您的机器上(在您本地运行应用程序的 shell 中,而不是在 app.yaml 文件中)将 NODE_ENV 环境变量设置为 development 并检查其值。在 App Engine 上运行时,它将设置为 production

    【讨论】:

    • 当以go run main.go 启动时,该服务器未在 App Engine 标准 Go 环境中运行 - 它只是一个普通的网络服务器。
    • 没错。因此,除非您自己在本地环境中明确定义它们,否则这些环境变量不会被设置。因此,如果您的代码尝试检索它们并且它们没有设置,那么它知道它正在您的本地环境中运行,否则它已经部署并正在 App Engine 中运行。
    【解决方案2】:

    听起来很棘手,但我发现元数据服务器也响应应用引擎标准。

    此外,我使用了cloud.google.com/go/compute/metadata pacakge,

    metadata.OnGCE()
    

    作为快速检查它是在我的本地机器上还是在谷歌的机器上(是的,它在应用引擎上返回 true)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      相关资源
      最近更新 更多