Grails 和 Cloud Foundry 的一步部署

工程 | Peter Ledbrook | 2011 年 4 月 12 日 | ...

幾年前,一家初創公司的聯合創始人曾在倫敦 Groovy 和 Grails 使用者組發表演講。我清楚地記得他是如何說他夢想著“只需點選一下”就能部署一個 Grails 應用程式。隨著新的 Cloud Foundry 服務的釋出,他的夢想對於所有 Grails 使用者來說幾乎成為了現實。現在,您不僅可以透過 Grails 實現簡單快速的開發,還可以簡單快速地部署到雲託管提供商。

那麼 Grails 和 Cloud Foundry 如何協同工作?正如 Grails 的長期使用者所期待的那樣,我們為此準備了一個外掛!為了演示它的工作原理,我將帶您一步步將一個示例應用程式,Pet Clinic,部署到 Cloud Foundry。這是一個簡單的應用程式,您已經可以在 Cloud Foundry 上看到它的實際執行情況

首次部署

我將假設您已經安裝了 Grails 並準備好了一個應用程式。如果沒有,請檢視 Grails 網站上的安裝指南快速入門指南。然後您可以獲取 Pet Clinic 應用程式的原始碼

Pet Clinic 應用程式非常簡單,它將寵物、主人、獸醫和就診資訊儲存在 SQL 資料庫中。因此,它主要依賴的標準外掛是 Hibernate 外掛。那麼,我們需要做什麼才能將應用程式部署到 Cloud Foundry 呢?我們首先要安裝 Cloud Foundry 外掛

    grails install-plugin cloud-foundry

完成後,我們需要提供使用者名稱和密碼來訪問 Cloud Foundry 服務。當然,您必須先註冊一個賬戶才能這樣做,所以請儘快註冊!存放您的憑證的最佳位置是您的個人設定檔案$HOME/.grails/settings.groovy因為它們將適用於您所有的 Grails 專案,並且您可以將它們排除在原始碼控制之外。它們也可以放在grails-app/conf/BuildConfig.groovygrails-app/conf/Config.groovy如果您願意,但我通常不建議這樣做。

因此,我們將以下屬性新增到我們的settings.groovy檔案中,然後我們就可以開始了

grails.plugin.cloudfoundry.username = "<your_username>"
grails.plugin.cloudfoundry.password = "<pass>"

首先,我們檢查憑證是否有效,因此我們執行命令

    grails cf-info

如果一切正常,將打印出

    VMware's Cloud Application Platform
    For support visit [email protected]

    Target:   http://api.cloudfoundry.com (v0.999)

    User:     <your_username>
    Usage:    Memory   (1.0G of 2.0G total)
              Services (4 of 16 total)
              Apps     (2 of 20 total)

此命令會提供您的賬戶摘要,包括您正在執行的應用程式數量以及您已使用的記憶體配額量。

現在是您一直在等待的時刻:應用程式的一步部署。只需執行命令

    grails prod cf-push

請注意,我們甚至沒有配置DataSource.groovy- 這是有意為之的,我們稍後會回到資料來源配置。但現在,我們只需在詢問應用程式 URL 時按回車鍵,以及在命令詢問是否要建立並繫結 MySQL 服務時按回車鍵即可。然後我們等待外掛完成應用程式的部署 - 瞧!應用程式已啟動並執行,可以使用了。

[callout title=Cloud Foundry Classic]您可能會注意到 Cloud Foundry 外掛的 0.1 和 0.2 版本。這些版本只適用於 Classic Cloud Foundry 服務,因此請確保您不會意外安裝這些版本之一。[/callout]

還有什麼比這更簡單呢?在此階段需要注意的主要一點是,您不能將應用程式部署到已被使用的 URL,因此您將無法將 Pet Clinic 應用程式部署到例如 http://petclinic-grails.cloudfoundry.com/ 這個 URL。不用擔心:您可以更改 application.properties 中的應用程式名稱,或者在部署時指定不同的應用程式名稱,正如我們稍後更詳細地檢視一些命令時所看到的那樣。

