一、tomcat集成使用的成本越低,内部封装越复杂
1、依赖层级在springboot框架的web依赖包中,引入的是内嵌tomcat组件,基于springboot的版本,tomcat集成的是9.0版本;
<!-- 1、项目工程依赖 --><dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> <version>2.2.5.release</version></dependency><!-- 2、starter-web依赖 --><dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-tomcat</artifactid> <version>2.2.5.release</version> <scope>compile</scope></dependency><!-- 3、starter-tomcat依赖 --><dependency> <groupid>org.apache.tomcat.embed</groupid> <artifactid>tomcat-embed-core</artifactid> <version>9.0.31</version> <scope>compile</scope></dependency>
2、自动化配置在springboot框架的自动配置类中,web项目中不显式更换其他服务依赖时,默认提供了对tomcat服务的管理;
@conditionalonwebapplication(type = type.servlet)@enableconfigurationproperties(serverproperties.class)@import({ servletwebserverfactoryautoconfiguration.beanpostprocessorsregistrar.class, servletwebserverfactoryconfiguration.embeddedtomcat.class})public class servletwebserverfactoryautoconfiguration { @bean @conditionalonclass(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 tomcatwebserverfactorycustomizer implements webserverfactorycustomizer<configurabletomcatwebserverfactory> { @override public 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 abstractservletwebserverfactory implements configurabletomcatwebserverfactory, resourceloaderaware { @override public 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 map<service, 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(); } }}
以上就是springboot集成tomcat服务架构怎么配置的详细内容。