Google AppEngine上的不同环境配置

时间:2013-03-06 15:27:37

标签: java google-app-engine

我在Google AppEngine上运行了一个网络应用程序。

我有一个PRODUCTION环境,一个STAGING环境和多个开发& QA envs。有许多配置参数应该在PRODUCTION和其他环境之间有所不同 - 例如我们集成的服务的API密钥(例如GoogleAnalytics)。其中一些参数在代码中定义,其他参数在web.xml中定义(例如,在过滤器的init-param标签内),以及其他情况。

我知道有几种方法可以这样做:

  1. 保存数据存储区中的所有参数(并可能在每个正在运行的实例/ Memcached中缓存它们)

  2. 在web.xml中部署具有不同系统属性/环境变量的应用程序

  3. 其他选择......?

  4. 无论如何,我很想听听你解决这个问题的最佳做法。

2 个答案:

答案 0 :(得分:2)

我最喜欢的方法是将它们全部存储在数据存储区中,并且只有一条主记录,其中包含所有不同的属性并充分利用了memcache。通过这样做,您不需要具有不同的配置文件或使用不同的配置设置污染您的代码。相反,您可以从必须创建的管理表单部署和更改此值,以便更新此主记录。

此外,如果您正在存储令牌和密钥,那么您知道在web.xml或代码中的任何其他位置使用它们绝对不是一个好主意,而是在每个应用程序上使用它们更安全的东西,比如数据存储区。

如果有了,那么您可以拥有一个全局功能,可以按名称检索属性,如果您想从应用中的任何位置获取Google Analytics ID,您应该使用以下内容来使用它:

getProperty('googleAnalyticsID')

此全局getProperty()函数将尝试使用以下步骤查找此值:

  • 检查它是否存在于memcache中并返回
  • 如果不在memcache中,请从数据存储区更新主实体的memcache并返回
  • 如果不在数据存储区中创建具有默认值的实体,请更新内存缓存并返回

当然,如何从该模型中检索数据有不同的方法但想法是一样的:存储在一个记录中并使用内存缓存。

答案 1 :(得分:0)

您必须为您的production / staging / qa envs分别设置app ID。这必须硬编入你的web.xml(或者你有一个更新web.xml的脚本)

之后,您可以根据appid在您的设置中进行编码。我假设有一个等价的java: https://developers.google.com/appengine/docs/python/appidentity/functions#get_application_id

如果它们是动态更改的设置,您可以将它放在数据存储区中,但如果它们对环境是静态的,那么从数据存储区继续获取是没有意义的。