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…

(完)

更多精彩文章,尽在「服务端思惟」微信公众号!

相关文章
相关标签/搜索