springboot tomcat(长文讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言:Spring Boot 与 Tomcat 的共生关系

在 Java Web 开发领域,Spring Boot 与 Tomcat 的结合堪称“黄金搭档”。Spring Boot 作为简化 Spring 应用配置的框架,其内嵌 Tomcat 的设计,让开发者无需手动部署服务器,即可快速启动 Web 服务。对于编程初学者而言,理解这一组合能大幅降低入门门槛;对于中级开发者,则能通过深入掌握其底层机制,提升系统优化能力。本文将从基础概念、配置方法、性能优化等维度,系统讲解 springboot tomcat 的核心知识点,并通过实际案例演示操作步骤。


一、Spring Boot 中 Tomcat 的角色与原理

1.1 Tomcat 是什么?

Tomcat 是一个开源的 Servlet 容器,负责接收 HTTP 请求,处理 Java Web 应用的动态内容,并返回响应。其核心功能包括:

  • 管理 HTTP 连接
  • 调用 Servlet 处理请求
  • 支持 WebSocket、JSP 等技术

比喻:可以将 Tomcat 想象成一家快递公司,负责接收(接收 HTTP 请求)、分拣(路由请求到对应处理逻辑)、打包(生成响应内容)并发货(返回 HTTP 响应)。

1.2 Spring Boot 如何内嵌 Tomcat?

Spring Boot 默认通过 spring-boot-starter-web 依赖引入 Tomcat 的内嵌版本。其核心是 SpringApplication 类,它会在应用启动时自动加载 Tomcat 配置,并启动服务器。

代码示例

// Spring Boot 启动类
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

当程序运行时,SpringApplication 会自动创建一个内嵌 Tomcat 实例,并绑定端口(默认 8080)。开发者无需编写任何 Tomcat 配置代码,即可启动 Web 服务。


二、配置自定义的 Tomcat 实例

2.1 修改 Tomcat 端口

通过 application.properties 文件可快速调整 Tomcat 端口:

server.port=8090

2.2 自定义 Tomcat 连接器参数

若需更细粒度的配置(如设置最大线程数、超时时间等),可通过 EmbeddedServletContainerCustomizer 接口实现:

代码示例

@Component
public class TomcatConfig implements EmbeddedServletContainerCustomizer {
    @Override
    public void customize(ConfigurableServletWebServerContainer container) {
        if (container instanceof TomcatServletWebServerContainer) {
            TomcatServletWebServerContainer tomcatContainer = (TomcatServletWebServerContainer) container;
            tomcatContainer.addAdditionalTomcatConnectors(createConnector());
        }
    }

    private Connector createConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setPort(8005); // 设置 AJP 端口
        connector.setProtocol("AJP/1.3");
        return connector;
    }
}

此代码展示了如何添加 AJP 协议的连接器,适用于与 Apache 服务器集成的场景。


三、内嵌 Tomcat 与外部 Tomcat 的对比

3.1 核心区别

特性内嵌 Tomcat外部 Tomcat
部署复杂度极简(无需独立安装)需手动配置服务器
环境隔离性与应用代码强耦合可独立于应用版本管理
性能优化空间受 Spring Boot 默认配置限制支持更灵活的参数调整

3.2 选择建议

  • 内嵌 Tomcat:适合开发、测试阶段,或轻量级生产环境。
  • 外部 Tomcat:适用于需要集群管理、高并发场景,或需与企业级服务器(如 Apache、Nginx)集成的情况。

四、Spring Boot Tomcat 的性能优化

4.1 线程池配置

Tomcat 的线程池直接影响并发处理能力。通过以下配置可优化线程资源:

server.tomcat.threads.min-spare=20  
server.tomcat.threads.max=200  
server.tomcat.threads.max-spare=300  

4.2 连接器参数调优

调整连接器的 max-connectionsaccept-count,可控制 Tomcat 同时处理的请求数:

server.tomcat.max-threads=200  
server.tomcat.accept-count=100  

4.3 监控与日志分析

启用 Tomcat 访问日志,可快速定位性能瓶颈:

server.tomcat.access-log-enabled=true  
server.tomcat.access-log-pattern="%h %l %u %t \"%r\" %s %b"  

五、常见问题与解决方案

5.1 端口冲突问题

现象:启动应用时提示 Address already in use:8080
解决:修改 server.port 配置,或终止占用端口的进程(如 lsof -i :8080)。

5.2 内存溢出(OOM)

现象:Tomcat 启动时抛出 OutOfMemoryError
解决:通过 JVM 参数调整堆内存:

java -jar -Xms512m -Xmx2048m your-app.jar  

5.3 跨域请求失败

现象:前端请求 Spring Boot 接口时,浏览器报跨域错误。
解决:添加跨域配置类:

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "POST", "PUT", "DELETE");
    }
}

结论:掌握 Spring Boot Tomcat 的核心价值

通过本文的讲解,我们系统梳理了 springboot tomcat 的工作原理、配置方法及优化技巧。对于开发者而言:

  • 初学者:可快速上手内嵌 Tomcat,专注于业务逻辑开发。
  • 中级开发者:可通过自定义配置和性能调优,提升系统稳定性与响应速度。

未来,随着微服务架构的普及,Spring Boot 与轻量级容器(如 Tomcat、Jetty)的结合仍将是 Java Web 开发的主流方案。建议读者通过实际项目演练配置流程,并深入阅读 Spring Boot 和 Tomcat 的官方文档,逐步成为该领域的技术专家。

最新发布