Spring boot start with Undertow

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

pom.xml中的dependencies修改如下:


    
    
        org.springframework.boot
        spring-boot-starter-web
        
            
                org.springframework.boot
                spring-boot-starter-tomcat
            
        
    
    
        org.springframework.boot
        spring-boot-starter-undertow
    
    

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上的资源的情况:

Spring boot start with Undertow_第1张图片
tomcat的监控
Spring boot start with Undertow_第2张图片
undertow的监控

你可能感兴趣的:(Spring boot start with Undertow)