SpringBoot集成一款轻量级高并发服务器——Undertow

Undertow 是红帽公司开发的一款基于 NIO 的高性能 Web嵌入式服务器,它是一个轻量级web服务器,不像我们经常使用的tomcat,它由两个核心 Jar 包组成,加载一个 Web 应用可以小于 10MB 内存。它提供了对Servlet3.1 以及 Web Socket 的支持。

在开始集成之前我先把jetty、tomcat以及undertow的压力测试的数据放在下面,给大家一个直观的感受。

从中可以看出在高负载下Undertow的吞吐量高于Jetty而且随着压力增大Jetty和Undertow成功率差距会拉大。而在负载不是太大情况下服务器处理能力差不多,jetty还略微高于Undertow。而tomcat的负载能力似乎和Undertow很接近。

  对比三个服务器发现在Undertow在负载过重情况下比Jetty和Tocmat更加顽强,实践证明在负载继续加大情况下Undertow的成功率高于其它两者,但是在并发不是太大情况下三款服务器整体来看差别不大。

快速开始

说了这么多,到底怎么集成undertow?和tomcat一样,SpringBoot是天然集成undertow的,我们只需要把默认的tomcat排除掉,然后引入underundertow的依赖就可以了。

application.yml配置 :

与原来使用Tomcat时配置无太大差别 , 将tomcat字段改为undertow即可

# Undertow 日志存放目录 server.undertow.accesslog.dir= # 是否启动日志 server.undertow.accesslog.enabled=false # 日志格式 server.undertow.accesslog.pattern=common # 日志文件名前缀 server.undertow.accesslog.prefix=access_log # 日志文件名后缀 server.undertow.accesslog.suffix=log # HTTP POST请求最大的大小 server.undertow.max-http-post-size=0 # 设置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

综上,当我们系统负载比较高的时候我们可以考虑切换成undertow服务器,或者我们的微服务系统需要一个轻量级的容器的话我们也可以选择undertow。