【问题标题】:How to connect to the Message Hub service on bluemix via node app using cfenv and vcap services如何使用 cfenv 和 vcap 服务通过节点应用程序连接到 bluemix 上的 Message Hub 服务
【发布时间】:2016-09-20 08:01:25
【问题描述】:

我在 Bluemix 上有一个 Message Hub 服务实例,我正在尝试通过节点应用程序连接到该实例。我可以通过文档中给出的 cfenv 进行连接:

var Cfenv = require('cfenv');
var appEnv = Cfenv.getAppEnv();
if(restEndpoint && apiKey) {
  appEnv.services = {
    "messagehub": [
       {
          "label": "messagehub",
          "credentials": {
             "api_key": apiKey,
             "kafka_rest_url": restEndpoint,
          }
       }
    ]
  };
} else {
  console.error('A REST Endpoint and API Key must be provided.');
  process.exit(1);
}

为此,我直接在我的节点应用程序中提供 API 密钥和 restEndpoint,它们是在 Bluemix 服务凭证中创建的。

restEndpoint = "https://kafka-rest-**************"

apiKey = "*******************"

但为了安全起见,我不想在代码本身中提供上述详细信息。那么无论如何我可以阻止提供上述凭据并调用服务吗?我开始知道我们可以使用 cfenv 和 VCAP_serives 来实现它,但我不知道如何去做。有人可以帮我一些想法吗?

我自己在这里编辑我的问题, 我使用 cfenv 从我的节点应用程序连接到消息中心服务,但这些值是硬编码的,如下所示。

restEndpoint = "https://kafka-rest-***************************"

apiKey = "******************************"


if(restEndpoint && apiKey) {
  appEnv.services = {
    "messagehub": [
       {
          "label": "messagehub",
          "credentials": {
             "api_key": apiKey,
             "kafka_rest_url": restEndpoint,
          }
       }
    ]
  };
} else {
  console.error('A REST Endpoint and API Key must be provided.');
  process.exit(1);
}
var instance = new MessageHub(appEnv.services);

但是现在在推送到 bluemix 之后,我得到了环境变量(VCAP 服务)

"messagehub": [
  {
     "credentials": {
        "mqlight_lookup_url": "https://mqlight*********",
        "api_key": "**************",
        "kafka_admin_url": "https://kafka-admin-***********",
        "kafka_rest_url": "https://kafka-rest-********",

        "user": "*****",
        "password": "*******"
     },
     "syslog_drain_url": null,
     "label": "messagehub",
     "provider": null,
     "plan": "standard",
     "name": "Message Hub",
     "tags": [
        "ibm_dedicated_public",
        "web_and_app",
        "ibm_created"
     ]
  }

]

那么如何使用上述 VCAP_services 连接到消息中心服务,而不是在代码本身中硬编码值。

谢谢。

【问题讨论】:

    标签: ibm-cloud message-hub


    【解决方案1】:

    是的,您可以在运行时检索服务的凭据。

    在 Bluemix 中运行时,使用 Node.js,它们存储在 process.env.VCAP_SERVICES 中。

    您还可以从 Bluemix UI 直接检查这个 JSON 对象。导航到应用程序的仪表板并转到环境变量。

    解析 VCAP_SERVICES 的示例代码:

    var serviceName = 'messagehub';
    var opts = {};
    if (process.env.VCAP_SERVICES) {
        // Running in Bluemix
        var services = JSON.parse(process.env.VCAP_SERVICES);
        for (var key in services) {
            if (key.lastIndexOf(serviceName, 0) === 0) {
                messageHubService = services[key][0];
                opts.broker = messageHubService.credentials.kafka_brokers_sasl;
                opts.user = messageHubService.credentials.user;
                opts.password = messageHubService.credentials.password;
            }
        }
        if (!opts.hasOwnProperty('broker') || !opts.hasOwnProperty('user') || !opts.hasOwnProperty('password')) {
            throw 'Error - Check your app is bound to a ' + serviceName + ' service';
        }
    } else {
        // Running locally
        opts.broker = 'localhost:9093'; 
        opts.user = 'username';
        opts.password = 'password'; 
    }
    

    在本地运行时,您可以选择按照自己的方式进行操作: - 如果您还想在 Bluemix 中运行,那么设置一个模仿 VCAP_SERVICES 的本地环境变量可能是一个好主意,这样两者都可以使用相同的逻辑。 - 如果没有,您可以编写一个从安全位置获取您的凭据的 getter。

    cfenv (https://www.npmjs.com/package/cfenv) 允许对其进行抽象,例如检测是在本地运行还是在 Bluemix 中运行、解析 VCAP_SERVICES 等。但如果在本地运行,您仍然必须为其提供您的值。

    【讨论】:

    • 谢谢@Mickael。但是我的应用程序在本地,那么我在哪里可以看到环境变量,即,我怎样才能获得那个 process.env.VCAP_SERVICES?
    • 我添加了用于在 Bluemix 中解析 VCAP_SERVICES 的示例代码
    • 嗨@Mickael Maison ..现在我面临一个问题,消息中心服务每天都出现故障,我需要每天重新启动应用程序。有什么办法可以处理这种情况。因为我是将其用于生产
    猜你喜欢
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多