在获取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服务后,会在仪表板上显示一个图标。
点击此图标左下方的“显示资格信息”,即可显示嵌入在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モジュールを使えば、構造を意識する必要がなく、コードがシンプルになります。