java - 如何使用免费软件对Java Web应用程序进行连续部署

标签 java spring-mvc tomcat osgi web-deployment

我们目前正在使用PHP,持续部署非常简单。我们在服务器上有一个裸露的git存储库,Jenkins将其推送到服务器,而git post接收钩子会进行检出并将新的符号链接移至new version over the old symlink

我们如何用Java Web项目做同样的事情?


一键式部署(当前为git push --tags $ {VERSION} ^ 0:master)
没有停机时间(没有重新启动servlet容器吗?)
仅使用免费软件
可以快速回滚到先前版本的可能性(秒)
另外:旧的会话仍使用旧的代码,但会收到警告以重新加载页面
部署仅需几秒钟


我应该为此调查OSGI吗?

最佳答案

通常,由于Java至少需要编译并且其基础结构与PHP不同,因此与PHP相比,您需要在Java自动化方面投入更多的精力。


考虑一下您的架构


根据您的问题,您似乎想完全用Java重新实现现有的PHP Web应用程序,即前端也将用Java实现。而不是用Java重新实现完整的应用程序,您应该讨论仅将Java用于后端服务,因为后端服务可能是无状态的,不需要使用会话。前端可以是仅具有JavaScript框架(例如Angular,Ember等)的PHP和/或HTML,该框架直接调用后端服务。


选择一个部署模型


如果要开发JavaEE样式的Web应用程序,则需要一个容器,并以该容器可部署的格式打包应用程序。您可以选择诸如Tomcat或Jetty之类的servlet容器,并将您的应用程序打包为WAR文件,然后将其部署到该容器中。假设您遵循该路径,则需要确定是要在每次部署应用程序时将容器作为应用程序的一部分进行部署,还是要求已将容器安装在服务器上。

另一种选择是将Servlet引擎嵌入到您的应用程序中,或选择另一种部署模型附带的其他技术,例如Vert.x。每种方法都有优点和缺点。我个人比较喜欢将我的应用程序打包为一个完整的,随时可以运行的程序,也就是将容器作为部署的一部分。


选择一种部署策略(git push hook,CI服务器等)


我建议使用CI服务器,例如Hudson或Jenkins。一旦推送了新版本,它可以轮询Git存储库以进行更改,并编译Java代码库。也可以实现一个Git挂钩,该挂钩在推送时触发CI服务器中的进程。

CI服务的好处在于,它提供了对构建代码分析,测试和报告的附加支持,使您可以将决策过程实施到部署过程中。例如,如果构建失败,出现测试错误或代码扫描揭示了潜在的安全问题,则部署将中止。

假设您使用CI服务,则可以随时部署任何“良好”的Git修订版。因此,CI服务也可以用于回滚。

您还需要考虑部署数据库更新。可以在启动/初始化期间从应用程序内部完成。但这对于回滚可能变得至关重要。某些更改不向后/向前兼容。但是,无论采用哪种技术,即Java和PHP,都需要解决此问题。


无停机时间


我不确定OSGi是此问题的解决方案/答案。如果停机对您而言至关重要,则无论如何都需要高可用性解决方案。 OSGi或任何其他Java容器中的停机时间部署都很难实现。鉴于无论如何都必须有HA环境,因此付出的努力通常是不值得的(这是我个人的观点)。因此,我建议不要沿着这条路走,而要为此利用HA /负载平衡基础架构。拆除节点,进行部署,对其进行测试,然后将其重新投入使用-或者,如果您在可编写脚本的IaaS环境中运行-则购买一台新计算机,对其进行部署,对其进行测试,然后将其投入使用。当然,所有这些都需要自动化。


旧会议


这在很大程度上还取决于您的基础架构/体系结构。但是您可能希望将会话存储区与容器(例如Memcache,Redis,其他数据库)分开。会话仅包含数据。因此,代码/应用程序逻辑需要处理会话中的过时/不兼容数据。


部署时间


这些天,任何好的容器都会在几秒钟内开始。经常将其固定的应用程序。 IoC容器(例如Spring或Guice)倾向于在启动时急于初始化事物。这不是一件坏事,但是会增加启动时间,直到您的应用程序准备就绪为止。懒惰的方法在这里可能会更有用,尤其是在并非所有节点都需要所有功能的情况下。因此,即使在Java中也可以实现快速部署。但这需要仔细实施。

关于java - 如何使用免费软件对Java Web应用程序进行连续部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27592987/

相关文章:

java - 如何修复碰撞响应中的圆形和矩形重叠?

java - SWT 滚动条上的鼠标事件

java - SPRING4 : Failed to read candidate component class CouchbaseConfig. 类

java - Eclipse 中的链接项目/文件夹不会部署在 tomcat 中

java - 在 Tomcat 上部署后显示应用程序上下文路径

java - 预测 Java 内存

java - 使用 retrofit 和 rxjava 重复调用 API

java - 根据 Spring Boot 中的角色获取用户列表

java - 使用 JUnit 进行测试时,Spring MVC 中的 Hibernate validator 不工作

tomcat - 如何识别和确定并修复 Tomcat 日志中显示的错误