Spring Boot 揭秘與實戰(五) 服務器篇 - 內嵌的服務器 Tomcat剖析


文章目錄

  1. 1. 內嵌的 Tomcat,一個Jar包運行
  2. 2. 如何定制內嵌 Tomcat3. War 包部署的使用細節
    1. 2.1. 設置內嵌Tomcat的端口
    2. 2.2. 設置內嵌Tomcat的最大線程數
    3. 2.3. 設置內嵌Tomcat的編碼
    4. 2.4. 官方提供的常用配置參數
  3. 4. 總結
  4. 5. 源代碼

Spring Boot 默認使用的是 Tomcat 作為內嵌的服務器。所以,我們搭建一個 Web 工程將會變得非常的簡單。

內嵌的 Tomcat,一個Jar包運行

還記得,《Spring Boot 揭秘與實戰(一) 快速上手》講到的例子么?我們來回顧下。
首先,修改 POM 文件,添加依賴。

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>

創建Java代碼

  1. @RestController
  2. @EnableAutoConfiguration
  3. public class RestfulApiWebDemo {
  4. @RequestMapping("/")
  5. String home() {
  6. return "Hello World!";
  7. }
  8. public static void main(String[] args) throws Exception {
  9. SpringApplication.run(RestfulApiWebDemo.class, args);
  10. }
  11. }

直接運行 Java 類,或者可以通過 “mvn spring-boot:run” 在命令行啟動該應用。會啟動一個內嵌的 Tomcat 服務器運行在 8080 端口。訪問 “http://localhost:8080” 可以看到頁面上顯示“Hello World!”。

此外,在 POM 文件添加插件。

  1. <plugin>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-maven-plugin</artifactId>
  4. </plugin>

在添加了插件后,當運行 “mvn package” 進行打包時,會打包成一個可以直接運行的 JAR 文件,使用 “java -jar” 命令就可以直接運行。

通過 Spring Boot 內嵌的 Tomcat 服務器,我們通過一個 jar 包就可以運行一個 web 工程,這個也很符合微服務的場景,我們在正式環境只要部署一個 jar 即可,當然,我們還可以把這個 jar 部署在 docker 容器中運行,是不是非常方便呢?

如何定制內嵌 Tomcat

設置內嵌Tomcat的端口

Spring Boot 內嵌的 Tomcat 服務器默認運行在 8080 端口。如果,我們需要修改Tomcat的端口,我們可以在 src/main/resources/application.properties 中配置Tomcat信息。

  1. server.port=8089

現在,你可以重新運行上面的例子,看下是不是 Tomcat 的端口變成 8089 了。

設置內嵌Tomcat的最大線程數

我們還可以修改內嵌的 Tomcat 服務器的最大線程數。

  1. server.tomcat.max-threads=1000

設置內嵌Tomcat的編碼

在一些場景下,我們可能需要改動 Tomcat 的編碼,例如是 GBK 還是 UTF-8。

  1. server.tomcat.uri-encoding = UTF-8

官方提供的常用配置參數

除了上面講到的3個場景外,我們還可以自定義設置路徑地址、 SSL等參數。

