我们目前正在使用PHP并且持续部署非常简单。我们在服务器上有一个简单的git repo,Jenkins推送它并且git post receive hook执行checkout并将新的符号链接移动到new version over the old symlink。
我们如何使用Java Web项目做同样的事情?
我应该为此调查OSGI吗?
答案 0 :(得分:3)
一般而言,考虑到Java至少需要编译并且基础结构与PHP不同,您需要投入更多精力在Java中自动化流程,而不是PHP。
根据您的问题,您似乎希望完全用Java重新实现现有的PHP Web应用程序,即前端也将用Java实现。不应该使用Java重新实现完整的应用程序,而应该讨论仅使用Java作为后端服务,这些服务可能是无状态的,并且不需要使用会话。前端可以是PHP和/或HTML,只能使用JavaScript框架(例如Angular,Ember等),它直接调用后端服务。
如果要开发JavaEE样式的Web应用程序,则需要一个容器,并以容器可部署的格式打包应用程序。您可以选择一个servlet容器(如Tomcat或Jetty),并将您的应用程序打包为WAR文件,然后将其部署到容器中。假设您遵循该路径,则需要确定是否要在每次部署应用程序时将容器部署为应用程序的一部分,或者是否已要求将容器安装在服务器上。
另一个选择是将servlet引擎嵌入到您的应用程序中,或者选择另一种技术,例如Vert.x,它附带另一种部署模型。两种方法都有利弊。我 - 个人 - 更喜欢将我的应用程序打包为一个完整的,准备执行的runnable,即使容器成为部署的一部分。
我会推荐一个CI服务器,如Hudson或Jenkins。它可以轮询Git存储库以进行更改,并在推送新版本后编译Java代码库。它也可以实现一个Git钩子,它在推送时触发CI服务器中的一个进程。
CI服务的好处在于它提供了对构建的代码分析,测试和报告的额外支持,允许您在部署过程中实施决策制定流程。例如,如果构建失败,有测试错误或代码扫描发现潜在的安全问题,则部署将中止。
假设您使用CI服务,则可以部署任何" good" Git随时修改。因此,CI服务也可用于回滚。
您还需要考虑部署数据库更新。它可以在引导/初始化期间从您的应用程序中完成。但这可能在回滚时变得至关重要。某些更改不会向后/向前兼容。但无论采用何种技术,无论是Java还是PHP,都需要解决这个问题。
我不确定OSGi是这个问题的解决方案/答案。如果停机对您来说至关重要,那么无论如何都需要HA解决方案。 OSGi或任何其他Java容器中的停机部署都很难实现。鉴于无论如何都需要HA环境,这种努力往往是不值得的(这是我个人的意见)。因此,我建议不要走这条路,而是利用HA /负载平衡基础设施。取下节点,部署它,测试它,重新投入使用 - 或者如果您在可编写脚本的IaaS环境中运行 - 获取新机器,部署它,测试它,将其投入使用。当然,所有这些都需要自动化。
这在很大程度上还取决于您的基础架构/架构。但是您可能希望会话存储与容器分开(例如Memcache,Redis,其他数据库)。会话只包含数据。因此,代码/应用程序逻辑需要处理会话中的staleg /不兼容数据。
这几天任何好的容器都会在几秒钟内启动。它是定期拧紧它的应用程序。 IoC容器(例如Spring或Guice)倾向于在启动时急切地初始化事物。这不是一件坏事,但会增加启动时间,直到您的应用程序准备就绪。如果不是所有节点都需要所有功能,那么惰性方法在这里可能会更有帮助。因此,即使在Java中也可以实现快速部署。但它需要仔细实施。