SpringBoot集成Tomcat服务

[复制链接]
发表于 2023-2-21 09:18:12 | 显示全部楼层 |阅读模式
目录

使用的成本越低,内部封装越复杂;
一、Tomcat集成

1、依赖层级

在SpringBoot框架的web依赖包中,引入的是内嵌Tomcat组件,基于SpringBoot的版本,Tomcat集成的是9.0版本
  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-web</artifactId>
  4.     <version>2.2.5.RELEASE</version>
  5. </dependency>
  6. <dependency>
  7.   <groupId>org.springframework.boot</groupId>
  8.   <artifactId>spring-boot-starter-tomcat</artifactId>
  9.   <version>2.2.5.RELEASE</version>
  10.   <scope>compile</scope>
  11. </dependency>
  12. <dependency>
  13.   <groupId>org.apache.tomcat.embed</groupId>
  14.   <artifactId>tomcat-embed-core</artifactId>
  15.   <version>9.0.31</version>
  16.   <scope>compile</scope>
  17. </dependency>
复制代码
2、自动化配置

在SpringBoot框架的自动配置类中,Web项目中不显式更换其他服务依赖时,默认提供了对Tomcat服务的管理;
  1. @ConditionalOnWebApplication(type = Type.SERVLET)
  2. @EnableConfigurationProperties(ServerProperties.class)
  3. @Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
  4.                 ServletWebServerFactoryConfiguration.EmbeddedTomcat.class})
  5. public class ServletWebServerFactoryAutoConfiguration {
  6.         @Bean
  7.         @ConditionalOnClass(name = "org.apache.catalina.startup.Tomcat")
  8.         public TomcatServletWebServerFactoryCustomizer tomcatServletWebServerFactoryCustomizer(
  9.                         ServerProperties serverProperties) {
  10.                 return new TomcatServletWebServerFactoryCustomizer(serverProperties);
  11.         }
  12. }
复制代码
二、Tomcat架构


Server:代表整个Tomcat容器
Service服务器内部的中间组件,将一个或多个Connector绑定到一个Engine上;
Engine:表示特定服务的请求处理管道,接收Connector的请求并响应;
Host:网络主机名称;
Connector:连接器处理与客户端的通信;
Context:代表一个Web应用程序的上下文;
参考Tomcat9.0版本的核心组件描述,对于框架有大致的了解后,再去分析集成原理,会更容易把握主线逻辑;
三、Tomcat配置

1、基础配置

在配置文件中,对Tomcat做一些基础性的设置,查看下面的配置类可以知道,这些属性存在默认值;
  1. server:
  2.   port: 8082                # 端口号
  3.   tomcat:                   # Tomcat组件
  4.     uri-encoding: UTF-8     # URI编码
  5.     max-threads: 100        # 最大工作线程
  6.     min-spare-threads: 10   # 最小工作线程
复制代码
2、属性配置类

在服务配置中,提供多种服务器的适配,像Tomcat、Jetty、Netty、Undertow,从策略上看,配置分为公共属性以及各种服务器的适配属性;
更多配置信息,可以参考完整的源码和注释说明;
  1. @ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
  2. public class ServerProperties {
  3.     private Integer port;
  4.     public static class Tomcat {
  5.         private Charset uriEncoding = StandardCharsets.UTF_8;
  6.         private int maxThreads = 200;
  7.         private int minSpareThreads = 10;
  8.     }
  9. }
复制代码
3、配置加载分析



  • 基于配置的属性,定制化管理Tomcat服务的信息;
  1. public class TomcatWebServerFactoryCustomizer
  2.         implements WebServerFactoryCustomizer<ConfigurableTomcatWebServerFactory> {
  3.     @Override
  4.     public void customize(ConfigurableTomcatWebServerFactory factory) {
  5.         ServerProperties properties = this.serverProperties;
  6.         ServerProperties.Tomcat tomcatProperties = properties.getTomcat();
  7.         PropertyMapper propertyMapper = PropertyMapper.get();
  8.         customizeStaticResources(factory);
  9.     }
  10. }