另外一點說明:cf-*命令預設使用“development”環境,但您通常希望在部署時使用“production”環境。這就是為什麼我們在上面的命令中指定“prod”。

當然,並非每次部署都如此順利,您的應用程式可能會啟動失敗。如果出現這種情況,您可以透過以下命令獲取 Tomcat 日誌

    grails cf-crashlogs

日誌應該會提供足夠的資訊來診斷問題。

這就是一步部署!在本文的其餘部分,我將介紹一些您日常會用到的大多數常用命令,但您可以在外掛使用者指南中找到完整的參考。

應用程式更新和精細的資源調配控制

將應用程式部署到 Cloud Foundry 後,這並不是故事的結局。當您想部署新版本時會發生什麼?或者擴充套件應用程式以處理更多併發使用者?Cloud Foundry 外掛擁有一系列豐富的命令,可讓您處理這些情況以及其他情況。

更新應用程式

假設您為 Pet Clinic 應用程式添加了一個漂亮的新 UI,現在您想讓它對全世界可用。您可能認為只需要再次執行cf-push命令,但實際上有一個獨立的命令用於更新已部署的應用程式

    grails prod cf-update

有趣的是,此命令只會推送 WAR 檔案中發生更改的部分,因此在首次部署後,上傳到伺服器將非常快速。它還會自動停止然後重新啟動應用程式伺服器。因此,如果應用程式再次無法正常啟動,cf-crashlogs是您的朋友(幫手)。

應用程式名稱

正如我前面提到的,您不能部署一個在 Cloud Foundry 上已被使用的名稱的應用程式。那麼這是否意味著您必須更改application.properties中的應用程式名稱?您當然可以這樣做,因為外掛會將其用作 Cloud Foundry 上的預設應用程式名稱,但這並非唯一的選項。

大多數cf-*命令接受一個--appname選項,允許您覆蓋預設值。例如,Pet Clinic 示例的應用程式名稱是“petclinic-grails”,但您可以使用以下命令在 Cloud Foundry 上以不同的名稱部署它

    grails cf-push --appname=my-pet-clinic

然後該應用程式將可以透過 URL http://my-pet-clinic.cloudfoundry.com/ 訪問。

服務

大多數應用程式需要將資料儲存在某個地方,無論是 SQL 資料庫還是像 MongoDB 這樣的 NoSQL 資料儲存。Cloud Foundry 透過服務的概念提供對此類儲存的訪問。未來,預計還將出現其他型別的服務——例如快取和文字搜尋。

因此,您的應用程式需要先完成所需服務的資源調配(即建立/分配),然後將其繫結到應用程式後才能工作。例如,對於 Pet Clinic,我們必須調配一個 MySQL 服務並將其繫結到應用程式,以便它可以儲存資料。幸運的是,cf-push命令自動為我們完成了這項工作。

如果我執行cf-apps命令,您將看到 MySQL 服務如何繫結到 petclinic-grails 應用程式

    +------------------+----+---------+-----------------------------------+---------------+
    | Application      | #  | Health  | URLs                              | Services      |
    +------------------+----+---------+-----------------------------------+---------------+
    | petclinic-grails | 1  | RUNNING | petclinic-grails.cloudfoundry.com | mysql-52db6   |
    +------------------+----+---------+-----------------------------------+---------------+

這表示 'petclinic-grails' 應用程式繫結到服務 'mysql-52db6',換句話說,'petclinic-grails' 將資料儲存在指定的 MySQL 例項中。如果我執行cf-services命令,您將看到所有可供調配的服務列表,以及您已經調配的服務

    ============== System Services ==============

    +----------+---------+-------------------------------+
    | Service  | Version | Description                   |
    +----------+---------+-------------------------------+
    | mysql    | 5.1     | MySQL database service        |
    | redis    | 2.2     | Redis key-value store service |
    | mongodb  | 1.8     | MongoDB NoSQL store           |
    +----------+---------+-------------------------------+

    =========== Provisioned Services ============

    +---------------+---------+
    | Name          | Service |
    +---------------+---------+
    | mysql-52db6   | mysql   |
    +---------------+---------+

