Java常用的服务器主要有Apache Tomcat、Eclipse Jetty、Undertow、WildFly(JBoss)、Oracle WebLogic和IBM WebSphere,其中Tomcat凭轻量灵活占据中小型应用的主流,WebLogic与WebSphere则主导金融、电信等大型企业核心系统。选型不能只看名气,要结合部署环境、并发规模、预算和团队维护能力,下面按实际使用场景逐一拆解。
先搞懂:java服务器有哪些主流选择?
很多新手刚接触Java时,把“服务器”和“Tomcat”画等号,其实Java服务器分成两类:Servlet容器和全功能Java EE/Jakarta EE应用服务器,前者只跑Web应用和REST接口,后者还带EJB、JMS、JTA等企业级组件。
Servlet容器:Tomcat、Jetty、Undertow
这三者是日常接触最多的,都支持Servlet、JSP和WebSocket,适合Spring Boot嵌入式或独立部署。
- Apache Tomcat:Apache软件基金会出品,社区最活跃,资料最多,生产环境中绝大多数传统Java Web项目直接扔war包到Tomcat的
webapps目录就能跑,Tomcat 10以后包名从javax.改为jakarta.,迁移老项目时要改依赖。 - Eclipse Jetty:主打轻量和嵌入式,启动快,内存占用低,常用于内部工具、边缘网关或需要快速启动的微服务实例,Jetty的Session集群和WebSocket支持也比较成熟,但资料比Tomcat少。
- Undertow:Red Hat开源的NIO式服务器,WildFly的默认Web容器,高并发静态文件处理能力强,Spring Boot 2.x以后默认不用Tomcat时,很多人选Undertow换掉默认容器,压测数据往往比Tomcat平稳。
全功能应用服务器:WildFly、WebLogic、WebSphere
- WildFly(原JBoss):开源,模块化架构,支持完整Jakarta EE规范,适合要用EJB、JTA等重型规范的传统企业项目,迁移自WebLogic的场景不少。
- Oracle WebLogic:商用,长期支撑电信、银行核心系统,它最大的价值在于集群管理、会话复制和与Oracle数据库深度集成,缺点是授权费高,部署相对重。
- IBM WebSphere:老牌商用服务器,传统大企业信息系统里有大量存量部署,稳定性极强,但整体技术栈偏老旧,新项目已经很少选它。
tomcat和undertow怎么选?高并发场景的实战对比
这是开发者在Spring Boot项目里最常纠结的问题,两者都是Servlet容器,但设计取向不同,行业共识认为:并发上不去时先查业务代码和数据库,再考虑换服务器,但容器确实会影响极限吞吐量。
性能差异的关键点
Tomcat从8.5开始支持NIO模式,默认用Http11NioProtocol,Undertow本身就是基于XNIO构建,对高并发连接的处理更激进,在JVM参数相同、业务逻辑相同的前提下,压测结果往往是Undertow的响应时间抖动更小,尤其是大量慢请求或长连接场景。
| 对比项 | Tomcat | Undertow |
|---|---|---|
| 默认IO模型 | NIO2 | NIO(XNIO) |
| 内存占用 | 偏高 | 更低 |
| 配置文件 | server.xml | application.yml(嵌入式) |
| Spring Boot默认支持 | 是(默认) | 是(需排除默认) |
| 静态文件处理 | 一般 | 较好 |
| 文档丰富度 | 极丰富 | 较少 |
换用Undertow的具体操作
在Spring Boot项目中,修改pom.xml排除Tomcat依赖,引入Undertow即可:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
然后调整application.yml里的线程池参数:
server:
undertow:
io-threads: 4
worker-threads: 32
io-threads一般设为CPU核心数,worker-threads按CPU核心数 8起步,然后观察线程阻塞率逐步调整,注意,不要盲目调大线程数,否则线程切换反而拖慢吞吐。
什么时候继续用Tomcat
- 项目用了JSP,或者依赖Tomcat的虚拟主机、Manager管理界面。
- 团队运维人员熟悉
server.xml和Tomcat的catalina.out日志体系。 - 要部署到云厂商的Java Web托管环境,这些环境大多只原生支持Tomcat。
如果只是内部低并发系统,Tomcat完全够用,没必要折腾Undertow。选Undertow的前提是你能接受Spring Boot内嵌式部署,且不需要Tomcat的额外管理功能。
weblogic服务器价格与商用授权值不值?
企业采购时经常会直接问:“weblogic服务器价格大概多少?”这里不报具体价,因为Oracle按CPU核心数和产品版本(标准版、企业版)动态报价,不同区域、不同代理渠道差别很大,但可以明确的是,WebLogic的授权费通常远高于一台普通物理服务器本身的成本。
什么场景必须买WebLogic
- 核心交易系统要求跨机房会话实时复制,WebLogic的Session P2P复制机制相当成熟。
- 用了EJB、JMS等Java EE组件,并且要和Tuxedo、Oracle数据库强绑定。
- 存量系统已经跑在WebLogic上,重写成本过高。
不推荐WebLogic的场景
- Spring Boot单体应用或微服务集群,用Tomcat或Undertow足够。
- 项目预算有限,运维部没有专门的WebLogic DBA。
- 系统刚起步,流量增长不确定,按CPU授权的方式后期扩容成本会很高。
业内专家指出,商业服务器真正的价值在于7×24小时原厂支持和经过长时间验证的稳定性,而不是跑得快,如果不需要这些服务,纯开源方案省下的预算可以多配两台机器。
按场景选java应用服务器:从单体到微服务
选型不是单选题,而是看你的部署形态。
单体Web应用
- 用传统war包部署在Tomcat,最简单稳定。
- 如果不依赖外部容器的JMX监控,直接在Spring Boot内用
java -jar跑也行,但要自己处理日志轮转和开机自启。
微服务架构
- Spring Boot默认内嵌Tomcat,不想改就用它。
- 追求更高并发且愿意调参,换Undertow。
- 每个服务内存受限,考虑Jetty的
maven-jetty-plugin做快速开发,生产环境还是建议统一用内嵌容器。
核心操作:将war包部署到Tomcat
- 构建项目:
mvn clean package,或让CI工具产出.war文件。 - 将war复制到Tomcat的
webapps目录,
cp target/app.war /opt/tomcat/webapps/ - 启动Tomcat:
/opt/tomcat/bin/startup.sh - 查看日志确认部署成功:
tail -f /opt/tomcat/logs/catalina.out - 访问测试路径:
http://ip:8080/app/
如果是Spring Boot内嵌容器,直接nohup java -jar app.jar &启动,然后通过jps或ps -ef验证进程。
java服务器怎么选?常见问题解答(Q&A)
Q1:学Java开发需要先装哪个服务器?
建议从Tomcat开始,它是绝大多数教程和项目的默认环境,遇到编译或部署问题搜到的解决方案最多,装好JDK后,直接去Apache官网下载核心版本,解压后设置CATALINA_HOME即可。
Q2:Tomcat的线程池满了怎么办?
先看日志里是阻塞在连接等待还是业务执行,如果是业务慢,调大maxThreads只治标不治本,优先优化SQL和外部调用,Tomcat的server.xml中Connector节点的maxThreads默认200,可以按压测结果逐步提升,但超过500后通常要考虑集群。
Q3:微服务用Undertow需要额外配置什么?
除了依赖切换,还要注意Undertow默认不显示访问日志,需要在配置里开启server.undertow.access-log-enabled=true,端口冲突时检查server.port,与Tomcat一样直接设置即可,Undertow对Servlet Filter兼容性良好,但某些依赖Tomcat特有API的第三方库可能会报错,这类情况只能退回Tomcat。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/721743.html





