美文网首页
Spring Boot 嵌入式 Web 容器

Spring Boot 嵌入式 Web 容器

作者: 张毅SOHO | 来源:发表于2020-05-24 22:16 被阅读0次

    Spring Boot是一个简化的 Spring 开发框架。基于约定大于配置的原则,融合微服务架构的理念,简化独立的产品级应用开发过程,是 Java 微服务架构优选的技术支撑。

    使用 Spring Boot 开发 JavaEE 工程,可以集成嵌入式的 Web 容器(如:Tomcat、Jetty、Undertow 等)进行发布,不再依赖特定的 Web 服务器实现独立运行,非常适用于微服务应用的安装部署。

    独立的 Web 服务器部署程序,需要将程序放到指定的位置和修改服务器配置文件才能完成,且不同的 Web 容器配置方法大相径庭。而微服务架构的应用具有部署程序数量多、部署位置分布散的特征,因此部署难度非常大,运维成本非常高。

    嵌入式 Web 容器与微服务程序打包在一起部署,只负责单个微服务程序的发布工作,相互独立、互不干扰,因此每个微服务可以选用不同的 Web 容器(只要是 Spring Boot 支持的嵌入式 Web 容器),而 Spring Boot 基于约定大于配置的原则,使得各种 Web 容器的配置几乎相似,有效的降低部署成和管理成本。

    但是需要注意的是:由于嵌入式 Web 容器只负责打包程序本身的发布工作,不具备宏观管理特征(如:在一台服务器上,所有微服务程序使用的端口号、虚拟路径没有提供清单),盲目部署会产生网络资源冲突等问题。因此需要建立相应的管理制度和方案。

    本方案基于 Ecplise 、Maven、 Spring Boot 2.2.6 设计。


    基于Maven 配置 Spring Boot 嵌入式 Web 容器,主要包括三个步骤:
    第一步,设置 POM 文件声明 Spring Boot 和 Web 容器的引用。
    第二步,设置 Web 容器配置参数。
    第三步,编写 Web 容器配置程序。
    以上三个步骤中,只要完成第一步即可按照默认配置运行 Web 容器;第二步用于个性化配置(如:端口号、虚拟目录等),较为常用;第三步用于特殊的处理,特定场景中使用。

    1. Tomcat(Spring Boot 默认集成的标准 Web 容器)

    第一步,设置 POM 文件声明 Spring Boot 和 Web 容器的引用。

    Spring Boot 默认集成了 Tomcat,因此只要在 POM 文件中引用 Spring Boot 框架即可。

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
    

    启动程序时,Tomcat 会通过 8080 端口发布程序。

    第二步,设置 Web 容器配置参数。

    编写 Web 容器配置文件 "application.properties"。常用参数如下:

    # 监听端口号。默认为 8080。
    server.port=8081
    
    # 请求出错时跳转的位置。
    server.error.path=/error
    
    # session 失效时间。30m 表示 30 分钟,如果不写单位则默认单位是秒。(注意:由于 Tomcat 中配置 session 过期时间是以分钟为单位,如果我们这里设置是秒的话,那么会自动转换为一个不超过所配置秒数的最大分钟数。比如配置了 119 秒,那么实际 session 过期时间是 1 分钟)。
    server.servlet.session.timeout=30m
    
    # 虚拟目录(默认为 /)。如果配置了虚拟目录,那么在访问路径中要加上配置的路径。
    server.servlet.context-path=/webname
    
    # 请求编码。
    server.tomcat.uri-encoding=utf-8
    
    # 最大线程数。
    server.tomcat.max-threads=500
    
    # 运行日志和临时文件的目录。默认为系统临时目录。
    server.tomcat.basedir=/home/webname/tmp
    
    # -------------------- HTTPS --------------------
    # 开启单向认证(服务器认证)
    server.ssl.enabled = true
    server.ssl.protocol = TLS
    server.ssl.key-store=classpath:server.keystore
    server.ssl.key-store-type=JKS
    server.ssl.key-store-password=password
    server.ssl.key-alias=https_server
    
    # 开启双向认证(客户端与服务端互相校验)
    server.ssl.client-auth=need
    server.ssl.trust-store=classpath:ca.truststore
    server.ssl.trust-store-password=password
    server.ssl.trust-store-type=JKS
    server.ssl.trust-store-provider=SUN
    

    启动程序时,Tomcat 会通过配置参数发布程序。

    有关如何制作 SSL 证书,请阅读文章《RedHat/CentOS8【OpenSSL】制作自签名 CA 证书和 HTTPS 配置》,文章地址【https://www.jianshu.com/p/5b3dfe4bb12e】。

    第三步,编写 Web 容器配置程序。

    在项目中创建配置类文件(TomcatConfig.java):

    import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
    import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class TomcatConfig{
        @Bean
        public ServletWebServerFactory servletContainer() {
            TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
            return tomcat;
        }
    }
    

    2. Jetty(适合长连接场景)

    第一步,设置 POM 文件声明 Spring Boot 和 Web 容器的引用。

    在 POM 文件中引用 Spring Boot 框架,排除默认的 Tomcat ,并引用 Jetty。

    <dependencies>
        <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-jetty</artifactId>  
            </dependency> 
    </dependencies>
    

    启动程序时,Jetty 会通过 8080 端口发布程序。

    第二步,设置 Web 容器配置参数。

    编写 Web 容器配置文件 "application.properties"。常用参数如下:

    # 监听端口号。默认为 8080。
    server.port=8081
    
    # 请求出错时跳转的位置。
    server.error.path=/error
    
    # session 失效时间。30m 表示 30 分钟,如果不写单位则默认单位是秒。(注意:由于 Tomcat 中配置 session 过期时间是以分钟为单位,如果我们这里设置是秒的话,那么会自动转换为一个不超过所配置秒数的最大分钟数。比如配置了 119 秒,那么实际 session 过期时间是 1 分钟)。
    server.servlet.session.timeout=30m
    
    # 虚拟目录(默认为 /)。如果配置了虚拟目录,那么在访问路径中要加上配置的路径。
    server.servlet.context-path=/webname
    
    # acceptor 线程数,建议 1-2 个。
    server.jetty.acceptors=2 
    
    # selector 线程数,建议 2-4 个。
    server.jetty.selectors=4 
    
    # PUT 或 POST 最大字节数,0 表示不限制。
    server.jetty.max-http-post-size=0 
    
    # -------------------- HTTPS --------------------
    # 开启单向认证(服务器认证)
    server.ssl.enabled = true
    server.ssl.protocol = TLS
    server.ssl.key-store=classpath:server.keystore
    server.ssl.key-store-type=JKS
    server.ssl.key-store-password=password
    server.ssl.key-alias=https_server
    
    # 开启双向认证(客户端与服务端互相校验)
    server.ssl.client-auth=need
    server.ssl.trust-store=classpath:ca.truststore
    server.ssl.trust-store-password=password
    server.ssl.trust-store-type=JKS
    server.ssl.trust-store-provider=SUN
    

    启动程序时,Jetty 会通过配置参数发布程序。

    有关如何制作 SSL 证书,请阅读文章《RedHat/CentOS8【OpenSSL】制作自签名 CA 证书和 HTTPS 配置》,文章地址【https://www.jianshu.com/p/5b3dfe4bb12e】。

    第三步,编写 Web 容器配置程序。

    在项目中创建配置类文件(JettyConfig.java):

    import org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory;
    import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class JettyConfig {
        @Bean
        public ServletWebServerFactory servletContainer() {
            JettyServletWebServerFactory jetty = new JettyServletWebServerFactory();
            return jetty;
        }
    }
    

    3. Undertow(适合高并发场景)

    第一步,设置 POM 文件声明 Spring Boot 和 Web 容器的引用。

    在 POM 文件中引用 Spring Boot 框架,排除默认的 Tomcat ,并引用 Undertow。

    <dependencies>
        <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-undertow</artifactId>  
        </dependency> 
    </dependencies>
    

    启动程序时,Undertow 会通过 8080 端口发布程序。

    第二步,设置 Web 容器配置参数。

    编写 Web 容器配置文件 "application.properties"。常用参数如下:

    # 监听端口号。默认为 8080。
    server.port=8081
    
    # 请求出错时跳转的位置。
    server.error.path=/error
    
    # session 失效时间。30m 表示 30 分钟,如果不写单位则默认单位是秒。(注意:由于 Tomcat 中配置 session 过期时间是以分钟为单位,如果我们这里设置是秒的话,那么会自动转换为一个不超过所配置秒数的最大分钟数。比如配置了 119 秒,那么实际 session 过期时间是 1 分钟)。
    server.servlet.session.timeout=30m
    
    # 虚拟目录(默认为 /)。如果配置了虚拟目录,那么在访问路径中要加上配置的路径。
    server.servlet.context-path=/webname
    
    # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
    # 不要设置过大,如果过大,启动项目会报错:打开文件数过多
    server.undertow.io-threads=16
    
    # 阻塞任务线程池, 当执行类似servlet请求阻塞IO操作, undertow会从这个线程池中取得线程
    # 它的值设置取决于系统线程执行任务的阻塞系数,默认值是IO线程数*8
    server.undertow.worker-threads=256
    
    # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
    # 每块buffer的空间大小,越小的空间被利用越充分,不要设置太大,以免影响其他应用,合适即可
    server.undertow.buffer-size=1024
    
    # 每个区分配的buffer数量 , 所以pool的大小是buffer-size * buffers-per-region
    server.undertow.buffers-per-region=1024
    
    # 是否分配的直接内存(NIO直接分配的堆外内存)
    server.undertow.direct-buffers=true
    
    # -------------------- HTTPS --------------------
    # 开启单向认证(服务器认证)
    server.ssl.enabled = true
    server.ssl.protocol = TLS
    server.ssl.key-store=classpath:server.keystore
    server.ssl.key-store-type=JKS
    server.ssl.key-store-password=password
    server.ssl.key-alias=https_server
    
    # 开启双向认证(客户端与服务端互相校验)
    server.ssl.client-auth=need
    server.ssl.trust-store=classpath:ca.truststore
    server.ssl.trust-store-password=password
    server.ssl.trust-store-type=JKS
    server.ssl.trust-store-provider=SUN
    

    启动程序时,Undertow 会通过配置参数发布程序。

    有关如何制作 SSL 证书,请阅读文章《RedHat/CentOS8【OpenSSL】制作自签名 CA 证书和 HTTPS 配置》,文章地址【https://www.jianshu.com/p/5b3dfe4bb12e】。

    第三步,编写 Web 容器配置程序。

    在项目中创建配置类文件(UndertowConfig.java):

    import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
    import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class UndertowConfig {
        @Bean
        public ServletWebServerFactory servletContainer() {
            UndertowServletWebServerFactory undertow = new UndertowServletWebServerFactory();
            return undertow;
        }
    }
    

    相关文章

      网友评论

          本文标题:Spring Boot 嵌入式 Web 容器

          本文链接:https://www.haomeiwen.com/subject/fkwlahtx.html