在 Spring Boot 中通过 Profile 启用或禁用嵌入式 Tomcat

1、概览

默认情况下,Spring Boot 提供嵌入式 Tomcat 服务器,但在某些情况下,我们可能希望根据应用的需求来禁用/启用它。

对于不需要 Web 服务的 Spring Boot 应用,禁用 Tomcat 可以节省资源。

2、理解 Spring Boot 中的嵌入式 Tomcat

Spring Boot 在应用的可执行 JAR 文件中捆绑了嵌入式 Tomcat 服务器,从而简化了应用的部署。这种方法消除了安装和配置外部 Tomcat 实例的需要,使开发和部署更加高效。

Spring Boot 使用 Spring Boot Starter 来包含嵌入式 Tomcat 的必要依赖。默认情况下, spring-boot-starter-web Starter 会在 Tomcat 出现在 classpath 中时自动配置和初始化 Tomcat。

2.1、嵌入式 Tomcat 的优势

Spring Boot 的嵌入式 Tomcat 服务器具有多种优势:

  • 简化部署:无需安装外部 Tomcat 服务器。
  • 独立的应用:应用程序可打包为 JAR 文件,在任何地方运行。
  • 自动配置:Spring Boot 根据依赖自动配置 Tomcat。
  • 灵活:可轻松替换为 JettyUndertow 等其他嵌入式服务器。

2.2、为什么要禁用 Tomcat 服务器?

虽然嵌入式 Tomcat 很有用,但在某些情况下,禁用它对我们也有好处:

  • 非 Web 应用:不提供 HTTP 请求的 Web 程序,如 CLI 工具或批处理作业
  • 使用替代服务器的微服务:有些服务可能会使用专用网 Web 服务器,如 Nginx
  • 资源优化:禁用 Tomcat 可降低内存和 CPU 使用率

3、配置 Spring Boot Profile

Spring Boot 为我们提供了 spring.profiles.active 属性,用于定义特定环境的配置。我们可以创建不同的基于 profile 的配置,以控制是否启用嵌入式 Tomcat 服务器。

我们通常会针对不同的环境创建单独的配置文件,例如

  • application-dev.properties (用于启用 Tomcat 进行开发)
  • application-batch.properties (用于不使用 Tomcat 的批处理应用)

4、通过配置禁用嵌入式 Tomcat

Spring Boot 根据 spring.main.web-application-type 属性决定是否启用嵌入式 Web 服务器。我们可以将其设置为 NONE 来禁用嵌入式 Tomcat。

修改 application-batch.properties 文件:

spring.main.web-application-type=NONE

激活此配置后,Spring Boot 将不会启动 Tomcat,而是将应用视为非 Web 服务。

或者,也可以使用 YAML 配置此设置:

spring:
  main:
    web-application-type: NONE

5、不同 Profile 的配置示例

定义两个 profile:

  • Development Profile(dev) - 启用 Tomcat(默认设置)。
  • Batch Profile(batch) - 禁用 Tomcat

要确保嵌入式 Tomcat 服务器正常启动,在 application-dev.properties 文件中设置如下属性:

spring.main.web-application-type=SERVLET

要禁用嵌入式 Tomcat 服务器进行批处理,在 application-batch.properties 文件中设置如下属性:

spring.main.web-application-type=NONE

6、切换 Profile

定义多个 profile 配置后,就可以通过 application.properties 文件激活所需的配置文件:

spring.profiles.active=batch

或者,也可以将其作为命令行参数传递:

java -Dspring.profiles.active=batch -jar myapp.jar

这种灵活性使我们能够在开发、测试或生产部署过程中根据需要在 Web 应用和非 Web 应用之间进行切换。

7、总结

Spring Boot 允许使用 Profile 对嵌入式 Tomcat 服务器进行灵活配置。通过利用 spring.main.web-application-type,我们可以在非 Web 应用需要时禁用 Tomcat,从而优化资源使用和部署配置。使用基于 Profile 的设置可确保我们的应用无缝适应不同的环境。


Ref:https://www.baeldung.com/spring-boot-enable-disable-embedded-tomcat