我有一个 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/