<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      SpringBoot集成Tomcat服務

      使用的成本越低,內部封裝越復雜;

      一、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();
              }
          }
      }
      

      五、參考源碼

      編程文檔:
      https://gitee.com/cicadasmile/butte-java-note
      
      應用倉庫:
      https://gitee.com/cicadasmile/butte-flyer-parent
      
      posted @ 2023-02-21 08:46  七號樓  閱讀(1789)  評論(1)    收藏  舉報
      主站蜘蛛池模板: 亚洲日本中文字幕乱码中文| 欧美国产日产一区二区| 中文字幕在线永久免费视频| 亚洲中文字幕精品久久| 国产日韩精品免费二三氏| 视频一区视频二区视频三区| 老司机精品成人无码av| 少妇人妻偷人精品系列| 国产成人高清亚洲一区91| 日本一码二码三码的区分| 又大又粗又硬又爽黄毛少妇| 国产成人一区二区不卡| 国产在线98福利播放视频| 国产午夜福利视频合集| 无码专区—va亚洲v天堂麻豆| 男女猛烈激情xx00免费视频| 一区二区三区黄色一级片| 国产麻豆精品av在线观看| 国产高清自产拍av在线| 色噜噜一区二区三区| 成人3D动漫一区二区三区| 亚洲男人的天堂av手机在线观看| 天天爽夜夜爱| 黑森林福利视频导航| 美女黄18以下禁止观看| 亚洲色欲在线播放一区| 偷拍精品一区二区三区| 日韩不卡手机视频在线观看| 亚洲乱码国产乱码精品精| 亚洲天码中文字幕第一页| 风韵丰满妇啪啪区老老熟女杏吧| 久久精品人妻无码一区二区三区| 色熟妇人妻久久中文字幕| 永久免费av无码网站直播| 色伦专区97中文字幕| 亚洲国产成人精品综合色| 日韩乱码人妻无码中文字幕| 亚洲中文字幕人妻系列| 国产精品综合色区在线观| 中文字幕人成无码免费视频| 日韩深夜免费在线观看|