文章首发于个人网站 https://www.exception.site/springboot/spring-boot-undertow

本节中,您将学习如何在 Spring Boot 2.0 中配置 Undertow 容器。配置之前,您需要知道的是,Tomcat, Jetty, Undertow 作为三大主流 Servelt 容器,Undertow 的性能要优于前两者。

所以,我们推荐您使用 Undertow 容器。接下来,就我们看看如何在 Spring Boot 中快捷地集成 Undertow。

一、添加 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>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

二、启动项目

添加完上面的 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 !

三、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

四、Tomcat Vs Undertow 容器性能对比

在文章的开始,我们提到过 Undertow 的性能要优于 Tomcat, 但是口说无凭,需要拿出实际的证据,新建一个 Web 项目,通过 JDK 自带的工具对比一下各项指标情况:

先看看 Tomcat:

可以看到,Tomcat 大约使用了 110M 的堆内存以及大约 16 个线程数!

再来看看轻量级 Servlet 容器 Undertow 的指标:

Undertow 的内存使用情况大约为 90M, 线程数大约 13 个线程的样子。这还是在应用不复杂的情况下,大型应用出入会更大。

五、GitHub 源码

https://github.com/weiwosuoai/spring-boot-tutorial/tree/master/spring-boot-undertow

Spring Boot 2.0 教程 | 配置 Undertow 容器的更多相关文章

  1. Spring Boot 2.0 教程 - 配置详解

    Spring Boot 可以通过properties文件,YAML文件,环境变量和命令行参数进行配置.属性值可以通过,@Value注解,Environment或者ConfigurationProper ...

  2. Spring Boot 2.0 教程 | AOP 切面统一打印请求日志

    欢迎关注微信公众号: 小哈学Java 文章首发于个人网站 https://www.exception.site/springboot/spring-boot-aop-web-request 本节中,您 ...

  3. Spring Boot 2.0 的配置绑定类Bindable居然如此强大

    1. 前言 在开发Spring Boot应用时会用到根据条件来向Spring IoC容器注入Bean.比如配置文件存在了某个配置属性才注入Bean : 图中红色的部分是说,只有ali.pay.v1.a ...

  4. Spring Boot 2.0 教程 - 深入SpringAplication

    原文连接:https://www.codemore.top/cates/Backend/post/2018-05-20/spring-boot-SpringApplication 可以通过Spring ...

  5. Spring Boot 2.0 教程 | @ModelAttribute 注解

    欢迎关注微信公众号: 小哈学Java 文章首发于个人网站: https://www.exception.site/springboot/spring-boot-model-attribute Spri ...

  6. Spring Boot 2.0 教程 | 快速集成整合消息中间件 Kafka

    欢迎关注个人微信公众号: 小哈学Java, 每日推送 Java 领域干货文章,关注即免费无套路附送 100G 海量学习.面试资源哟!! 个人网站: https://www.exception.site ...

  7. Spring Boot 2.0 配置图文教程

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 本章内容 自定义属性快速入门 外化配置 自动配置 自定义创建 ...

  8. Spring Boot 2.0 的快速入门(图文教程)

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! Spring Boot 2.0 的快速入门(图文教程) 大家都 ...

  9. Spring Boot 2.0 图文教程 | 集成邮件发送功能

    文章首发自个人微信公众号: 小哈学Java 个人网站: https://www.exception.site/springboot/spring-boots-send-mail 大家好,后续会间断地奉 ...

随机推荐

  1. python第十六天

    一.包 1.什么是包? 一系列模块的集合 2.有什么用? 包通过文件夹来管理一系列功能相近的模块 3.包重点? 包中一定有一个专门用来管理包中所有模块的文件   __init__ 4.什么是包名? 包 ...

  2. 手机QQ公众号亿级消息实时群发架构

    编者按:高可用架构分享及传播在架构领域具有典型意义的文章,本文由孙子荀分享.转载请注明来自高可用架构公众号 ArchNotes.   孙子荀,2009 年在华为从事内核和分布式系统的开发工作:2011 ...

  3. PHP 关于判断输入日期是否合法

    合法要求 一年仅十二个月 4,6,9,11月仅30天,1,3,5,7,8,10,12月仅31天 闰年2月29天,否则28天 输入的变量年,月,日为数字 代码: <?php //PHP中判断输入的 ...

  4. CentOS7部分调优命令

    一般CentOS的磁盘空间占用最大的就是日志文件,日志文件主要保存在./log目录里,因此通过以下命令可以检查目录的大小. du -ah --max-depth=1 du命令的一些常用参数: -a或- ...

  5. Day3----《Pattern Recognition and Machine Learning》Christopher M. Bishop

    其实今天只花了一点点时间来学习这本书, 如果模型的参数过多,而训练数据又不足够多的话,就会出现overfitting. overfitting可以通过regularization来解决,贝叶斯方法也可 ...

  6. 【工作手札】Nginx接口代理可跨域

    接口代理nginx配置 location /api/ { proxy_set_header Host api.shenjian.io; proxy_set_header X-Forwarded-For ...

  7. 洛谷p3799:妖梦切木棒

    题意:任选四段木板拼正三角形 因为是正三角形 所以我们可以想到至少是两个相同的,剩下两个拼成最后一条边 我们只需要枚举边长即可 那么我们对每次读入的x,使他的cnt++ 考虑用一个二重循环 外层枚举边 ...

  8. 打包java程序生成exe

    打包java程序生成exe 目标 我们知道c++的控制台程序编译运行以后就会生成一个exe可执行文件,在电脑上可以直接双击运行,但是java是跨平台的语言,编译运行以后的字节码文件.class是和平台 ...

  9. tyflow雨滴在物体上滑落测试

    http://docs.tyflow.com/download/

  10. iptables安装

    1.安装iptable iptable-service #先检查是否安装了iptables service iptables status #安装iptables yum install -y ipt ...