使用 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。

只有連線設定會被覆蓋,因此您仍然可以透過自定義方言(例如 InnoDB)和 Hibernate 是否應保持資料庫架構最新(透過“dbCreate”屬性)來控制建立的 MySQL 表的型別。只需確保將自定義項放在適當的環境塊中。例如,在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 之前,請確保安裝最新版本的 MongoDB 和 Redis 外掛。

部署的聖盃

我已經涵蓋了 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 社群所有即將舉行的活動。

檢視所有