java - 高效部署同一 WAR 的多个实例(不同的上下文,相同的容器)

标签 java tomcat glassfish jetty war

我有一个 WAR (app.war) 和一个容器(Tomcat、Jetty、Glassfish 等等)。 我的目标是按需在容器上部署同一 Web 应用程序的数百个实例。

http://foo/app1 --> app.war
http://foo/app2 --> app.war
http://foo/app3 --> app.war 
...
http://foo/appN --> app.war

一些明显的实现方式:

  • 在 Tomcat 中,为每个应用程序(名为 appN.xml)创建一个 context.xml 文件,所有文件都指向同一个 WAR。其他容器也有类似方法
    • 这种方式的问题:会爆N次WAR,占用大量磁盘空间
  • 使用符号链接(symbolic link)创建指向 app.war 分解版本的 webapp/{app1,app2,appN} 文件夹。这可以防止磁盘空间爆炸,但 JVM 仍在将许多重复的 JAR 加载到内存中
  • 使用一些共享的 lib 文件夹来包含大多数 jar(以及前两个选项的组合)。

我想知道是否有更好的方法来做到这一点。理想情况下,创建一个新实例不应该占用任何更多的磁盘空间(边际配置文件除外)并且只占用与线程执行堆栈和其他运行时分配相关的内存。

有什么想法吗?

最佳答案

Jetty 通过所谓的覆盖添加了对您寻找的内容的支持。

http://wiki.eclipse.org/Jetty/Tutorial/Configuring_the_Jetty_Overlay_Deployer

从 wiki 页面复制一点:

  • 您可以保持 WAR 文件不可变,甚至签名,以便清楚您部署的是哪个版本。
  • 您为自定义/配置网络应用程序所做的所有修改都是单独的 WAR,因此很容易识别以供审查和迁移到新版本。
  • 您可以创建一个参数化模板叠加层,其中包含适用于 Web 应用程序的许多实例(例如,用于 Multi-Tenancy 部署)的常见自定义和配置。
  • 由于分层部署清楚地标识了公共(public)组件和实例特定组件,Jetty 能够为模板共享类加载器和静态资源缓存,大大减少了多个实例的内存占用。

关于java - 高效部署同一 WAR 的多个实例(不同的上下文,相同的容器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10183255/

相关文章:

java - Android 相机应用程序 - 大位图处理

tomcat - 使用 Struts 2 上传文件时出现 NullPointerException

mysql - Estado HTTP 404-/pentaho/首页

java - 当从 imageservlet 提供多个 blob 图像时,Glassfish 挂起

java - GlassFish JDO 和全局对象

java - Glassfish 基本身份验证错误

JavaFX:用于放置矩形的嵌套 for 循环不起作用

java - Glassfish 4 无法启用远程管理?

java - 基于 Cron 的作业,位于数据库中

c# - 为希望在 JSP+Tomcat 中构建的 ASP.NET/C# 开发人员预订推荐信?