如何在 运行 通过打包服务器推送 Liberty 应用程序时获取实例主机名

How to get the instance hostname while running a Liberty App pushed via a Packaged Server

我有一个通过打包的自由服务器推送的 bluemix 应用程序。该应用程序在内部查找实例 IP/hostname。当应用程序升级到多个实例时,使用 localhost 作为主机名就变得过时了。主机条目在我们的 server.xml 中设置。

当我尝试使用 可引用变量 例如 ${host} 或 ${vcap_console_ip} 时,它没有分别获取主机名或 IP 地址。

  1. ${host} returns 0.0.0.0 在我们的 server.xml
  2. ${vcap_console_ip} - 它没有任何价值。我看到 runtime-vars.xml 不显示 ${vcap_console_ip} 即使在 server.xml.
  3. 中使用它

正在寻找有关如何将应用所在实例的主机名或 ip 运行 获取到我的 server.xml 中的建议。

Bluemix 中的一个应用程序 运行 将至少有两个 IP 地址,一个私有地址和一个可外部寻址的地址。同样,对于主机名,其他人用来与应用服务器对话的路由是在外部配置的——可能根本就没有路由。最佳解决方案将取决于您要对主机名执行的操作。

编辑

如果目的是在实例之间进行通信,那么依赖对 IP 地址的直接了解就会出现问题,因为云为您提供的其中之一就是动态网络环境。正如一些评论所提到的,一种选择是消息传递或分布式缓存。另一种方法是使用 beta Bluemix Service Discovery service,它负责将私有 IP 地址(您的应用程序知道)映射到 public IP 地址(您的应用程序 知道)。

应用程序可以 register itself with the registry by making a POST request to the 'https://servicediscovery.ng.bluemix.net/api/v1/instances' REST 端点。例如,在 cURL 形式中,这将是

curl -X POST -H "Authorization: Bearer auth_token" -H "Content-Type: application/json" https://servicediscovery.ng.bluemix.net/api/v1/instances -d '{"service_name":"[service_name]", "endpoint": {"type":"tcp", "value":"[host]"}, "status":"UP", "ttl":[TTL_value], "metadata":{"name":"instance_name"}}'

其中 [host] 是应用程序的私有 IP 地址,TTL_value 是实例在心跳之间等待的时间(以秒为单位),可以从 Bluemix 控制台读取令牌以进行服务发现服务。对于 list the services you've registered,您将执行

curl -X GET -H "Authorization: Bearer auth_token" https://servicediscovery.ng.bluemix.net/api/v1/services/Service_Name

除了允许内部 IP 地址与 public IP 地址分离外,服务发现方法还允许在应用程序的不同组件内实现负载平衡,并允许在一个实例出现故障时进行故障转移。

您可以使用 VCAP_APPLICATION 环境变量并获取 "uris" 属性。

    String VCAP_APPLICATION = System.getenv("VCAP_APPLICATION");
    if (VCAP_APPLICATION != null) {
            JsonNode node = Json.mapper().readValue(VCAP_APPLICATION, JsonNode.class);
            ArrayNode uris = (ArrayNode) node.get("uris");
            if (uris != null && uris.size() > 0 && uris.get(0) != null) {
                host = uris.get(0).textValue();
            }

如果您查看运行时-vars.xml,您应该会看到一个名为application_uris 的变量。如果您的应用程序只配置了一个路由,您可以使用 ${application_uris} 在 server.xml 中直接引用它。如果有多个路由,您仍然可以使用它,但您需要解析一个以逗号分隔的列表。

${application_uris} 变量将显示一条有意义的路线(只要有一条!)即使 ${host} 变量给出 0.0.0.0。如果一个应用程序有多个实例 运行,它无助于区分它们,但在大多数情况下这是所需的行为。

(我认为这是对原问题最简单的回答。)