Java性能实战2

1.引言

在Java Web容器的世界里,Tomcat和Jetty是大名鼎鼎的,用的最多的开源Web服务器,也是大众熟知的。
今天,学习一款新的Web容器,它的性能比Tomcat还要高,这就是Undertow

NameServlet Version
Tomcat 9.04.0
Jetty 9.43.1
Undertow 2.04.0

2.Undertow的介绍

Undertow 是一个采用 Java 开发的灵活的高性能 Web 服务器,提供包括阻塞和基于 NIO 的非堵塞机制。Undertow 是红帽公司的开源产品,是 Wildfly 默认的 Web 服务器。

Undertow 提供一个基础的架构用来构建 Web 服务器,这是一个完全为嵌入式设计的项目,提供易用的构建器 API,完全兼容 Java EE Servlet 4 和低级非堵塞的处理器。

Undertow 设计为完全可嵌入的,并具有易于使用的流畅的 Builder API。 Undertow 的生命周期完全由嵌入应用程序控制。
在这里插入图片描述

Undertow的gitee地址:https://gitee.com/mirrors/undertow

3.怎么使用Undertow

我们一般结合SpringBoot项目一起使用
在Maven中Undertow的版本选择2.1
这个版本是支持Servlet 4.0,JDK8+的稳定版本

(1)首先创建一个简单的SpringBoot项目。然后在 Spring Boot 中快捷地集成 Undertow。

(2)添加 Maven 依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <!-- 移除掉默认支持的 Tomcat -->
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- 添加 Undertow 容器 -->
<dependency>
    <groupId>io.undertow</groupId>
    <artifactId>undertow-core</artifactId>
    <version>2.1.0.Final</version>
</dependency>

<dependency>
    <groupId>io.undertow</groupId>
    <artifactId>undertow-servlet</artifactId>
    <version>2.1.0.Final</version>
</dependency>

<dependency>
    <groupId>io.undertow</groupId>
    <artifactId>undertow-websockets-jsr</artifactId>
    <version>2.1.0.Final</version>
</dependency>
</dependency>

(3)启动项目
添加完上面的 maven 依赖后,Undertow 容器就已经集成完毕了,接下来,让我们启动项目,看看控制台输出:

Connected to the target VM, address: '127.0.0.1:50915', transport: 'socket'
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.2.RELEASE)
2019-02-22 20:29:28.876  INFO 21908 --- [           main] s.e.s.SpringBootUndertowApplication      : Starting SpringBootUndertowApplication on DESKTOP-RL6P6LA with PID 21908 (C:\dev\idea_workspace_personal\spring-boot-tutorial\spring-boot-undertow\target\classes started by allen in C:\dev\idea_workspace_personal\spring-boot-tutorial)
2019-02-22 20:29:28.885  INFO 21908 --- [           main] s.e.s.SpringBootUndertowApplication      : No active profile set, falling back to default profiles: default
2019-02-22 20:29:34.388  WARN 21908 --- [           main] io.undertow.websockets.jsr               : UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used
2019-02-22 20:29:34.478  INFO 21908 --- [           main] io.undertow.servlet                      : Initializing Spring embedded WebApplicationContext
2019-02-22 20:29:34.478  INFO 21908 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 5449 ms
2019-02-22 20:29:35.471  INFO 21908 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-02-22 20:29:36.423  INFO 21908 --- [           main] org.xnio                                 : XNIO version 3.3.8.Final
2019-02-22 20:29:36.447  INFO 21908 --- [           main] org.xnio.nio                             : XNIO NIO Implementation Version 3.3.8.Final
2019-02-22 20:29:36.614  INFO 21908 --- [           main] o.s.b.w.e.u.UndertowServletWebServer     : Undertow started on port(s) 8080 (http) with context path ''
2019-02-22 20:29:36.621  INFO 21908 --- [           main] s.e.s.SpringBootUndertowApplication      : Started SpringBootUndertowApplication in 8.912 seconds (JVM running for 10.232)
2019-02-22 20:29:48.534  INFO 21908 --- [  XNIO-1 task-1] io.undertow.servlet                      : Initializing Spring DispatcherServlet 'dispatcherServlet'
2019-02-22 20:29:48.534  INFO 21908 --- [  XNIO-1 task-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2019-02-22 20:29:48.547  INFO 21908 --- [  XNIO-1 task-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 12 ms

启动成功,当您看到 Undertow started on port(s) 8080 (http) with context path ‘’ 的行输出时,说明此时正在使用的是 Undertow 容器,而非 Tomcat !

(4)Undertow 相关配置
您可以针对 Undertow 容器做一些特定配置,如日志输出路径,设置工作者线程的个数等参数优化等,如下所示:

# 是否打开 undertow 日志,默认为 false
server.undertow.accesslog.enabled=false
# 设置访问日志所在目录
server.undertow.accesslog.dir=logs
# 指定工作者线程的 I/0 线程数,默认为 2 或者 CPU 的个数
server.undertow.io-threads=
# 指定工作者线程个数,默认为 I/O 线程个数的 8 倍
server.undertow.worker-threads=
# 设置 HTTP POST 内容的最大长度,默认不做限制
server.undertow.max-http-post-size=0

(5)Tomcat Vs Undertow 容器性能对比
在文章的开始,我们提到过 Undertow 的性能要优于 Tomcat, 但是口说无凭,需要拿出实际的证据,新建一个 Web 项目,通过 JDK 自带的工具对比一下各项指标情况:
先看看 Tomcat:
在这里插入图片描述
再来看看轻量级 Servlet 容器Jetty 的指标:
在这里插入图片描述
最后,再来看Undertow的性能
在这里插入图片描述
可以看到,Undertow的性能明显最好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值