2016-05-01 46 views
3

我已經通過打包自由服務器推送的bluemix應用推動。該應用程序在內部查找實例IP /主機名。當應用程序使用多個實例進行升級時,使用localhost作爲主機名將變得過時。主機條目在我們的server.xml中設置。如何獲得實例主機同時運行的應用程序的自由通過打包服務器

當我嘗試使用可引用變量(例如$ {host}或$ {vcap_console_ip})時,它不會分別獲取主機名或IP地址。

  1. $ {HOST}在我們的server.xml
  2. $ {} vcap_console_ip返回0.0.0.0 - 它沒有得到任何價值。即使在server.xml中使用它,我也會看到runtime-vars.xml不顯示$ {vcap_console_ip}。

尋找關於如何獲取應用程序運行到我的server.xml中的實例的主機名或IP的建議。

回答

3

在Bluemix運行的應用程序將至少有兩個IP地址,爲私人和外部尋址的一個。同樣,對於主機名,其他人用來與應用程序服務器交談的路由是在外部配置的 - 並且可能根本沒有路由。最好的解決方案將取決於你想用主機名來做什麼。

編輯

如果目的是實例之間的通信,依靠IP地址的直接知識將有問題的,因爲事物的雲給你是一個動態的網絡環境之一。一些選項是消息傳遞或分佈式緩存,如一些評論所提及的。另一種方法是使用測試版Bluemix Service Discovery service,這需要照顧的私有IP地址(你的應用程序知道)映射到公網IP地址(您的應用程序確實不知道)的。

應用程序可以register itself with the registry通過使POST請求到「https://servicediscovery.ng.bluemix.net/api/v1/instances」 REST端點。例如,在捲曲的形式,這將是

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"}}' 

其中[主持人]是應用程序的私有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地址脫鉤,服務發現的方法可以讓你的應用程序的不同組件中的負載均衡,並允許故障轉移,如果一個實例失敗。

+0

我需要這不通過外部IP地址跨實例通信。我發現在應用程序啓動時使用-c選項發送命令的選項。 我在推送打包的WLP服務器時嘗試使用此功能。但它試圖開始並且一直未能開始。 cf push app -p -c「echo $(hostname)> wlp/usr/servers/myServer/server.env」 即使我試圖在上面的命令中放置一個shellscript .profile.d /我推送的服務器zip包的目錄。兩個失敗。無法在此之後啓動應用程序。 – krckumar

+0

實例間通信的最佳實踐是使用消息傳遞服務,或者根據通信的性質使用數據庫或緩存服務。 – opiethehokie

+0

同意,使用消息傳遞服務將工作。 Bluemix不允許直接應用程序實例通過HTTP端口進行實例通信。 –

4

您可以使用VCAP_APPLICATION環境變量,並得到了「的URI」屬性。

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(); 
      } 
+0

非常好的一點 - uris屬性也變成了server.xml中的一個可引用變量,這就是原來的問題。 –

0

如果你看一下runtime-vars.xml,你會看到一個名爲application_uris的變量。如果只有一個路由爲您的應用程序配置,您可以使用${application_uris}直接在server.xml中引用它。如果有多條路線,您仍然可以使用它,但是您需要解析逗號分隔的列表。

即使${host}變量給出0.0.0.0,${application_uris}變量也會顯示有意義的路徑(只要有一個!)。如果運行的應用程序有多個實例,則無法區分它們,但在大多數情況下,這是期望的行爲。

(我認爲這是最簡單的答案,原來的問題。)

+0

現在我已經在.profile.d /目錄中放置了一個shellscript,並且每當應用程序實例新啓動時,它都會執行並獲取$(hostname -i)作爲我的server.xml條目的HOST_NAME或IP_ADDRESS。感謝您的迴應。他們非常有幫助 – krckumar

相關問題