遙遙領先
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 服務。
當您將 Postgres 或 Mongo 等 Cloud Foundry 服務繫結到應用程式時,有關繫結服務的資訊(例如主機、埠和憑據)透過環境變數公開,其值編碼為 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”工具,但使用帶有 Cloud Foundry 外掛的 STS 也可以。 請注意,我正在使用 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 應用程式無需更改應用程式中的任何內容即可使用服務。 在此之前,請享受!