使用 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 服务时按回车键即可。然后我们等待插件完成应用程序的部署——瞧!应用程序已启动并运行,随时可以使用。

[边栏标题=Cloud Foundry 经典版]您可能会注意到 Cloud Foundry 插件的 0.1 和 0.2 版本。这些版本仅适用于 Cloud Foundry 经典版服务,因此请确保您没有意外安装其中一个版本。[/边栏]

还有什么比这更简单的呢?在此阶段需要注意的主要事项是,您不能将应用程序部署到已在使用的 URL,因此您将无法将 Pet Clinic 应用程序部署到 URL http://petclinic-grails.cloudfoundry.com/,例如。不用担心:您可以更改 application.properties 中的应用程序名称,或者在部署时指定不同的应用程序名称,正如我们稍后在更仔细地查看一些命令时将看到的那样。

还有一点需要注意:cf-*命令默认为“开发”环境,但您通常希望将“生产”环境用于部署。这就是我们在上述命令中指定“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,在我的下一篇文章中,我将介绍一个更复杂的示例,该示例使用所有三种类型的服务。

在当前示例中,Cloud Foundry 会自动为我们生成已配置服务的名称“mysql-52db6”,但如果您手动配置服务,也可以为其指定自己的名称。例如

    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)控制创建哪种类型的 MySQL 表,以及 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 插件也适用。

在结束之前,还有一件事:在将使用这些服务的应用程序部署到 Cloud Foundry 之前,请确保您安装了 MongoDB 和 Redis 插件的最新版本。

部署的圣杯

我已经介绍了相当多的 Cloud Foundry 服务及其 Grails 插件,但我希望您能看到 Grails 和 Cloud Foundry 的组合使部署变得多么简单。它们确实使 Web 应用程序的部署变得简单快捷。并且随着 Cloud Foundry 当前版本的成熟,将添加越来越多的服务,以便您可以在其上托管更复杂的应用程序。

最后,正如我之前提到的,在下一篇文章中,我将研究一个更复杂的示例应用程序,该应用程序结合了多个 Cloud Foundry 服务。它将更深入地探讨部署到云服务以及需要考虑的事项。您也可以从 GitHub 上的 Cloud Foundry 示例 Wiki 获取更多信息。直到下次,享受新的服务!

获取 Spring 新闻通讯

与 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,以加速您的进步。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部