【问题标题】:Having trouble getting environment variable into application.conf将环境变量导入 application.conf 时遇到问题
【发布时间】:2015-04-09 23:40:30
【问题描述】:

我正在使用 Scredis,一个 Scala Redis 库。要实例化 Redis 对象,我必须将配置和配置值的路径传递给它。 (据我所知,没有其他方法可以为 Redis 对象提供其主机名和端口)

基本上,我需要将 Redis 端口和主机名存储在配置中。现在的问题是我正在尝试使用 Heroku 来部署它,并且主机名和端口都驻留在环境变量中。我了解到我可以从 application.conf 访问环境变量,但由于它们存储为一个长字符串,因此在将其传递给 Redis 对象之前,我无法将其分解。我知道如何从代码中的 env var 中获取 env var,但是看到我不能直接传递它,我完全不知道如何做到这一点。

这里是 Scredis 的配置信息:https://github.com/Livestream/scredis/wiki/Configuration

在heroku 上使用redis-cloud for java/scala: https://devcenter.heroku.com/articles/rediscloud#using-redis-from-java

【问题讨论】:

  • 这一长串是什么?你不能在 Heroku 中同时为 REDIS_HOST 和 REDIS_PORT 设置环境变量吗?

标签: scala heroku playframework redis playframework-2.0


【解决方案1】:

根据scredis中的these examples,也可以创建一个客户端,将配置放入代码中。

// Creates a non-blocking client with provided parameters, falling back to default
// configuration for non-provided parameters.
val clientWithParameters = Client(
  host = "192.168.1.1",
  port = 6380,
  passwordOpt = Some("foobar")
)

因此,两者的伪组合可能类似于:

val redisUri = URI( System.getenv("REDISCLOUD_URL") )
val redisClient =  Client(
    host = redisUri.getHost(),
    port =  redisUri.getPort(),
    passwordOpt = redisUri.getPassword()
)

【讨论】:

  • 我知道向你展示这个问题是个好主意 - 你的答案会更好:)
【解决方案2】:

Typesafe Config 和 Play Framework 使这对您来说非常容易,因为 Typesafe Config 还加载环境变量来解析配置值。你基本上有两个选择。

选项 1:确保环境变量与配置键 scredis 期望的名称相同。这在您想在启动时更改给定配置值的情况下很有用 - 例如您有以下application.conf:

{
  foo = bar
}

但在运行时,您希望foo 的值为baz。然后您可以通过环境变量或-D 传递新值。

$ foo=baz activator run
$ activator run -Dfoo=baz

选项 2: 在你 application.conf 中有一个占位符来读取环境变量。假设 Heroku 传递给您的环境变量是 REDIS_HOST 和 REDIS_PORT,那么在您的 application.conf 中,您可以执行以下操作:

scredis {
  redis {
    host = ${REDIS_HOST}
    port = ${REDIS_PORT}
  }
}

【讨论】:

    【解决方案3】:

    免责声明 - 我不是 Scala 专家 :)

    看起来scredis 是通过application.conf 和类型安全配置库配置的,所以这样做的一种方法是在测功机启动时生成飞行。

    根据Heroku's build behavior for Scala,方法是在强制stage 任务中添加一个启动脚本。在您的情况下,启动脚本应该解析 REDISCLOUD_URL env var 的内容并将它们写入 application.conf 文件。

    【讨论】:

      猜你喜欢
      • 2020-05-14
      • 2014-05-20
      • 2020-09-29
      • 2015-09-20
      • 2020-02-07
      • 2020-11-12
      • 2023-03-30
      • 2018-08-03
      • 1970-01-01
      相关资源
      最近更新 更多