SpringBoot集成一款轻量级高并发服务器——Undertow
- 服务器
- 2023-01-27
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。