复制代码

  • TomcatWeb服务工厂,这里在创建WebServer时,使用的是Tomcat,需要适当的了解一下Tomcat架构;
  1. public class TomcatServletWebServerFactory extends AbstractServletWebServerFactory
  2.         implements ConfigurableTomcatWebServerFactory, ResourceLoaderAware {
  3.     @Override
  4.     public WebServer getWebServer(ServletContextInitializer... initializers) {
  5.         Tomcat tomcat = new Tomcat();
  6.         Connector connector = new Connector(this.protocol);
  7.         connector.setThrowOnFailure(true);
  8.         tomcat.getService().addConnector(connector);
  9.         customizeConnector(connector);
  10.         tomcat.setConnector(connector);
  11.         tomcat.getHost().setAutoDeploy(false);
  12.         configureEngine(tomcat.getEngine());
  13.         prepareContext(tomcat.getHost(), initializers);
  14.         return getTomcatWebServer(tomcat);
  15.     }
  16. }
复制代码
四、周期管理方法

1、控制类



  • WebServer的简单接口,只声明端口获取,服务启动和停止相关方法;
  1. public interface WebServer {
  2.         // 获取监听的端口
  3.         int getPort();
  4.        
  5.         // 服务启动
  6.         void start() throws WebServerException;
  7.         // 服务停止
  8.         void stop() throws WebServerException;
  9. }
复制代码

  • SpringBoot中,Tomcat服务核心控制类,通过TomcatServletWebServerFactory工厂类创建,对Tomcat生命周期的管理提供了一层包装;
  1. public class TomcatWebServer implements WebServer {
  2.     private final Tomcat tomcat;
  3.     private final Map<Service, Connector[]> serviceConnectors = new HashMap<>();
  4. }
复制代码

  • Apache组件中,轻量级Tomcat启动器,提供了Tomcat基础配置,比如默认的Port和HostName,以及生命周期管理的方法,TomcatWebServer类中调用的就是该API中的具体方法;
  1. public class Tomcat {
  2.     protected Server server;
  3.     protected int port = 8080;
  4.     protected String hostname = "localhost";
  5.    
  6.     // 初始化服务
  7.     public void init() throws LifecycleException {
  8.         getServer();
  9.         server.init();
  10.     }
  11.    
  12.     // 启动服务
  13.     public void start() throws LifecycleException {
  14.         getServer();
  15.         server.start();
  16.     }
  17.     // 停止服务
  18.     public void stop() throws LifecycleException {
  19.         getServer();
  20.         server.stop();
  21.     }
  22. }
复制代码
2、核心方法

2.1 初始化,初始化时,调用Apache-Tomcat类中启动方法;
  1. public class TomcatWebServer implements WebServer {
  2.     /**
  3.      * 初始化方法
  4.      */
  5.     private void initialize() throws WebServerException {
  6.         // 控制台日志日志
  7.         logger.info("Tomcat initialized with port(s): " + getPortsDescription(false));
  8.         synchronized (this.monitor) {
  9.             // 调用Apache-Tomcat类中启动方法
  10.             this.tomcat.start();
  11.         }
  12.     }
  13. }
复制代码
2.2 启动,在初始化的方法中,调用的Tomcat启动方法,这里对状态进行校验并输出日志日志
  1. public class TomcatWebServer implements WebServer {
  2.     /**
  3.      * 启动方法
  4.      */
  5.     public void start() throws WebServerException {
  6.         synchronized (this.monitor) {
  7.             if (this.started) {
  8.                 return;
  9.             }
  10.             checkThatConnectorsHaveStarted();
  11.             // 启动状态的标识
  12.             this.started = true;
  13.             // 控制台日志日志
  14.             logger.info("Tomcat started on port(s): " + getPortsDescription(true) + " with context path '"
  15.                     + getContextPath() + "'");
  16.         }
  17.     }
  18. }
复制代码
2.3 停止,在组件生命周期的常规管理逻辑中,停止服务之后进行销毁动作的执行,其中自然涉及到多个状态标识的转换;
  1. public class TomcatWebServer implements WebServer {
  2.     /**
  3.      * 停止方法
  4.      */
  5.     public void stop() throws WebServerException {
  6.         synchronized (this.monitor) {
  7.             // 状态变化
  8.             boolean wasStarted = this.started;
  9.             this.started = false;
  10.             // Tomcat服务停止
  11.             stopTomcat();
  12.             this.tomcat.destroy();
  13.         }
  14.     }
  15. }
复制代码
五、参考源码
  1. 编程文档
  2. https://gitee.com/cicadasmile/butte-java-note
  3. 应用仓库:
  4. https://gitee.com/cicadasmile/butte-flyer-parent
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表