如您所見,Cloud Foundry 目前支援 MySQL、Redis 和 MongoDB,在我的下一篇文章中,我將介紹一個使用這三種服務型別的更復雜的示例。

在當前示例中,調配的服務名稱“mysql-52db6”是由 Cloud Foundry 自動生成的,但如果您手動調配服務,也可以為它們指定自己的名稱。例如

    grails cf-create-service mysql my-db

將調配一個名為 'my-db' 的 MySQL 服務。然後您可以透過繫結它來將其用作應用程式的資料庫

    grails cf-bind-service my-db --appname=my-pet-clinic

您甚至可以在將應用程式推送到 Cloud Foundry 時指定它應該繫結到哪些服務:只需指定 '--services' 選項,如外掛使用者指南中所述。

此時您心中應該有一個大問題:應用程式是如何知道在哪裡找到 MySQL 例項的?我們沒有在任何時候指定資料庫連線 URL,但應用程式卻執行無誤。這是怎麼回事?

這是一種魔法

當您在 Cloud Foundry 中將服務繫結到應用程式時,您是在告訴雲在執行時將該服務的連線設定傳遞給應用程式。然後 Cloud Foundry 外掛會獲取該資訊並覆蓋您應用程式中的連線設定。就像魔法一樣,您的應用程式隨後就可以透明地使用雲服務,而您無需做任何事情!這適用於所有可用服務,而不僅僅是 MySQL。

只有連線設定會被覆蓋,因此您仍然可以透過自定義方言控制建立何種型別的 MySQL 表(例如 InnoDB),以及 Hibernate 是否應保持資料庫模式最新(透過 'dbCreate' 屬性)。只需確保將自定義設定放在相應的環境塊中。例如,在DataSource.groovy您可能有

    production {
        dataSource {
            dialect= org.hibernate.dialect.MySQLInnoDBDialect
            driverClassName = "com.mysql.jdbc.Driver"
            username = "n/a"
            password = "n/a"
            url = "n/a"
            dbCreate = "update"
        }
    }

使用者名稱、密碼和 URL 可以是本地 MySQL 例項的值,因為這些值在應用程式部署到 Cloud Foundry 後將被覆蓋。

這種覆蓋連線設定的過程並非 Cloud Foundry 外掛提供的唯一魔法。它還知道哪些外掛對應於 Cloud Foundry 服務,因此如果您安裝了任何此類外掛,它會在您部署應用程式時檢查您是否已調配了相應的服務。這就是為什麼它詢問我們是否要為 Pet Clinic 應用程式調配並繫結一個 MySQL 服務:該應用程式安裝了 Hibernate 外掛。這對 MongoDB 和 Redis 外掛也有效。

在結束之前,最後一點:在將使用 MongoDB 和 Redis 服務的應用程式部署到 Cloud Foundry 之前,請確保您已安裝這些外掛的最新版本。

部署的聖盃

我已經介紹了相當多的 Cloud Foundry 服務及其 Grails 外掛,但我希望您能看到 Grails 和 Cloud Foundry 結合後部署變得多麼簡單直接。它們確實使 Web 應用程式的部署變得簡單快捷。隨著當前版本的 Cloud Foundry 日趨成熟,將新增越來越多的服務,以便您可以在其上託管更復雜的應用程式。

最後,正如我前面提到的,在下一篇文章中,我將介紹一個更復雜的示例應用程式,它結合了多個 Cloud Foundry 服務。它將更深入地探討部署到雲服務以及您需要考慮的事項。您還可以從 GitHub 上的Cloud Foundry Samples wiki 中獲取額外資訊。直到下次,享受新服務吧!

訂閱 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

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

瞭解更多

獲取支援

Tanzu Spring 透過一個簡單的訂閱提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案。

瞭解更多

即將舉行的活動

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

檢視全部