Spring Boot 应用打包部署到 Tomcat ,如何极致调优看这里

51 阅读3分钟

将 Spring Boot 应用打包部署到 Tomcat 后,性能优化需要从 ​​Tomcat 配置、JVM 调优、资源管理、代码优化​​ 等多个维度进行综合调整。以下是具体操作建议:


一、Tomcat 配置优化

1. ​​线程池调整​

  • ​核心参数​​:

    <!-- conf/server.xml -->
    <Connector port="8080" protocol="HTTP/1.1"
               maxThreads="500"        # 最大线程数(根据 CPU 核心数调整)
               minSpareThreads="50"    # 最小空闲线程数
               acceptCount="1000"      # 请求队列长度
               connectionTimeout="20000"  # 连接超时时间(毫秒)/>
    
    • ​说明​​:maxThreads 需结合服务器 CPU 和内存资源设置,避免过高导致上下文切换开销。

2. ​​连接器协议优化​

  • ​启用 NIO 或 APR​​:

    <Connector protocol="org.apache.coyote.http11.Http11NioProtocol" ... />
    
    • ​优势​​:NIO 提升非阻塞 I/O 性能,APR 利用原生库优化网络传输。

3. ​​压缩与缓存​

  • ​启用 GZIP 压缩​​:

    <Connector compression="on" compressableMimeType="text/html,text/xml,application/json" ... />
    
  • ​静态资源缓存​​:

    <Context>
      <Resources cachingAllowed="true" cacheMaxSize="102400" />
    </Context>
    

二、JVM 调优

1. ​​堆内存配置​

  • ​启动参数​​(setenv.shcatalina.sh):

    JAVA_OPTS="-Xms1024m -Xmx2048m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UseG1GC"
    
    • ​说明​​:根据应用内存需求调整堆大小,G1 垃圾回收器适合低延迟场景。

2. ​​GC 日志监控​

  • ​开启 GC 日志​​:

    JAVA_OPTS="$JAVA_OPTS -Xloggc:/var/log/tomcat/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps"
    

三、数据库连接池优化(以 Druid 为例)

1. ​​连接池配置​

  • context.xml 配置​​:

    <Resource name="jdbc/mydb" 
              auth="Container"
              type="com.alibaba.druid.pool.DruidDataSource"
              maxActive="200"       # 最大活动连接数
              initialSize="10"      # 初始连接数
              minIdle="10"          # 最小空闲连接数
              maxWait="60000"       # 获取连接超时时间
              timeBetweenEvictionRunsMillis="60000"  # 检测空闲连接间隔
              validationQuery="SELECT 1" />
    
    • ​说明​​:避免连接泄漏,需在代码中显式关闭连接。

四、Redis 连接池优化

1. ​​Lettuce 连接池配置​

  • application.yml 配置​​:

    spring:
      redis:
        lettuce:
          pool:
            max-active: 100      # 最大连接数
            min-idle: 10         # 最小空闲连接数
            max-wait: 1000ms     # 获取连接超时时间
    
    • ​说明​​:结合 Redis 性能测试调整参数,避免连接数过高导致 Redis 响应变慢。

五、静态资源优化

1. ​​HTTP 缓存头配置​

  • web.xml 配置​​:

    <filter>
      <filter-name>ExpiresFilter</filter-name>
      <filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class>
      <init-param>
        <param-name>ExpiresByType image</param-name>
        <param-value>access plus 1 month</param-value>
      </init-param>
    </filter>
    
    • ​说明​​:对图片、CSS/JS 等静态资源设置长期缓存,减少重复请求。

六、安全与监控

1. ​​安全加固​

  • ​HTTPS 配置​​:

    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               keystoreFile="/path/to/keystore.jks"
               keystorePass="password" />
    
  • ​防恶意请求​​:

    <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168..+" />
    

2. ​​性能监控​

  • ​Spring Boot Actuator​​:

    management:
      endpoints:
        web:
          exposure:
            include: health,metrics,info
    
  • ​Prometheus + Grafana​​:集成监控指标,实时分析 CPU、内存、线程池状态。


七、代码级优化

1. ​​异步处理​

  • ​使用 @Async 注解​​:

    @Async
    public void processLargeData() {
      // 耗时操作异步执行
    }
    

2. ​​缓存策略​

  • ​本地缓存 + Redis 缓存​​:

    @Cacheable(value = "userCache", key = "#id")
    public User getUserById(Long id) {
      return userRepository.findById(id).orElse(null);
    }
    

八、部署注意事项

  1. ​JAR 包优化​​:

    • 使用 maven-shade-plugin 打包时排除冗余依赖。
  2. ​Tomcat 部署配置​​:

    • 禁用不必要的 Connector(如 AJP)。
  3. ​压力测试​​:

    • 使用 JMeter 或 Gatling 模拟高并发,验证优化效果。

总结

通过 ​​Tomcat 线程池调优​​、​​JVM 内存管理​​、​​数据库/Redis 连接池优化​​、​​静态资源缓存​​ 和 ​​代码级异步处理​​,可显著提升 Spring Boot 应用在 Tomcat 下的性能。建议结合监控工具持续观察系统瓶颈,动态调整参数。