我有一个通过打包的自由服务器推送的bluemix应用程序。该应用程序在内部查找实例IP /主机名。当应用程序使用多个实例进行升级时,使用localhost作为主机名将变得过时。主机条目在我们的server.xml中设置。
当我尝试使用可引用变量,例如$ {host}或$ {vcap_console_ip}时,它没有分别获取主机名或IP地址。
寻找关于如何获取应用程序运行到我的server.xml的实例的主机名或ip的建议。
答案 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}
变量也会显示有意义的路径(只要有一个!)。如果运行的应用程序有多个实例,则无法区分它们,但在大多数情况下这是所需的行为。
(我认为这是原始问题的最简单答案。)