Spring Boot 揭祕與實戰(五) 服務器篇 - 內嵌的服務器 Tomcat剖析 | 掘金技術徵文

Spring Boot 默認使用的是 Tomcat 做爲內嵌的服務器。因此,咱們搭建一個 Web 工程將會變得很是的簡單。javascript

內嵌的 Tomcat,一個Jar包運行

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>複製代碼

建立Java代碼git

@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!」。github

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

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>複製代碼

在添加了插件後,當運行 「mvn package」 進行打包時,會打包成一個能夠直接運行的 JAR 文件,使用 「java -jar」 命令就能夠直接運行。spring

經過 Spring Boot 內嵌的 Tomcat 服務器,咱們經過一個 jar 包就能夠運行一個 web 工程,這個也很符合微服務的場景,咱們在正式環境只要部署一個 jar 便可,固然,咱們還能夠把這個 jar 部署在 docker 容器中運行,是否是很是方便呢?docker

如何定製內嵌 Tomcat

設置內嵌Tomcat的端口

Spring Boot 內嵌的 Tomcat 服務器默認運行在 8080 端口。若是,咱們須要修改Tomcat的端口,咱們能夠在 src/main/resources/application.properties 中配置Tomcat信息。express

server.port=8089複製代碼

如今,你能夠從新運行上面的例子,看下是否是 Tomcat 的端口變成 8089 了。apache

設置內嵌Tomcat的最大線程數

咱們還能夠修改內嵌的 Tomcat 服務器的最大線程數。api

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>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

掘金技術徵文

掘金技術徵文活動連接:gold.xitu.io/post/58522d…

(完)

更多精彩文章,盡在「服務端思惟」微信公衆號!

相關文章
相關標籤/搜索