Spring boot start with Undertow

作者: whthomas | 来源:发表于2016-11-10 17:55 被阅读8132次

    UndertowJboss开发的一款基于XNIO的高性能 Web 服务器,并且兼容servlet3.1,在spring boot中很容易利用starter来替换掉tomcat作为服务容器。

    pom.xml中的dependencies修改如下:

    <dependencies>
        <!--Spring boot starter-->
        <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>
        <!--/Spring boot starter-->
    </dependencies>
    

    HTTP2作为新的HTTP标准,目前在Undertow上已经可以被很好地支持了,而在代码中只需要配置下,就可以启用HTTP2作为web的协议:

    // 在@Configuration的类中添加@bean
    @Bean
    UndertowEmbeddedServletContainerFactory embeddedServletContainerFactory() {
        
        UndertowEmbeddedServletContainerFactory factory = new UndertowEmbeddedServletContainerFactory();
        
        // 这里也可以做其他配置
        factory.addBuilderCustomizers(builder -> builder.setServerOption(UndertowOptions.ENABLE_HTTP2, true));
        
        return factory;
    }
    

    与tomcat的配置不同,在application.properties中的配置:

    # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
    server.undertow.io-threads=4
    # 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
    server.undertow.worker-threads=20
    # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
    # 每块buffer的空间大小,越小的空间被利用越充分
    server.undertow.buffer-size=1024
    # 每个区分配的buffer数量 , 所以pool的大小是buffer-size * buffers-per-region
    server.undertow.buffers-per-region=1024
    # 是否分配的直接内存
    server.undertow.direct-buffers=true
    

    利用wrk在相同环境下,对tomcatundertow做了一下压力测试。发现undertow对资源的回收和利用要比tomcat好很多。

    undertow的测试结果:

    ➜  ~ wrk -t 10 -c 10 -d 5s http://127.0.0.1:6666/main/index
    Running 5s test @ http://127.0.0.1:6666/main/index
      10 threads and 10 connections
      Thread Stats   Avg      Stdev     Max   +/- Stdev
        Latency     4.23ms   15.43ms 232.58ms   94.60%
        Req/Sec     2.13k     1.05k    5.23k    66.33%
      105926 requests in 5.10s, 15.25MB read
    Requests/sec:  20767.35
    Transfer/sec:      2.99MB
    

    tomcat的测试结果:

    ➜  ~ wrk -t 10 -c 10 -d 5s http://127.0.0.1:6666/main/index
    Running 5s test @ http://127.0.0.1:6666/main/index
      10 threads and 10 connections
      Thread Stats   Avg      Stdev     Max   +/- Stdev
        Latency     8.46ms   21.95ms 199.08ms   90.31%
        Req/Sec     1.41k   676.65     2.87k    62.55%
      69594 requests in 5.02s, 10.23MB read
    Requests/sec:  13850.99
    Transfer/sec:      2.04MB
    

    利用jconsole看到的jvm上的资源的情况:

    tomcat的监控 undertow的监控

    相关文章

      网友评论

      本文标题:Spring boot start with Undertow

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