前言
在Spring boot1.x/2.x中默认内置web应用服务器都是使用是tomcat,而tomcat应用在当今微服务以及分布式应用架构下满足不了性能设置会出现瓶颈即使做了自定义但是性能依旧不尽人意,因此我们需要进行改造。
替换内置web应用服务器
由于Spring boot1.x/2.x内置默认servlet容器为Tomcat,需要使用其他内置服务器(jetty、undertow)需要进行排除, 加入需要使用的内置servlet容器:
排除tomcat依赖
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-tomcat
加入undertow依赖
org.springframework.boot
spring-boot-starter-undertow
进行如上操作后基本让满足性能要求了
性能优化
参数设置
对于性能要求比较高的应用,可以对如下参数进行设置,在application.properties或者application.yml中进行修改设置
# 设置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服务器,利用它的XNIO流,我们可以在程序入口类进行如下设置:
[@Bean](https://my.oschina.net/bean)
public UndertowServletWebServerFactory servletContainer() {
UndertowServletWebServerFactory factory = new UndertowServletWebServerFactory();
//绑定双端口(这个配置是可选的)
factory.addBuilderCustomizers(builder -> builder.addHttpListener(8088, "localhost"));
//设置支持HTTP2.0协议
factory.addBuilderCustomizers(builder -> builder.setServerOption(UndertowOptions.ENABLE_HTTP2, true));
return factory;
}
关于undertow容器一些详细,请点击这里