如何在运行通过打包服务器推送的Liberty App时获取实例主机名

时间:2016-05-01 05:22:25

标签: ibm-cloud cloudfoundry websphere-liberty

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

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

  1. $ {host}在我们的server.xml中返回0.0.0.0
  2. $ {vcap_console_ip} - 它没有获得任何价值。我看到runtime-vars.xml没有显示$ {vcap_console_ip},即使在server.xml中使用它也是如此。
  3. 寻找关于如何获取应用程序运行到我的server.xml的实例的主机名或ip的建议。

3 个答案:

答案 0 :(得分:4)

您可以使用VCAP_APPLICATION env变量并获取" 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();
            }

答案 1 :(得分:3)

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

编辑

如果目标是在实例之间进行通信,那么依赖于IP地址的直接知识将会产生问题,因为云为您提供的一个功能是动态网络环境。一些选项是消息传递或分布式缓存,正如一些评论所提到的。另一种方法是使用beta Bluemix Service Discovery service,它需要将私有IP地址(您的应用程序知道的)映射到公共IP地址(您的应用程序知道)。

应用程序可register itself with the registry向{39} https://servicediscovery.ng.bluemix.net/api/v1/instances'发出POST请求。 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地址与公共IP地址分离之外,服务发现方法还允许在应用程序的不同组件内进行负载平衡,并允许在一个实例发生故障时进行故障转移。

答案 2 :(得分:0)

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

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

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