搶先一步
VMware 提供訓練和認證,以加速您的進展。
深入瞭解Cloud Foundry 中提供的服務讓撰寫高效且有效率的應用程式成為可能。開發人員現在可以選擇適當種類的服務,而無需擔心這些服務的運作。例如,應用程式的一部分可以選擇 Postgres 來處理事務性存取至關重要的部分,MongoDB 來處理以文件集合形式與資料互動的情況,Redis 來處理鍵值是正確抽象概念的情況,以及 RabbitMQ 來處理訊息傳遞有助於建立有效架構的情況。在這個分為四部分的部落格系列中,我們將探討 Spring 應用程式如何使用 Cloud Foundry 服務。雖然我們的重點是 Spring,但使用其他框架的開發人員,尤其是基於 JVM 的框架(Grails、Lift 和純 Java Web)也會發現這些部落格的大部分內容都相關。
在第一部分中,我們將探討 Cloud Foundry 如何向應用程式公開服務資訊。在下一篇部落格中,我將描述典型的 Spring 應用程式如何使用自動重新配置機制,該機制允許在不進行任何修改的情況下使用服務。在第三篇部落格中,Thomas Risberg 將解釋如何使用「cloud」命名空間來明確控制服務的消耗。在第四部分中,Scott Andrews 將展示如何將 Spring 3.1 中的設定檔支援與「cloud」命名空間結合使用,以建立允許明確控制服務的應用程式,同時允許應用程式在本地或 Cloud Foundry 中執行而無需任何變更。在本部落格系列結束時,您應該擁有足夠的資訊,可以有效地從 Spring 應用程式中使用 Cloud Foundry 服務。
當您將 Cloud Foundry 服務(例如 Postgres 或 Mongo)繫結到應用程式時,有關繫結服務的資訊(例如主機、連接埠和憑證)會透過環境變數公開,這些變數的值編碼為 JSON。為了說明這一點,我們將建立一個簡單的 Web 應用程式,顯示所有環境變數。我們從 Spring MVC 範本專案開始,並將以下端點新增至 HomeController(您可以在 github 上看到此應用程式)。
@RequestMapping("/env")
public void env(HttpServletResponse response) throws IOException {
response.setContentType("text/plain");
PrintWriter out = response.getWriter();
out.println("System Environment:");
for (Map.Entry<String, String> envvar : System.getenv().entrySet()) {
out.println(envvar.getKey() + ": " + envvar.getValue());
}
}
讓我們部署此應用程式。我將使用 'vmc' 工具,但使用 STS 和 Cloud Foundry 外掛程式也可以。請注意,我使用 hello-env 作為應用程式名稱和基於它的預設 URL (hello-env.cloudfoundry.com)。如果您正在跟著此部落格編碼,您會想要選擇一個應用程式名稱,例如它的預設 URL 尚未被佔用。或者,您可以部署到 Micro Cloud Foundry。
$ vmc push hello-env -n
Creating Application: OK
Uploading Application:
Checking for available resources: OK
Processing resources: OK
Packing application: OK
Uploading (8K): OK
Push Status: OK
Staging Application: OK
Starting Application: OK
此時,如果您導覽至 http://hello-env.cloudfoundry.com/env,您將看到一個頁面,其中填滿了所有環境變數,許多變數的名稱以 VCAP_ 開頭,公開了有關應用程式的各種資訊。我們感興趣的是 VCAP_SERVICES 變數,目前顯示為
VCAP_SERVICES: {}
我們看到變數為空地圖(以 JSON 表示),正確地表明沒有繫結任何服務。讓我們建立一個 Postgres 服務,命名為 env-postgresql,並將其繫結到我們的應用程式。請注意命令的形式:vmc create-service <service-type> <service-name> <applciation-name>
。
$ vmc create-service postgresql env-postgresql hello-env
Creating Service: OK
Binding Service: OK
Stopping Application: OK
Staging Application: OK
Starting Application: OK
現在,讓我們再次導覽至 http://hello-env.cloudfoundry.com/env,您將看到 VCAP_SERVICES 環境變數為(在此處格式化以提高可讀性)
{
"postgresql-9.0": [{
"name": "env-postgresql",
"label": "postgresql-9.0",
"plan": "free",
"credentials": {
"name": "de24667f9344b4eeaad6b5a2326d52faa",
"host": "172.30.48.122",
"hostname": "172.30.48.122",
"port": 5432,
"user": "u50ce600bba434bacbc99e034bb415644",
"username": "u50ce600bba434bacbc99e034bb415644",
"password": "pf4dca5bd449d4732841f0c4ae3f299d0"
}
}]
}
這具有應用程式連線到它所需的所有資訊:主機、連接埠和名稱,以建立 JDBC URL 以及使用者名稱和密碼來連線到它(hostname 已棄用,將在未來版本中移除)。
讓我們繫結另一個服務,這次是 MongoDB。
$ vmc create-service mongodb env-mongodb hello-env
現在環境變數將如下所示
{
"mongodb-1.8": [{
"name": "env-mongodb",
"label": "mongodb-1.8",
"plan": "free",
"tags": ["mongodb", "mongodb-1.8", "nosql"],
"credentials": {
"hostname": "172.30.48.68",
"host": "172.30.48.68",
"port": 25026,
"username": "b8b312a0-9b43-4104-90f8-52f2ac8bc7c6",
"password": "6a62732d-f820-4690-9bab-d1c85af13323",
"name": "416e990a-6f81-46f9-abaa-1233a11ca5d6",
"db": "db"
}
}],
"postgresql-9.0": [{
"name": "env-postgresql",
"label": "postgresql-9.0",
"plan": "free",
"credentials": {
"name": "de24667f9344b4eeaad6b5a2326d52faa",
"host": "172.30.48.122",
"hostname": "172.30.48.122",
"port": 5432,
"user": "u50ce600bba434bacbc99e034bb415644",
"username": "u50ce600bba434bacbc99e034bb415644",
"password": "pf4dca5bd449d4732841f0c4ae3f299d0"
}
}]
}
同樣,MongoDB 部分具有建立與其連線所需的所有資訊。
這就是 Cloud Foundry 如何向您的應用程式公開服務資訊,以便它可以使用繫結到它的服務。這需要存取環境變數、剖析 JSON 以及建立存取物件(例如關聯式資料庫的 DataSource
)。雖然不是太困難,但這不是程式設計師想要或喜歡直接處理的事情。因此,Cloud Foundry 提供了幾種機制來簡化連線到服務的任務,我們將在本系列的稍後部分探討這些機制。
在下一部分中,我將向您展示自動重新配置機制,該機制可讓典型的 Spring 應用程式使用服務,而無需變更應用程式中的任何內容。在那之前,請享受!