V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NoKey
V2EX  ›  程序员

多个后台服务,放到一个 tomcat 还是分开放在不同的 tomcat 呢

  •  2
     
  •   NoKey · 2020-04-27 15:12:10 +08:00 · 4455 次点击
    这是一个创建于 1662 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如我这里有 10 个服务,10 个 war 包

    是放在同一个 tomcat 呢

    还是放在不同的 tomcat 里呢?

    放在一个 tomcat 和多个 tomcat,对于同一台机器来说,有多大差异呢?

    这里面按照什么参数来考量呢?

    求大佬指点一下,谢谢

    29 条回复    2020-04-29 23:48:24 +08:00
    fkdog
        1
    fkdog  
       2020-04-27 15:18:18 +08:00
    那肯定要放多个 tomcat 啊。
    方便各个实例进行调整参数不影响其他服务。
    gz911122
        2
    gz911122  
       2020-04-27 15:18:22 +08:00
    jar 包呗 多省事

    tomcat 好麻烦啊...
    kop1989
        3
    kop1989  
       2020-04-27 15:20:20 +08:00
    好问题,帮顶了。我也想知道 tomcat 有没有类似 iis 的“应用程序池”概念。还是一个 tomcat 实例就只能是一个“应用程序池”。
    Hanggi
        4
    Hanggi  
       2020-04-27 15:21:01 +08:00
    golang 就没有这个问题。
    kaifang
        5
    kaifang  
       2020-04-27 15:21:57 +08:00
    用 docker ?
    qwerthhusn
        6
    qwerthhusn  
       2020-04-27 15:24:53 +08:00
    现在裸用 tomcat 的不多了,都是 spring boot 了
    spring boot 一个应用里面内嵌一个 tomcat 容器

    所以我感觉还是单独用比较好
    * 重启停用或者重新部署某个应用,可能需要重启 tomcat,重新加载 10 个应用
    * 没法精细调控每个应用的内存大小等
    * 涉及到日志,比如 tomcat 打印的一些日志,可能会把所有应用的混在一块,比如 access.log
    vincent927
        7
    vincent927  
       2020-04-27 15:39:56 +08:00
    从稳定性来讲,肯定是放不同 tomcat 好
    freedom0072006
        8
    freedom0072006  
       2020-04-27 15:45:13 +08:00
    不同
    xetv
        9
    xetv  
       2020-04-27 15:47:43 +08:00
    各自分开放,每个服务需要多少内存各自配置,放一起可能会比较频繁出现 OOM,而且你还不好排查。总之就是一个 tomcat 放多个 war 包问题多到头大。
    NoKey
        10
    NoKey  
    OP
       2020-04-27 16:29:46 +08:00
    @xetv 我在想这个问题。比如,所有服务需要的内存加到一起 16 个 g,那么,我就给这个 tomcat 分 16 个 g,和每个 tomcat 各自分,有多大差别。然后,tomcat 的线程和连接数量等设置问题,同一台机器的话,这个设置肯定有个上限,设置成一个和多台分开设置,加到一起的,始终不能超过上限。那么,就配置这方面来说,是不是放一个和放多个是一样的。优势是不是还是在可以单独停机上面😓
    NoKey
        11
    NoKey  
    OP
       2020-04-27 16:30:36 +08:00
    @qwerthhusn 我们这里要把 springboot 编成 war 包放到 tomcat 里😓
    daozhihun
        12
    daozhihun  
       2020-04-27 17:43:52 +08:00
    建议分开,不然一个挂了可能导致全都挂了。
    tomcat 的内存占用我觉得并不是问题,spring boot 框架本身的内存占用才是大头,相比之下 tc 的开销可以忽略了
    securityCoding
        13
    securityCoding  
       2020-04-27 17:45:24 +08:00
    建议不同 tomcat , 不过现在大都是 fatjar 了
    janda
        14
    janda  
       2020-04-27 20:44:05 +08:00
    可以多个 tomcat 、前面放一个 nginx 挡着!反向代理设置每个 tomcat 的路径、不影响使用
    cpstar
        15
    cpstar  
       2020-04-27 22:21:40 +08:00
    直接上 docker 多省心
    NoKey
        16
    NoKey  
    OP
       2020-04-28 00:46:04 +08:00
    @cpstar 省心么?上 docker 就要维护 docker,然后要上管理 docker 的系统,一层一层增加运维的事😄
    abcbuzhiming
        17
    abcbuzhiming  
       2020-04-28 07:37:23 +08:00
    user jar!not war!口号的提出的一个原因就是 tomcat 里多个应用是会互相影响的,有的时候一个应用把线程池耗干了会卡死其它应用。所以现在都推荐一个 jar 单独一个应用
    abcbuzhiming
        18
    abcbuzhiming  
       2020-04-28 07:38:20 +08:00
    @cpstar 在你上足够规模之前 docker 不省心,反而是个麻烦,我更倾向于直接用 systemd 管理应用
    xetv
        19
    xetv  
       2020-04-28 09:05:09 +08:00
    @NoKey #10 一个 tomcat 分 16g,多个应用同时跑,那每个应用占用的是不一样的,比如说有个应用代码有缺陷可能会引起整个 tomcat 内存频繁 gc 之类的,反而影响其他应用。如果是每个 tomcat 各自 1g,那不会出现互相影响了。还有就是 cpu 线程问题,那一个 tomcat 和多个 tomcat 其实没啥太大区别。
    你提到 tomcat 的连接数量,如果是多个应用一个 tomcat,那是共用连接数,分开放是各自使用各自的连接数。这点是有区别的。

    优势不仅是单独停机,而是运行的时候不在同一个容器里面,不会出现互相影响的情况。有些应用频繁申请内存频繁 gc,有些应用占用资源少,内存上是共用内存和各自使用各自的内存的区别,分开放不会引起太大的干扰。

    我们这边之前由于共用同一个 tomcat 出现过太多问题了,我是推荐分开放的。
    goinghugh
        20
    goinghugh  
       2020-04-28 09:47:09 +08:00
    @xetv 如果内存较为紧张,从减少内存开销的角度看,放在一个 tomcat 中是更好的吧 ?
    xetv
        21
    xetv  
       2020-04-28 14:10:41 +08:00
    @goinghugh 如果单从这个角度来看放一起会稍微好点。
    NoKey
        22
    NoKey  
    OP
       2020-04-28 15:59:56 +08:00
    @xetv 谢谢你的回复
    ren2881971
        23
    ren2881971  
       2020-04-28 17:03:07 +08:00
    多个 tomact 这样可以利用多个 jvm 。如果多个应用共用一个 jvm 性能很差。
    iminto
        24
    iminto  
       2020-04-28 17:16:17 +08:00
    @kop1989 多个后台服务,放到一个 tomcat 里,当然可以。

    而且有个优点,可以多个应用,使用同一个 jar 依赖,减少内存占用,当然缺点也很明显,会彼此互相影响
    kop1989
        25
    kop1989  
       2020-04-28 17:22:02 +08:00
    @iminto 当然,但是 iis 之类的 web 容器是有“应用程序池”概念的,也就是一个 iis 容器可以提供多个互不影响的“应用程序池”。
    tomcat 据我所知应该是不能建立多个互不影响的 web 容器空间的吧?
    iminto
        26
    iminto  
       2020-04-28 17:27:04 +08:00
    @kop1989 嗯,tomcat 不行,得其他容器,比如 wildfly 应该是支持你说的这种
    cpstar
        27
    cpstar  
       2020-04-29 00:08:37 +08:00
    @NoKey 那你要把简单的事情复杂化,那是不一样的
    @abcbuzhiming docker 这东西,配全了自然好。但是如 LZ 单机起 10 个服务,然后反向代理或者散端口,咱不说服务器扛住扛不住,就这些配置(包括 nginx 和各个 tomcat 的)就够折腾一阵子了。docker 至少把配置都给虚拟化了,简单一个命令行,启动 10 个虚拟应用,不省心么
    NoKey
        28
    NoKey  
    OP
       2020-04-29 10:03:16 +08:00
    @cpstar docker 用的不多,请教一下,docker 里面的 tomcat 需要配置不? docker 上面还是应该有一个 nginx 吧?
    cpstar
        29
    cpstar  
       2020-04-29 23:48:24 +08:00
    @NoKey tomcat 想启动起来,得把 java_home 弄好吧,得把 server.xml 配置上吧,甚至 context.xml 和 web.xml 都得搞一搞,然后 catalina.sh 。相比较,docker 一条命令行,端口、webapps 都配置好了,当然想深入配置的话,可以把 server.xml 单拎出来,至于 java,镜像里已经封装好了。
    比如一句 docker run -it --rm -p 8888:8080 tomcat:9.0,直接启动一个标准 tomcat 实例,增加了-p 参数,开本机的 8888 端口对应到虚机里的 8080 端口,也就是将标准 tomcat 的 8080 转成了 8888,就这个过程按照配置的话至少 vi 一下 server.xml 。

    如果一个实例,那这么干一票也就算了,但是 10 个实例,10 条命令行省心还是干 10 次配置省心呢?

    至于前端的 nginx,看 lz 需求了,我感觉大概率他只需要 10 个端口,不需要统一端口通过 servername 或者 uri_path 区分
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1191 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 23:04 · PVG 07:04 · LAX 15:04 · JFK 18:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.