关于网站建设的建议报告,网站开发北京公司,合肥网站建设兼职,wordpress最好的编辑器下载文章目录一、Tomcat集成1、依赖层级2、自动化配置二、Tomcat架构三、Tomcat配置1、基础配置2、属性配置类3、配置加载分析四、周期管理方法1、控制类2、核心方法使用的成本越低#xff0c;内部封装越复杂#xff1b; 一、Tomcat集成
1、依赖层级
在SpringBoot框架的web依赖…
文章目录一、Tomcat集成1、依赖层级2、自动化配置二、Tomcat架构三、Tomcat配置1、基础配置2、属性配置类3、配置加载分析四、周期管理方法1、控制类2、核心方法使用的成本越低内部封装越复杂 一、Tomcat集成
1、依赖层级
在SpringBoot框架的web依赖包中引入的是内嵌Tomcat组件基于SpringBoot的版本Tomcat集成的是9.0版本
!-- 1、项目工程依赖 --
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactIdversion2.2.5.RELEASE/version
/dependency!-- 2、starter-web依赖 --
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-tomcat/artifactIdversion2.2.5.RELEASE/versionscopecompile/scope
/dependency!-- 3、starter-tomcat依赖 --
dependencygroupIdorg.apache.tomcat.embed/groupIdartifactIdtomcat-embed-core/artifactIdversion9.0.31/versionscopecompile/scope
/dependency2、自动化配置
在SpringBoot框架的自动配置类中Web项目中不显式更换其他服务依赖时默认提供了对Tomcat服务的管理
ConditionalOnWebApplication(type Type.SERVLET)
EnableConfigurationProperties(ServerProperties.class)
Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,ServletWebServerFactoryConfiguration.EmbeddedTomcat.class})
public class ServletWebServerFactoryAutoConfiguration {BeanConditionalOnClass(name org.apache.catalina.startup.Tomcat)public TomcatServletWebServerFactoryCustomizer tomcatServletWebServerFactoryCustomizer(ServerProperties serverProperties) {return new TomcatServletWebServerFactoryCustomizer(serverProperties);}
}二、Tomcat架构 Server代表整个Tomcat容器
Service服务器内部的中间组件将一个或多个Connector绑定到一个Engine上;
Engine表示特定服务的请求处理管道接收Connector的请求并响应
Host网络主机名称
Connector连接器处理与客户端的通信
Context代表一个Web应用程序的上下文
参考Tomcat9.0版本的核心组件描述对于框架有大致的了解后再去分析集成原理会更容易把握主线逻辑
三、Tomcat配置
1、基础配置
在配置文件中对Tomcat做一些基础性的设置查看下面的配置类可以知道这些属性存在默认值
server:port: 8082 # 端口号tomcat: # Tomcat组件uri-encoding: UTF-8 # URI编码max-threads: 100 # 最大工作线程min-spare-threads: 10 # 最小工作线程2、属性配置类
在服务配置中提供多种服务器的适配像Tomcat、Jetty、Netty、Undertow从策略上看配置分为公共属性以及各种服务器的适配属性
更多配置信息可以参考完整的源码和注释说明
ConfigurationProperties(prefix server, ignoreUnknownFields true)
public class ServerProperties {private Integer port;public static class Tomcat {private Charset uriEncoding StandardCharsets.UTF_8;private int maxThreads 200;private int minSpareThreads 10;}
}3、配置加载分析 基于配置的属性定制化管理Tomcat服务的信息
public class TomcatWebServerFactoryCustomizerimplements WebServerFactoryCustomizerConfigurableTomcatWebServerFactory {Overridepublic void customize(ConfigurableTomcatWebServerFactory factory) {ServerProperties properties this.serverProperties;ServerProperties.Tomcat tomcatProperties properties.getTomcat();PropertyMapper propertyMapper PropertyMapper.get();customizeStaticResources(factory);}
}TomcatWeb服务工厂这里在创建WebServer时使用的是Tomcat需要适当的了解一下Tomcat架构
public class TomcatServletWebServerFactory extends AbstractServletWebServerFactoryimplements ConfigurableTomcatWebServerFactory, ResourceLoaderAware {Overridepublic WebServer getWebServer(ServletContextInitializer... initializers) {Tomcat tomcat new Tomcat();Connector connector new Connector(this.protocol);connector.setThrowOnFailure(true);tomcat.getService().addConnector(connector);customizeConnector(connector);tomcat.setConnector(connector);tomcat.getHost().setAutoDeploy(false);configureEngine(tomcat.getEngine());prepareContext(tomcat.getHost(), initializers);return getTomcatWebServer(tomcat);}
}四、周期管理方法
1、控制类 WebServer的简单接口只声明端口获取服务启动和停止相关方法
public interface WebServer {// 获取监听的端口int getPort();// 服务启动void start() throws WebServerException;// 服务停止void stop() throws WebServerException;
}SpringBoot中Tomcat服务核心控制类通过TomcatServletWebServerFactory工厂类创建对Tomcat生命周期的管理提供了一层包装
public class TomcatWebServer implements WebServer {private final Tomcat tomcat;private final MapService, Connector[] serviceConnectors new HashMap();
}Apache组件中轻量级Tomcat启动器提供了Tomcat基础配置比如默认的Port和HostName以及生命周期管理的方法TomcatWebServer类中调用的就是该API中的具体方法
public class Tomcat {protected Server server;protected int port 8080;protected String hostname localhost;// 初始化服务public void init() throws LifecycleException {getServer();server.init();}// 启动服务public void start() throws LifecycleException {getServer();server.start();}// 停止服务public void stop() throws LifecycleException {getServer();server.stop();}
}2、核心方法
2.1 初始化初始化时调用Apache-Tomcat类中启动方法
public class TomcatWebServer implements WebServer {/*** 初始化方法*/private void initialize() throws WebServerException {// 控制台日志logger.info(Tomcat initialized with port(s): getPortsDescription(false));synchronized (this.monitor) {// 调用Apache-Tomcat类中启动方法this.tomcat.start();}}
}2.2 启动在初始化的方法中调用的Tomcat启动方法这里对状态进行校验并输出日志
public class TomcatWebServer implements WebServer {/*** 启动方法*/public void start() throws WebServerException {synchronized (this.monitor) {if (this.started) {return;}checkThatConnectorsHaveStarted();// 启动状态的标识this.started true;// 控制台日志logger.info(Tomcat started on port(s): getPortsDescription(true) with context path getContextPath() );}}
}2.3 停止在组件生命周期的常规管理逻辑中停止服务之后进行销毁动作的执行其中自然涉及到多个状态标识的转换
public class TomcatWebServer implements WebServer {/*** 停止方法*/public void stop() throws WebServerException {synchronized (this.monitor) {// 状态变化boolean wasStarted this.started;this.started false;// Tomcat服务停止stopTomcat();this.tomcat.destroy();}}
}ENDENDEND