【问题标题】:grails executable war deploymentgrails 可执行战争部署
【发布时间】:2017-07-11 21:52:21
【问题描述】:

在不解释为什么我们让这次升级如此缓慢的情况下,我们将在升级到 Grails 3.3.0 (Java 8) 时分解我们的 Grails 2.2.4 (Java 6) 单体。这个想法是渐进式升级,而不是试图做一个大爆炸式的升级,这似乎是一件好事。虽然我们正在这样做,但我们希望最终得到更多基于服务而不是单片的东西。

为了将外部依赖降至最低,我决定使用可执行的战争部署模型,因此当我们将构建工件部署到生产环境中的各种环境时,事情只能根据定义的配置元素而有所不同。

我已将第一部分移至 Web 服务中,并且在我的本地环境中一切正常;也就是说,我已经重构了单体来调用服务,并让服务在命令行中使用 java -jar 运行。现在我正在尝试将它与我们的自动化构建和部署工具 (Bamboo) 集成。

我们当前的流程(对于单体应用程序)是停止 Tomcat 实例 (shutdown.sh),部署战争,然后重新启动 Tomcat (startup.sh)。当它作为可执行战争运行时,我该如何实现这一点 - 具体来说,停止正在运行的实例/服务?

我的第一个想法是编写一个脚本来查找特定 java -jar 进程的 pid 并将其杀死,但这似乎不优雅。有没有更好的办法?

谢谢!

【问题讨论】:

  • 可以在 docker 容器中部署您的服务并根据需要启动停止容器!
  • 是的,引入 Docker、Spring Boot 或类似的东西肯定会奏效,但我希望在我们确定价值后推迟对这项工作的投资。前期投入大量资金开始实验,感觉不是很灵活。希望有一种方法可以使 Grails 生产环境的可执行战争功能做好准备。

标签: tomcat grails


【解决方案1】:

当你创建一个可执行的war/jar时,这个脚本[0]被嵌入其中,所以你可以像这样执行它./foo.jar stop

你可以看到,他们只是向进程发送 kill 命令。这是一个中断,因此进程会看到它并开始干净关闭。如果运行 kill -9 时未完全关闭,也会强制停止。

此脚本的行为也类似于 init.d 脚本,因此您只需将其链接到您的 /etc/init.d/foo 并运行类似 service foo start|stop|restart 的命令

最后,您可以公开关闭端口,调用该端口也将启动干净关闭。 (当然不要将该端口暴露给互联网)

[0]https://github.com/spring-projects/spring-boot/blob/master/spring-boot-tools/spring-boot-loader-tools/src/main/resources/org/springframework/boot/loader/tools/launch.script

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    相关资源
    最近更新 更多