將 Cloud Foundry 服務與 Spring 結合使用:第 1 部分 - 基礎知識

工程 | Ramnivas Laddad | 2011年10月13日 | ...

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”工具,但使用帶有 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> <application-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 應用程式在不更改應用程式的任何內容的情況下消費服務。在此之前,盡情享受吧!

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視所有