经常有读者在后台向我提问,一些个性化的问题就直接在后台回复了。也有些比较普遍的问题,比如下面这个:
自己的项目有多个应用,这些应用是要部署到同一个 Tomcat 里好,还是多个应用分别部署到不同的 Tomcat 里,每个里面只部署一个应用好呢?
最近在 Tomcat 官方的「 邮件组 」里也看到类似的问题,可能这个问题不分国界。一些 Tomcat 的 commiter 也给出了自己的看法,大家看法都不一样,正好咱们一起来看看,两种情况相比较,到底怎样使用适合。
首先我们自己先想一下,如果多个应用部署到一个 Tomcat 实例中,优劣分别有哪些呢?
安装管理、监控都方便,只需要安装一个 Tomcat,所有的操作都指向同一个实例即可。
多个应用共用 Tomcat 的内存,容易互相影响。如果有一个应用占用堆太多,频繁的 GC 也会使其他应用跟着暂停。
每个 Tomcat 实例部署一个应用呢?
优势:
- 多个应用之间 Tomcat 的内存互相隔离,互相之间无影响。一个应用crash,频繁 GC,都只影响其自己,影响面缩小。
相比一个实例,安装管理、监控都较繁琐一些。可以通过安装一个实例,设置不同的 CATALINA_HOME
来简化一些操作。
邮件组里的问题描述比上面的更详细一些。并且罗列了自己认为的优劣。
邮件内容较多,我选其中关键的几段翻译如下:
其中描述意见分歧在 开发人员 和 运维人员之间
运维认为一个 Tomcat 部署多个应用,原因如下:
省内存 (每个 Tomcat 都会有内存的 footprint,即使没有应用部署运行)
省去额外的文件系统 (logs, tomcat installation, temp directory)
省去 nagios 监控配置
省去不少独立的端口 (security considerations)
省去每个都打安全补丁
开发人员认为应该一个 Tomcat里只部署一个应用,理由如下:
多个应用部署在一起,启动时间太长
多个应用部署在一起,一个出了问题,会影响到其他的应用 (OOM, 线程数打满 等等)
如果你需要在线上进行应用heap, 线程的dump, cpu使用等诊断分析,独立部署则不会影响到其他应用
邮件组里的回复,大部分倾向于一个应用部署一个Tomcat:
这样概念上最简单,应用之间不会互相影响。同时呢,可以使用不同的JVM,不同的环境,不同的库,不会互相限制,也不用测试这些应用间的兼容性。
多个应用部在一起,如果都是占用内存比较大的,比如占用Heap 较多,如果赶上一次Full GC,就会导致暂停时间较长,这样多个应用的线程都受影响。
Tomcat 的核心开发人员 Mark 认为这两种情况应该视情况而定。 如果你的一个应用需要特别多的资源,这样尽量一个应用部署到一个Tomcat中以满足企业的要求。 否则,倾向于多个应用共用同一个 Tomcat ,这样方便管理和运维。
我个人倾向于生产环境每个应用独立部署,每个应用独立监控,资源管理也互相隔离。在开发的时候,可以只设置一个 Tomcat 实例,部署多个应用到一个Tomct也更快捷,没那么多个性化要求,不需要再配置一堆的端口。当然,如果线上也都是各种小应用,没什么要求,部署到一起也OK。
总结下,生产上如果应用小,嫌麻烦,出问题可接受,都放到一起也没问题。如果占用资源比较大,需要稳定性等,尽量独立部署,开发环境就怎么方便怎么来。
相关阅读:
如何加入Tomcat邮件组和开发者对话?
你一定不知道IDE里的Tomcat是怎么工作的!
关注『 Tomcat那些事儿 』 ,发现更多精彩文章!了解各种常见问题背后的原理与答案。深入源码,分析细节,内容原创,欢迎关注。
转发是最大的支持 ,谢谢
更多精彩内容:
一台机器上安装多个Tomcat 的原理(回复001)
监控Tomcat中的各种数据 (回复002)
启动Tomcat的安全机制(回复003)
乱码问题的原理及解决方式(回复007)
Tomcat 日志工作原理及配置(回复011)
web.xml 解析实现(回复 012)
线程池的原理( 回复 014)
Tomcat 的集群搭建原理与实现 (回复 015)
类加载器的原理 (回复 016)
类找不到等问题 (回复 017)
代码的热替换实现(回复 018)
Tomcat 进程自动退出问题 (回复 019)
为什么总是返回404? (回复 020)
...
PS: 对于一些 Tomcat常见问 题 ,在公众号的【 常见问题 】菜单中,有需要的朋友欢迎关注查看