使用成本越低,内部封装越复杂;一、Tomcat集成1、依赖层在SpringBoot框架的web依赖包中,引入了内嵌的Tomcat组件。基于SpringBoot版本,Tomcat集成了9.0版本;org.springframework.bootspring-boot-starter-web2.2.5.RELEASEorg.springframework.bootspring-boot-starter-tomcat2.2.5.RELEASEcompileorg.apache.tomcat.embedtomcat-embed-core9.0.31compile2、自动配置在SpringBoot框架的自动配置类中,Webproject在没有显式替换其他服务依赖的情况下,默认提供Tomcat服务的管理;@ConditionalOnWebApplication(类型=Type.SERVLET)@EnableConfigurationProperties(ServerProperties.class)@Import({ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,ServletWebServerFactoryConfiguration.EmbeddedTomcat.class})publicclassServletWebServerFactoryAutoConfiguration{"OnClass"AutoConfiguration.cat(start"Tomap.org)publicTomcatServletWebServerFactoryWebcatoryCustomizertomcatServletWebServerFactoryCustomizer汤姆serverProperties){returnnewTomcatServletWebServerFactoryCustomizer(serverProperties);Engine:表示特定服务的请求处理管道,接收并响应Connector的请求;Host:网络主机名;Connector:Connector处理与客户端的通信;Context:表示上下文一个Web应用;参考Tomcat9.0的核心组件描述,对框架有一个大概的了解后,分析集成原理后更容易掌握主线逻辑;三、Tomcat配置1.基本配置在配置文件。对Tomcat做一些基本的设置,看下面的配置类就可以知道这些属性是有默认值的;server:port:8082#端口号tomcat:#Tomcat组件uri-encoding:UTF-8#URIencodingmax-threads:100#最大工作线程min-spare-threads:10#最小工作线程2.属性配置类在服务配置中为各种服务器提供适配,如Tomcat,Jetty、Netty、Undertow,从战略的角度,配置分为各种服务器的公共属性和适配属性;更多配置信息,可以参考完整的源码和注解;@ConfigurationProperties(prefix="server",ignoreUnknownFields=true)publicclassServerProperties{privateIntegerport;publicstaticclassTomcat{privateCharseturiEncoding=StandardCharsets.UTF_8;私有intmaxThreads=200;私人intminSpareThreads=10;Tomcat服务的信息;publicclassTomcatWebServerFactoryCustomizerimplementsWebServerFactoryCustomizer{@Overridepublicvoidcustomize(ConfigurableTomcatWebServerFactoryfactory){ServerPropertiesproperties=this.serverProperties;ServerProperties.TomcattomcatProperties=properties.getTomcat();PropertyMapper属性映射器=PropertyMapper.get();自定义静态资源(工厂);}}TomcatWeb服务工厂,这里创建WebServer时使用的是Tomcat,需要对Tomcat的架构有一定的了解;publicclassTomcatServletWebServerFactoryextendsAbstractServletWebServerFactoryimplementsConfigurableTomcatWebServerFactory,ResourceLoaderServerIngetAware{@OverrideServerInvertpublic...initializers){Tomcattomcat=newTomcat();}连接器connector=newConnector(this.protocol);connector.setThrowOnFailure(真);tomcat.getService().addConnector(连接器);自定义连接器(连接器);雄猫。设置连接器(连接器);tomcat.getHost().setAutoDeploy(false);配置引擎(tomcat.getEngine());prepareContext(tomcat.getHost(),初始值设定项);返回getTomcatWebServer(tomcat);}}四、循环管理方法1、控制类WebServer的简单接口,只声明了端口获取、服务启停相关方法;publicinterfaceWebServer{//获取监听端口intgetPort();//服务启动voidstart()t抛出WebServerException;//Servicestopvoidstop()throwsWebServerException;}在SpringBoot中,Tomcat服务的核心控制类由TomcatServletWebServerFactory工厂类创建,为Tomcat生命周期管理提供了一层封装;公共类TomcatWebServer实现WebServer{privatefinalTomcattomcat;privatefinalMapserviceConnectors=newHashMap<>();}Apache组件,轻量级Tomcat启动器,提供Tomcat基本配置,如默认的Port和HostName,以及生命周期的管理方式,具体方法在在TomcatWebServer类中调用API;公共类Tomcat{受保护的服务器服务器;受保护的int端口=8080;受保护的字符串主机名=“本地主机”;//初始化服务publicvoidinit()throwsLifecycleException{getServer();服务器.init();}//启动服务publicvoidstart()throwsLifecycleException{getServer();服务器.start();}//停止服务publicvoidstop()throwsLifecycleException{getServer();服务器.停止();}}2.核心方法2.1初始化,初始化时调用Apache-Tomcat类中的startup方法;公开课assTomcatWebServerimplementsWebServer{/***初始化方法*/privatevoidinitialize()throwsWebServerException{//控制台日志logger.info("Tomcatinitializedwithport(s):"+getPortsDescription(false));synchronized(this.monitor){//调用Apache-Tomcat类中的启动方法this.tomcat.start();}}}2.2启动,在初始化方法中,调用了Tomcat的启动方法,这里验证状态,输出日志;publicclassTomcatWebServerimplementsWebServer{/***启动方法*/publicvoidstart()throwsWebServerException{synchronized(this.monitor){if(this.started){return;}checkThatConnectorsHaveStarted();//启动状态IDthis.started=true;//consoleloglogger.info("Tomcatstartedonport(s):"+getPortsDescription(true)+"withcontextpath'"+getContextPath()+"'");}}}2.3停止,在组件中在生命周期的一般管理逻辑中,销毁动作的执行是在服务停止后进行的,这自然涉及到多个状态标识的变迁;publicclassTomcatWebServerimplementsWebServer{/***Stop方法*/publicvoidstop()throwsWebServerException{synchronized(this.monitor){//状态改变booleanwasStarted=this.started;this.started=false;//Tomcat服务停止stopTomcat();这个.tomcat.destroy();五、参考源码编程文档:https://gitee.com/cicadasmile/butte-java-note应用仓库:https://gitee.com/cicadasmile/butte-flyer-parent