文章目錄
Spring Boot 默認使用的是 Tomcat 作為內嵌的服務器。所以,我們搭建一個 Web 工程將會變得非常的簡單。
內嵌的 Tomcat,一個Jar包運行
還記得,《Spring Boot 揭秘與實戰(一) 快速上手》講到的例子么?我們來回顧下。
首先,修改 POM 文件,添加依賴。
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
創建Java代碼
- @RestController
- @EnableAutoConfiguration
- public class RestfulApiWebDemo {
- @RequestMapping("/")
- String home() {
- return "Hello World!";
- }
- public static void main(String[] args) throws Exception {
- SpringApplication.run(RestfulApiWebDemo.class, args);
- }
- }
直接運行 Java 類,或者可以通過 “mvn spring-boot:run” 在命令行啟動該應用。會啟動一個內嵌的 Tomcat 服務器運行在 8080 端口。訪問 “http://localhost:8080” 可以看到頁面上顯示“Hello World!”。
此外,在 POM 文件添加插件。
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </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信息。
- server.port=8089
現在,你可以重新運行上面的例子,看下是不是 Tomcat 的端口變成 8089 了。
設置內嵌Tomcat的最大線程數
我們還可以修改內嵌的 Tomcat 服務器的最大線程數。
- server.tomcat.max-threads=1000
設置內嵌Tomcat的編碼
在一些場景下,我們可能需要改動 Tomcat 的編碼,例如是 GBK 還是 UTF-8。
- server.tomcat.uri-encoding = UTF-8
官方提供的常用配置參數
除了上面講到的3個場景外,我們還可以自定義設置路徑地址、 SSL等參數。
這里列舉一些官方提供的常用配置參數,如果有特定需求,可以進行內嵌 Tomcat 的定制。
- server.tomcat.accesslog.enabled=false # Enable access log.
- server.tomcat.accesslog.pattern=common # Format pattern for access logs.
- server.tomcat.accesslog.prefix=access_log # Log file name prefix.
- server.tomcat.accesslog.rename-on-rotate=false # Defer inclusion of the date stamp in the file name until rotate time.
- server.tomcat.accesslog.suffix=.log # Log file name suffix.
- server.tomcat.background-processor-delay=30 # Delay in seconds between the invocation of backgroundProcess methods.
- server.tomcat.basedir= # Tomcat base directory. If not specified a temporary directory will be used.
- server.tomcat.internal-proxies=10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|\\
- 192\\.168\\.\\d{1,3}\\.\\d{1,3}|\\
- 169\\.254\\.\\d{1,3}\\.\\d{1,3}|\\
- 127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|\\
- 172\\.1[6-9]{1}\\.\\d{1,3}\\.\\d{1,3}|\\
- 172\\.2[0-9]{1}\\.\\d{1,3}\\.\\d{1,3}|\\
- 172\\.3[0-1]{1}\\.\\d{1,3}\\.\\d{1,3} # regular expression matching trusted IP addresses.
- server.tomcat.max-threads=0 # Maximum amount of worker threads.
- server.tomcat.min-spare-threads=0 # Minimum amount of worker threads.
- server.tomcat.port-header=X-Forwarded-Port # Name of the HTTP header used to override the original port value.
- server.tomcat.protocol-header= # Header that holds the incoming protocol, usually named "X-Forwarded-Proto".
- server.tomcat.protocol-header-https-value=https # Value of the protocol header that indicates that the incoming request uses SSL.
- server.tomcat.redirect-context-root= # Whether requests to the context root should be redirected by appending a / to the path.
- server.tomcat.remote-ip-header= # Name of the http header from which the remote ip is extracted. For instance `X-FORWARDED-FOR`
- server.tomcat.uri-encoding=UTF-8 # Character encoding to use to decode the URI.
War 包部署的使用細節
如果,我們還是希望通過 war 包的方式,部署到外部的 Tomcat 服務器上, Spring Boot 也是支持的,不過需要一些額外的配置。
首先,要將最終的打包形式改為 war 包,所以需要將 packaging 的值修改為 war。
- <packaging>war</packaging>
接着,對依賴進行適當的配置,值得注意的是,在這里需要移除對嵌入的 Tomcat 的依賴,這樣打出的 WAR 包中,在 lib 目錄下才不會包含 Tomcat 相關的JAR包。
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- <exclusions>
- <exclusion>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-tomcat</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-tomcat</artifactId>
- <scope>provided</scope>
- </dependency>
另外,為了保證編譯正確,還需要添加對 servlet-api 的依賴,因此添加如下的配置。
- <dependency>
- <groupId>org.apache.tomcat</groupId>
- <artifactId>tomcat-servlet-api</artifactId>
- <version>7.0.42</version>
- <scope>provided</scope>
- </dependency>
設置,打包后的項目訪問名稱,在<build>節點里添加<finalName>內容。
- <build>
- <finalName>springboot-web-demo</finalName>
- </bulid>
如果我們想要將在外部的 Tomcat 服務器部署的 WAR 包,就不能依賴於 RestfulApiWebDemo 的 main 函數,要以類似於 web.xml 文件配置的方式來啟動 Spring 應用上下文,此時我們需要聲明一個類,這個類的作用與在 web.xml 中配置負責初始化 Spring 應用上下文的監聽器作用類似,只不過在這里不需要編寫額外的 XML 文件了。
- public class ServletInitializer extends SpringBootServletInitializer {
- @Override
- protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
- return application.sources(RestfulApiWebDemo.class);
- }
- }
大功告成,此時,我們可以通過 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
(完)