這里列舉一些官方提供的常用配置參數,如果有特定需求,可以進行內嵌 Tomcat 的定制。

  1. server.tomcat.accesslog.enabled=false # Enable access log.
  2. server.tomcat.accesslog.pattern=common # Format pattern for access logs.
  3. server.tomcat.accesslog.prefix=access_log # Log file name prefix.
  4. server.tomcat.accesslog.rename-on-rotate=false # Defer inclusion of the date stamp in the file name until rotate time.
  5. server.tomcat.accesslog.suffix=.log # Log file name suffix.
  6. server.tomcat.background-processor-delay=30 # Delay in seconds between the invocation of backgroundProcess methods.
  7. server.tomcat.basedir= # Tomcat base directory. If not specified a temporary directory will be used.
  8. server.tomcat.internal-proxies=10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|\\
  9. 192\\.168\\.\\d{1,3}\\.\\d{1,3}|\\
  10. 169\\.254\\.\\d{1,3}\\.\\d{1,3}|\\
  11. 127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|\\
  12. 172\\.1[6-9]{1}\\.\\d{1,3}\\.\\d{1,3}|\\
  13. 172\\.2[0-9]{1}\\.\\d{1,3}\\.\\d{1,3}|\\
  14. 172\\.3[0-1]{1}\\.\\d{1,3}\\.\\d{1,3} # regular expression matching trusted IP addresses.
  15. server.tomcat.max-threads=0 # Maximum amount of worker threads.
  16. server.tomcat.min-spare-threads=0 # Minimum amount of worker threads.
  17. server.tomcat.port-header=X-Forwarded-Port # Name of the HTTP header used to override the original port value.
  18. server.tomcat.protocol-header= # Header that holds the incoming protocol, usually named "X-Forwarded-Proto".
  19. server.tomcat.protocol-header-https-value=https # Value of the protocol header that indicates that the incoming request uses SSL.
  20. server.tomcat.redirect-context-root= # Whether requests to the context root should be redirected by appending a / to the path.
  21. server.tomcat.remote-ip-header= # Name of the http header from which the remote ip is extracted. For instance `X-FORWARDED-FOR`
  22. server.tomcat.uri-encoding=UTF-8 # Character encoding to use to decode the URI.

War 包部署的使用細節

如果,我們還是希望通過 war 包的方式,部署到外部的 Tomcat 服務器上, Spring Boot 也是支持的,不過需要一些額外的配置。

首先,要將最終的打包形式改為 war 包,所以需要將 packaging 的值修改為 war。

  1. <packaging>war</packaging>

接着,對依賴進行適當的配置,值得注意的是,在這里需要移除對嵌入的 Tomcat 的依賴,這樣打出的 WAR 包中,在 lib 目錄下才不會包含 Tomcat 相關的JAR包。

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. <exclusions>
  5. <exclusion>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-tomcat</artifactId>
  8. </exclusion>
  9. </exclusions>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-tomcat</artifactId>
  14. <scope>provided</scope>
  15. </dependency>

另外,為了保證編譯正確,還需要添加對 servlet-api 的依賴,因此添加如下的配置。

  1. <dependency>
  2. <groupId>org.apache.tomcat</groupId>
  3. <artifactId>tomcat-servlet-api</artifactId>
  4. <version>7.0.42</version>
  5. <scope>provided</scope>
  6. </dependency>

設置,打包后的項目訪問名稱,在<build>節點里添加<finalName>內容。

  1. <build>
  2. <finalName>springboot-web-demo</finalName>
  3. </bulid>

如果我們想要將在外部的 Tomcat 服務器部署的 WAR 包,就不能依賴於 RestfulApiWebDemo 的 main 函數,要以類似於 web.xml 文件配置的方式來啟動 Spring 應用上下文,此時我們需要聲明一個類,這個類的作用與在 web.xml 中配置負責初始化 Spring 應用上下文的監聽器作用類似,只不過在這里不需要編寫額外的 XML 文件了。

  1. public class ServletInitializer extends SpringBootServletInitializer {
  2. @Override
  3. protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
  4. return application.sources(RestfulApiWebDemo.class);
  5. }
  6. }

大功告成,此時,我們可以通過 Maven 的 “mvn clean package” 打包出一個 war 包,並部署到外部的 Tomcat 服務器運行。訪問 “http://localhost:8080/springboot-web-demo/” 可以看到頁面上顯示“Hello World!”。

總結

Spring Boot 默認使用的是 Tomcat 作為內嵌的服務器。所以,我們搭建一個 Web 工程將會變得非常的簡單,只需要一個 jar 包即可運行。此外,我們還可以對內嵌的 Tomcat 進行一些定制,例如端口、最大線程數、編碼、 SSL 等。如果,我們還是希望通過 war 包的方式,部署到外部的 Tomcat 服務器上, Spring Boot 也是支持的,不過需要一些額外的配置,這個配置過程也只需要幾個簡單的步驟即可實現。

源代碼

相關示例完整代碼: springboot-action

(完)

 

微信公眾號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM