【问题标题】:number of instances the cloud foundry app is runningCloud Foundry 应用程序正在运行的实例数
【发布时间】:2015-09-30 14:12:16
【问题描述】:

我的应用程序需要获取其运行的实例数(在运行时,我的应用程序在我的程序逻辑中使用此信息)。 (VCAP_APPLICATION 环境变量无法提供此信息。) 直接调用 API 并使用“实例”属性是一种选择,但我不知道如何在我的应用程序中直接调用应用程序 API。请让我知道如何称呼它。 以下是我获得的应用 API 链接: http://apidocs.cloudfoundry.org/218/apps/retrieve_a_particular_app.html

【问题讨论】:

  • 您能解释一下您是如何使用这些信息的吗?在您的应用程序中使用它并不常见。除了找出实例的数量外,您还必须监控状态以防发生变化。
  • 我正在对运行在 cf.现在我需要知道应用程序正在运行的实例数。我使用它只是为了显示该应用程序正在这么多实例上运行。我在 cf-dev 列表论坛上发布了这个问题并得到了回复: - 让应用程序直接调用 API 并查看“实例”属性设置为什么。 apidocs.cloudfoundry.org/218/apps/… 但我不知道如何调用我的应用 API。如果我的应用程序有任何其他方式知道#NoOfInstances,请告诉我。谢谢。
  • 你能在你的性能测试应用程序中使用 cf 命令行工具吗?尝试 cf app --help 向您展示格式。它将返回特定应用程序的实例数。我确定它使用的是上面提到的 api。

标签: cloud-foundry


【解决方案1】:

为了使用 API,您首先需要进行身份验证。为了进行身份验证,您需要检索授权端点。

