領先一步
VMware 提供培訓和認證,助您加速進步。
瞭解更多幾年前,一家初創公司的聯合創始人曾在倫敦 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.groovy或grails-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中獲取額外資訊。下次再見,享受這項新服務吧!