版权声明: https://blog.csdn.net/weixin_38187317/article/details/81532560
说明
undertow,jetty和tomcat能够说是javaweb项目当下最火的三款服务器,tomcat是apache下的一款重量级的服务器,不用多说历史悠久,经得起实践的考验。然而:当下微服务兴起,spring boot ,spring cloud 愈来愈热的状况下,选择一款轻量级而性能优越的服务器是必要的选择。spring boot 完美集成了tomcat,jetty和undertow,本文将经过对jetty和undertow服务器的分析以及测试,来比较两款服务器的性能如何。java
值得一提的是jetty和undertow都是基于NIO实现的高并发轻量级的服务器,支持servlet3.1和websocket。因此,有必要先了解下什么是NIO。web
NIO(非阻塞式输入输出)spring
Channel
Selector
Buffer
Acceptor
Client和Server只向Buffer读写数据不关注数据的流向,数据经过Channel通道进行流转。而Selector是存在与服务端的,用于Channel的注册以此实现数据I/O操做。Acceptor负责接受因此的链接通道而且注册到Channel中。而整个过程客户端与服务端是非阻塞的也就是异步操做。apache
下面是压力测试对比图:tomcat
服务器 命中 成功率 吞吐量 平均耗时
Jetty 11488 100% 96.25 trans/sec 0.00sec
18393 100% 153.92 trans/sec 0.01sec
21484 99.99% 179.51 trans/sec 0.01sec
Undertow 11280 100% 94.02 trans/sec 0.00sec
19442 100% 163.35 trans/sec 0.01sec
23277 100% 195.54 tran/sec 0.01sec
Tomcat 10845 100% 90.95 trans/sec 0.02sec
21673 99.98% 181 trans/sec 0.01sec
25084 99.98% 209.10 trans/sec 0.01sec
从中能够看出在高负载下Undertow的吞吐量高于Jetty并且随着压力增大Jetty和Undertow成功率差距会拉大。而在负载不是太大状况下服务器处理能力差很少,jetty还略微高于Undertow。而tomcat的负载能力彷佛和Undertow很接近。服务器
对比三个服务器发如今Undertow在负载太重状况下比Jetty和Tocmat更加顽强,实践证实在负载继续加大状况下Undertow的成功率高于其它二者,可是在并发不是太大状况下三款服务器总体来看差异不大。websocket
快速开始
更新pom.xml文件:并发
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<!-- 下面的配置将使用undertow来作服务器而不是tomcat -->app
<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>
application.yml配置:异步
server: port: 8081 # 下面是配置undertow做为服务器的参数 undertow: # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个链接, 默认设置每一个CPU核心一个线程 io-threads: 4 # 阻塞任务线程池, 当执行相似servlet请求阻塞操做, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载 worker-threads: 20 # 如下的配置会影响buffer,这些buffer会用于服务器链接的IO操做,有点相似netty的池化内存管理 # 每块buffer的空间大小,越小的空间被利用越充分 buffer-size: 1024 # 是否分配的直接内存 direct-buffers: true配置比较简单,和tomcat使用基本同样,而后就能够快乐的使用undertow啦~