【问题标题】:Go App Engine get version in init() without ContextGo App Engine 在没有上下文的 init() 中获取版本
【发布时间】:2017-02-09 23:16:29
【问题描述】:

有没有办法在没有Context 的情况下在我的init() 函数中获取我的自动缩放应用程序的VersionID?唯一可用的选项似乎是appengine.VersionID(context.Context)。手动缩放的实例在启动时会调用 /_ah/start(授予对 Context 的访问权限),但对于自动缩放的实例,没有这样的事情。

我不关心 appengine.VersionID 随它返回的生成 ID,只关心 app.yaml 版本。

编辑:一些上下文:我想以 x-x-x-dev 或 x-x-x-live 形式部署版本,并使我的数据库连接取决于版本后缀。这样,当我查看 GCP 控制台时,我可以确定哪些部署的模块/服务正在使用哪个数据库。当然,我在init()中设置了我的数据库连接池,它无法访问Context

【问题讨论】:

    标签: google-app-engine go


    【解决方案1】:

    我在网上到处搜索,没有答案,所以就在这里。

    只需在 init() 函数中解析 app.yaml 文件。我这里的例子使用了一个 yaml 解析包,但是如果你需要,它可以做得更轻量级。

    import "github.com/ghodss/yaml"
    
    type AppVersion struct {
        Version string `json:"version"`
    }
    
    func VersionID() (string, error) {
        dat, err := ioutil.ReadFile("app.yaml")
        if err != nil {
            return "", err
        }
        a := &AppVersion{}
        err = yaml.Unmarshal(dat, a)
        if err != nil {
            return "", err
        }
        return a.Version, nil
    }
    

    请注意,这不会以 appengine.VersionID() 的 X.Y 形式返回生成的 ID。只有版本的 X 部分。

    顺便说一句,在 Github 上的 appengine 存储库中,对appengine.VersionID 的实际调用需要Context,但在内部使用nil 调用内部包。所以他们基本上强迫你用Context 调用它,但实际上并没有使用它。实在是太气人了。

    编辑:应该注意的是,gcloud 中的新 Go SDK 不再支持 app.yaml 中的version,因为它现在是部署时的必需参数。但是,“旧版”SDK 仍受支持和维护,我从今天(2018 年 12 月 24 日)继续使用它。

    【讨论】:

      猜你喜欢
      • 2015-03-27
      • 2011-10-20
      • 1970-01-01
      • 2013-05-25
      • 2019-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多