【发布时间】:2012-04-28 07:43:28
【问题描述】:
我有一个 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 中,为每个应用程序创建一个 context.xml 文件(名为 appN.xml ),所有文件都指向同一个 WAR。其他容器也有类似的方法
- 这种方法的问题:会爆炸WAR N次,占用大量磁盘空间
- 使用符号链接创建指向 app.war 扩展版本的 webapp/{app1,app2,appN} 文件夹。这可以防止磁盘空间爆炸,但 JVM 仍在将许多重复的 JAR 加载到内存中
- 使用一些共享 lib 文件夹来包含大多数 jars(以及前两个选项的组合)。
我想知道是否有更好的方法来做到这一点。理想情况下,创建一个新实例不应该占用更多的磁盘空间(除了边缘配置文件),并且只占用与线程执行堆栈和其他运行时分配相关的内存。
有什么想法吗?
【问题讨论】:
-
您会考虑将应用程序重写为多租户应用程序吗?如果有 100 个完全相同的 WAR 和代码的实例,我会考虑只设计 1 个将部署到根上下文的 WAR?
-
@beny23 详细的解释也可以帮助我处理我正在做的一些事情。你有机会提供一个吗?
-
我在下面发布了一个答案,但是如果您告诉我们您为什么要这样做,我可能会发布一个更好的答案。
-
感谢您的提示;)这是一种多租户设置。我需要为应该在自己的上下文中运行的每个用户提供一个“相同”的应用程序。以这种方式构建应用程序的原因超出了本文的范围,但有一个强大的商业案例推动了这一点。
-
如果你给我们商业案例,我可能会有更多的建议。它与安全有关吗?不同的上下文无济于事。是每个用户都需要自己的 URL 路径吗?您可以通过 URL 重写来做到这一点。或者给每个用户一个子域(使用 servlet 过滤器很容易做到)。
标签: java tomcat glassfish jetty war