要检索授权端点,请发出以下 curl 请求(我在此示例中使用关键 Web 服务,但您可以将 https://api.run.pivotal.io 替换为您正在使用的 Cloud Foundry api 端点。

curl -H 'content-type: application/x-www-form-urlencoded;charset=utf-8' \
-H 'accept: application/json;charset=utf-8' \
https://api.run.pivotal.io/v2/info

你会得到类似这样的东西:

{
"name": "vcap",
"build": "2222",
"support": "http://support.cloudfoundry.com",
"version": 2,
"description": "Cloud Foundry sponsored by Pivotal",
"authorization_endpoint": "https://login.run.pivotal.io",
"token_endpoint": "https://uaa.run.pivotal.io",
"min_cli_version": null,
"min_recommended_cli_version": null,
"api_version": "2.36.0",
"app_ssh_endpoint": "ssh.run.pivotal.io:2222",
"app_ssh_host_key_fingerprint": "e7:13:4e:32:ee:39:62:df:54:41:d7:f7:8b:b2:a7:6b",
"logging_endpoint": "wss://loggregator.run.pivotal.io:443",
"doppler_logging_endpoint": "wss://doppler.run.pivotal.io:443"
}

获取 authorization_endpoint 值,在本例中为:

https://login.run.pivotal.io

您现在需要获取一个身份验证令牌。发出以下 curl 命令,将 [my user name][my password][my authorization endpoint] 替换为您的值。请注意,您应该对您的密码进行 url 编码。

curl -H 'content-type: application/x-www-form-urlencoded;charset=utf-8' \
-H 'accept: application/json;charset=utf-8' \
-H 'authorization: Basic Y2Y6' \
-d "username=[my user name]&password=[my password]&grant_type=password" \
[my authorization endpoint]/oauth/token

您将收到如下所示的响应:

{
"access_token": "very_long_token.very_long_token.very_long_token",
"token_type": "bearer",
"refresh_token": "very_long_token.very_long_token.very_long_token",
"expires_in": 599,
"scope": "cloud_controller.read password.write cloud_controller.write openid",
"jti": "shorter_value"
}

您对 access_token 的值感兴趣(access_token、refresh_token 和 jti 在本例中已更改为实际值)

现在我们终于可以使用 api 来获取有关我们应用程序的信息了。您可以使用上面提供的链接,但要使用该 api 端点,您需要应用程序的 guid。相反,我建议使用 List all Apps 端点并在其上使用查询过滤器来获取您的应用信息。这是 curl 命令(将 [my authentication token] 替换为上一步中的身份验证令牌,将 [my api endpoint] 替换为您用于云代工的 api 端点, 将 [my app name] 替换为您的应用名称:

curl -H "authorization: bearer [my authorization token]" \
[my api endpoint]/v2/apps?q=name:[my app name] -X GET

您将收到如下所示的消息:

{
"total_results": 1,
"total_pages": 1,
"prev_url": null,
"next_url": null,
"resources": [
{
  "metadata": {
    "guid": "blah-blah",
    "url": "/v2/apps/blah-blah",
    "created_at": "time_stamp",
    "updated_at": null
  },
  "entity": {
    "name": "my-app",
    "production": false,
    "space_guid": "blah-blah",
    "stack_guid": "blah-blah",
    "buildpack": null,
    "detected_buildpack": null,
    "environment_json": {

    },
    "memory": 1024,
    "instances": 3,
    "disk_quota": 1024,
    "state": "STOPPED",
    "version": "blah-blah",
    "command": null,
    "console": false,
    "debug": null,
    "staging_task_id": null,
    "package_state": "STAGED",
    "health_check_type": "port",
    "health_check_timeout": null,
    "staging_failed_reason": null,
    "staging_failed_description": null,
    "diego": false,
    "docker_image": null,
    "package_updated_at": "time stamp",
    "detected_start_command": "",
    "enable_ssh": true,
    "docker_credentials_json": {
      "redacted_message": "[PRIVATE DATA HIDDEN]"
    },
    "space_url": "/v2/spaces/blah-blah",
    "stack_url": "/v2/stacks/blah-blah",
    "events_url": "/v2/apps/blah-blah/events",
    "service_bindings_url": "/v2/apps/blah-blah/service_bindings",
    "routes_url": "/v2/apps/blah-blah/routes"
  }
}
]
}

您可以从消息中获取实例。如果您想在原始链接中使用 api,您可以获取 metadata.guid 以在该调用中使用。

希望有帮助!

【讨论】:

  • 感谢它在命令行中工作。现在我的应用程序在 cf 中运行时需要获取实例数,并且它在程序逻辑中使用此信息。我应该如何处理我的代码以获取我的应用正在运行的实例数。
  • 嗯,所以您在 cf 中将性能测试作为应用程序运行,并在 cf 中运行其他应用程序?也许如果您分享更多详细信息,我可以提供帮助。我使用 curl 来展示用于完成流程的基本命令。根据您的编程语言,您将使用 oauth 库和 json 解析来获取所需的信息。实际上,我会建立一个单独的微服务来封装这种行为,并让你的性能测试应用调用微服务来获取它需要的信息。
  • 我没有单独的应用程序,例如“性能测试”应用程序。我有一个应用程序,它需要获取它在 cf 中运行的实例数。通常这个#numberofInstances 将由我们在 manifest.yml 中给出。如您所说,在命令行中我可以获取此信息,但是我的应用程序如何在运行时获取此信息。通过浏览器访问我的 springboot Web 应用程序以显示一些数据,以及我需要显示的这些信息#numberofInstances。要显示它,我的程序应该首先在运行时得到它。
  • 使用 Cloud Foundry,每个应用程序都在其自己的隔离容器中运行。它旨在不知道自己在其他容器中运行的其他实例。 Cloud Foundry 确保所需数量的实例正在运行。如果您正在构建一个显示所有正在运行的应用程序及其实例的仪表板,那将是一个单独的应用程序,并且将使用 oauth 和 json 解析从上面的 URI 中提取信息。
  • 我没有在我的项目中构建任何仪表板,所以这里应该做什么来完成这项工作。
【解决方案2】:

我正在寻找类似但使用 cf cli 的东西,以在 shell 脚本中获取我的应用程序的实例计数。我想出了这个并且它有效。

cf app my_app_name|grep instances|cut -d'/' -f2

我知道这篇文章可能不相关,但如果它对某人有所帮助,我会很高兴。

【讨论】:

    【解决方案3】:

    虽然现在回复太晚了 - 另一种解决方案是拥有一个像 Eureka 这样的服务发现组件并让您的应用程序注册到它。从发现客户端,您可以获取此应用程序的实例数。

    但请注意,实例的状态最终会在 Eureka 上保持一致。我们将此模式用于集群广播用例。

    【讨论】:

      【解决方案4】:

      创建一个名为 myapp.apps.internal 的容器到容器的链接。然后计算 myapp.apps.internal 的 DNS 查找返回的 IP。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多