在获取Bluemix的资格信息时,可以使用cfenv

IBM Bluemix是基于CloudFoundry的平台即服务(PaaS)。

使用 CloudFoundry 进行应用程序开发需要使用诸如 Ruby、JavaScript (Node.js)、Java 等语言,通过 API 来使用由 PaaS 提供的每个单独服务。当使用这些 API 时,需要凭证信息(连接 URL、端口、用户 ID、密码等),但所有这些信息都通过一个名为 VCAP_SERVICES 的环境变量从平台提供给应用程序(参考:CloudFoundry 文档:Binding Credentials)。

VCAP_SERVICES是什么?

在使用Bluemix时,如果要使用服务,需要使用VCAP_SERVICES凭据信息。

让我们考虑在Bluemix上使用redis的情况。

在Bluemix上创建Redis服务后,会在仪表板上显示一个图标。

bm-redis-icon.png

点击此图标左下方的“显示资格信息”,即可显示嵌入在VCAP_SERVICES中的资格信息(以json形式显示)。

{
  "redis-2.6": [
    {
      "name": "my-redis",
      "label": "redis-2.6",
      "plan": "100",
      "credentials": {
        "hostname": "xx.xx.xx.xx",
        "host": "xx.xx.xx.xx",
        "port": xxxx,
        "password": "xxxx-xxxx-xxxx-xxxx-xxxx",
        "name": "xxxx-xxxx-xxxx-xxxx-xxxx"
      }
    }
  ]
}

使用这些信息,例如将数据存储在Redis中的情况下,将需要编写如下代码。在这里,如果没有VCAP_SERVICES,则表示在本地进行调试执行,并使用本地的Redis。

使用这些信息,例如在Redis中存储数据的情况下,将需要编写以下代码。请注意,在这里,如果没有VCAP_SERVICES,那么意味着进行本地调试执行,并使用本地的Redis。

require 'redis'

redis_service_label = 'redis-2.6'

if process.env.VCAP_SERVICES?
  services = JSON.parse process.env.VCAP_SERVICES
  redis_creds = services?[redis_service_label]?[0]?.credentials
  redis_host = redis_creds?.host ? 'localhost'
  redis_port = redis_creds?.port ? '6379'
  redis_pass = redis_creds?.password ? null

client = redis.createClient redis_port, redis_host
if redis_pass?
  client.auth redis_pass

client.set key, val

在Bluemix上选择的服务类型是’redis-2.6’,如果使用多个相同的服务,需要从数组中找到一个合适的,这需要理解JSON的结构并进行描述,相当麻烦。

cfenv安装

cfenv是一个npm模块,可以更方便地使用VCAP_SERVICES。

在使用Bluemix的时候,需要在package.json的dependencies中添加模块名称为”cfenv”。

{
  ...
  "dependencies": {
    "cfenv": "*",
    ...
  }
  ...
}

cfenv 的使用方法

那么,让我们尝试使用cfenv来改写上面的例子吧。

require 'redis'
require 'cfenv'

redis_creds = cfenv.getAppEnv().getServiceCreds 'my-redis'
redis_host = redis_creds?.host ? 'localhost'
redis_port = redis_creds?.port ? '6379'
redis_pass = redis_creds?.password ? null

# 以下は同じ
client = redis.createClient redis_port, redis_host
if redis_pass?
  client.auth redis_pass

client.set key, val

在`getServiceCreds`中,可以使用服务名称。由于服务的类型通常很多且命名方式不一致,使用服务名称可以提高可预见性。在同时使用多个相同类型的服务时,通过服务名称可以轻松访问,而无需在JSON结构中枚举元素。这是非常重要的。此外,一般来说,并不需要过多关注JSON的结构。

总结

    • BluemixはCloudFoundryですので、サービスの資格情報はVCAP_SERVICES環境変数に格納されています。

 

    資格情報はjsonですので自力で解析することもできますが、cfenvモジュールを使えば、構造を意識する必要がなく、コードがシンプルになります。
广告
将在 10 秒后关闭
bannerAds