使用 Bear 将 Tomcat/Grails 应用部署到集群






4.27/5 (3投票s)
一个使用 Bear 部署 GitHub 上的 Petclinic Grails 演示项目的例子
引言
本文将介绍如何快速设置一个 Bear 项目,以便部署和运行 Tomcat/Grails 应用。
- 在集群上安装软件:JDK、Maven、Tomcat、Grails 等。
- 将您的应用程序部署到已安装的基础架构上
- 管理 Tomcat 主机和实例:启动、停止、检查状态
完整的演示可以在 Bear 的 GitHub 项目页面 找到。如果您想运行这个例子,一种更简单的方法是修改这个演示以适应您自己的情况并运行它。
背景
Bear 是一个轻量级的、用于 Groovy/Java/JVM 的远程自动化工具。Bear 与其他现有工具的不同之处在于它使用了编程方法。在 Bear 中,您的部署是一个普通的 Java 类,它可以有自己的 main()
方法。Bear 偏爱 static
类型安全、链式方法调用、FP 和流畅的编程技术。
安装 Bear
Bear 需要
- 1 台及以上具有 Linux 操作系统、标准密码身份验证的远程机器
- JDK 8(推荐用于 UI),JDK 7+ 用于运行控制台/UI
- Maven 3+。
mvn
必须在命令行中可用。
要安装 Bear,请在您的命令行中输入(可能需要管理员权限)
$ mvn com.chaschev:installation-maven-plugin:1.4:install -Dartifact=com.chaschev:bear
创建项目
要在现有项目中或只是在一个空文件夹中创建一个新的 Bear 项目
$ cd pet-clinic
$ bear --create pet-clinic --user my-actual-ssh-user --password my-actual-password --host my-remote-host
这将创建一个名为 .bear 的文件夹,其中包含自动生成的项目文件。
注意:当前版本中密码存储不安全。如果您想在本地文件中存储密码,可以编辑 .bear/petclinic.properties 文件。
接下来,如果您有多个主机,请在创建的项目文件中 .bear/PetClinicProject.groovy 编辑主机和阶段。为了快速检查设置,请运行
$ bear pet-clinic.ls
这将启动一个预定义的 ls
作业,它是一个用 @Method
注解标记的 Java 类的常规方法。这应该会显示 UI

接下来,您可以 运行烟雾测试 来确保一切正常。
添加插件
您可以在您喜欢的 Java IDE 或文本编辑器中编辑 Bear 项目。这里有一个关于 如何使用 Intellij Idea 进行操作的说明。如果您想在 Eclipse 或 Netbeans 中编辑您的 Bear 项目,并且在编辑 Groovy 类时遇到问题,您可以将其转换为 Java 并将其作为 Java 类进行编辑。
插件是通过在 Bear 项目中声明插件类型的字段来添加的。插件实例将在项目初始化期间注入
JavaPlugin java
MavenPlugin maven // optional, will install Maven
GitCLIPlugin git
MySqlPlugin mysqlPlugin
DeploymentPlugin deployment // deployment builder, a Builder class to glue the plugins together
DumpManagerPlugin dumpManager // optional, can be used for defining DbDump jobs
TomcatPlugin tomcat
GrailsPlugin2 grails
现在让我们看看工具版本是如何设置的,变量是如何链接的
@Override
protected GlobalContext configureMe(GlobalContextFactory factory) throws Exception {
maven.version.set("3.1.1");
java.versionName.set("jdk-7u51-linux-x64");
java.version.set("1.7.0_51");
grails.version.set("2.1.1")
tomcat.instancePorts.set("8080, 8081") // this will create 2 Tomcat instances on each host
tomcat.warName.setEqualTo(grails.warName); // links tomcat war-name to deploy to grails war-name
dumpManager.dbType.set(mongo.name()); // DB type for dump manager: mysql or mongodb
bear.appStartTimeoutSec.set(600) // override startup timeout for Tomcat}
使用 project.setup 安装软件
要在远程安装 JDK,您需要手动下载 Oracle JDK 发行版(Node.js 项目不需要),然后将其放在。在此示例中,我们使用的是 JDK 7u51
(Windows) c:\bear\shared\tools\jdk\jdk-7u51-linux-x64.gz
(Unix) /var/lib/bear/shared/tools/jdk/jdk-7u51-linux-x64.gz
这将在未来脚本化,目前下载是手动的。然后在您的控制台中
$ bear pet-clinic.setup --ui
或者在 main()
中
new PetClinicProject().setup()
这将安装并验证软件,并且还将使可执行文件从命令行可用。
添加部署
GitHub 项目地址在注解中设置
@Configuration(
...
vcs = "https://github.com/grails-samples/grails-petclinic.git",
branch = "master"
...
)
我们使用 DeploymentPlugin 来构建我们的部署。下面是任务的描述。每个任务都是在每个主机上运行的一个函数。
global.tasks.vcsUpdate
- 从 GitHub 检出或更新项目grails.build
- 使用 Grails 构建 WARtomcat.stop, tomcat.start
- 启动/停止 Tomcat 实例tomcat.deployWar
- 将 WAR 解压到 Tomcattomcat.watchStart
- 通过监视日志来等待应用程序启动_
- 一个通用的对象,类似于 jQuery 中的$
defaultDeployment = deployment.newBuilder()
.CheckoutFiles_2({_, task -> _.run(global.tasks.vcsUpdate); } as TaskCallable)
.BuildAndCopy_3({_, task -> _.run(grails.build); } as TaskCallable)
.StopService_4({_, task -> _.run(tomcat.stop); OK; } as TaskCallable)
.StartService_6({_, task -> _.run(tomcat.deployWar, tomcat.start, tomcat.watchStart); } as TaskCallable)
.endDeploy()
.ifRollback() // actions to take when there is an error
.beforeLinkSwitch({_, task -> _.run(tomcat.stop); } as TaskCallable)
.afterLinkSwitch({_, task -> _.run(tomcat.start, tomcat.watchStart); } as TaskCallable)
.endRollback()
整个过程看起来有点繁琐,但很难为相同的语义找到更短的语法。它的作用是将任务分配给部署阶段,这些阶段将在其他地方重用,例如启动、停止或回滚发布。
部署和管理 Tomcat
要部署您的应用程序,只需键入(main()
版本始终可用)
$ bear pet-clinic.deploy --ui
部署完成后,在您的浏览器中导航到其中一个主机,如果一切顺利,您将看到绿色的宠物。

要停止或启动 Tomcat 实例,请键入
$ bear pet-clinic.start --ui
$ bear pet-clinic.stop --ui
完整的演示可以在 Bear 的 GitHub 项目页面 找到。
关注点
整个过程可能看起来很乏味,但实际上您只需要复制和修改原始项目。而且我相信这比手动配置多实例 Tomcat 集群要少得多,而且还有其他一些优点。
如果在某个时候,您厌倦了按照说明操作,可以尝试探索命令 API(参见 Wiki),编写自己的部署或研究源代码(呃……好吧,有些东西还在开发中 ;-))。Bear 的编写初衷是保持简单。如果您只需要构建 WAR 并将其复制到多个主机,那就直接去做吧!
在接下来的文章中,我将介绍快速 Java 集群设置和一个简单的“无部署”构建示例。
祝您部署好运!