您好,登錄后才能下訂單哦!
這篇“SpringBoot集成Tomcat服務架構怎么配置”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“SpringBoot集成Tomcat服務架構怎么配置”文章吧。
使用的成本越低,內部封裝越復雜
在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>
在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); } }
Server:代表整個Tomcat容器;
Service:服務器內部的中間組件,將一個或多個Connector綁定到一個Engine上;
Engine:表示特定服務的請求處理管道,接收Connector的請求并響應;
Host:網絡主機名稱;
Connector:連接器處理與客戶端的通信;
Context:代表一個Web應用程序的上下文;
參考Tomcat9.0版本的核心組件描述,對于框架有大致的了解后,再去分析集成原理,會更容易把握主線邏輯;
在配置文件中,對Tomcat做一些基礎性的設置,查看下面的配置類可以知道,這些屬性存在默認值;
server: port: 8082 # 端口號 tomcat: # Tomcat組件 uri-encoding: UTF-8 # URI編碼 max-threads: 100 # 最大工作線程 min-spare-threads: 10 # 最小工作線程
在服務配置中,提供多種服務器的適配,像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; } }
基于配置的屬性,定制化管理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); } }
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.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服務架構怎么配置”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。