Spring Boot内嵌容器支持Tomcat、Jetty、Undertow。为什么选择Undertow?

这里有一篇文章,时间 2017年1月26日发布的:

参考

Tomcat vs. Jetty vs. Undertow: Comparison of Spring Boot Embedded Servlet Containers

文章打开比较慢,大致是一下几点:

  • spring boot 项目建立
  • 如何修改 三种 内置的容器(默认是tomcat)
  • 对三种配置进行测试(测试工具jmeter):此处测试分为两种
    • 简单的String返回
    • 复杂的json结果返回
    • JVisualVM 查看请求过程中堆内存的变化。
  • 分析结果:undertow 以微弱的优势胜出 undertow > tomcat > jetty
  • 总结:例子并不能看出undertow 有很大的优势,但是可以看出的是,undertow 在适应新的趋势发展和尝试长连接(从响应头中可以看出)的使用。

回顾

SpringBoot 内置了三种servlet 容器供大家选择,默认的是tomcat,说明它还是大众最多的选择。另外,也可以看出另外两种也还是有自己独有的优势。

从另一方面来说,SpringBoot 提供的默认配置也不一定正确,对于版本的使用和兼容,不一定很全,还是需要根据压测之后才可以确定。

附 undertow 配置参考

# 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置为可用的CPU 核数
# 不要设置过大,如果过大,启动项目会报错:打开文件数过多
server.undertow.io-threads=16 # 阻塞任务线程池, 当执行类似servlet请求阻塞IO操作, undertow会从这个线程池中取得线程
# 它的值设置取决于系统线程执行任务的阻塞系数,默认值是IO线程数*8
server.undertow.worker-threads=256 # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理。默认为 JVM 可用的最大空间
# 每块buffer的空间大小,越小的空间被利用越充分,不要设置太大,以免影响其他应用,合适即可
server.undertow.buffer-size=1024 # 每个区分配的buffer数量 , 所以pool的大小是buffer-size * buffers-per-region
# 新版本已被废弃
server.undertow.buffers-per-region=1024 # 是否分配的直接内存(NIO直接分配的堆外内存)
server.undertow.direct-buffers=true

undertow 和 jetty 对比

引用ref:https://www.cnblogs.com/maybo/p/7784687.html

  • 都是基于NIO实现的高并发轻量级服务器。
  • 对于服务器端,我们关注的重点不是连接超时时间、socket超时时间以及任务执行超时时间的配置,而是线程池配置,包括工作线程和IO线程的分配。
  • Jetty 使用全局的线程配置,最小8,最大200.
  • Undertow 用于IO线程数同CPU 核数,工作线程数=IO*8
  • 在负载小的情况下,三款服务器都有很好的性能。
  • 在负载逐渐增大的时候,jetty 因为是全局的线程池配置,会出现阻塞情况。undertow 和 tomcat 表现良好。
  • tomcat 的IO线程不可通过SpringBoot 调整,而Undertow 可配置。

SpringBoot 内嵌容器的比较的更多相关文章

  1. spring-boot内嵌三大容器https设置

    spring-boot内嵌三大容器https设置 spring-boot默认的内嵌容器为tomcat,除了tomcat之前还可以设置jetty和undertow. 1.设置https spring-b ...

  2. SpringBoot项目启动不走内嵌容器

    一.问题 springboot项目java -jar启动不走内嵌容器,如下图,可以看到是直接走系统环境变量里配置的tomcat容器了 二.分析 我的pom.xml文件关键依赖: <depende ...

  3. Spring Boot项目的内嵌容器

    一.关于容器 刚才开始使用spring boot的开发者会有种很直观的感觉,servlet容器“不见了”.之前开发web项目,都是把程序写完后部署到servlet容器(比如Tomcat),但是使用sp ...

  4. 【Spring Boot】内嵌容器

    Spring Boot内嵌容器支持Tomcat.Jetty.Undertow. tomcat容器 spring boot 的web应用开发必须使用spring-boot-starter-web,其默认 ...

  5. 查看和指定SpringBoot内嵌Tomcat的版本

    查看当前使用的Tomcat版本号 Maven Repository中查看 比如我们需要查Spring Boot 2.1.4-RELEASE的内嵌Tomcat版本, 可以打开链接: https://mv ...

  6. SpringBoot内嵌Tomcat开启APR模式(运行环境为Centos7)

    网上查到的一些springboot内嵌的tomcat开启apr的文章,好像使用的springboot版本较老,在SpringBoot 2.0.4.RELEASE中已经行不通了.自己整理了一下,供参考. ...

  7. Spring Boot 内嵌容器 Tomcat / Undertow / Jetty 优雅停机实现

    Spring Boot 内嵌容器 Tomcat / Undertow / Jetty 优雅停机实现 Anoyi 精讲JAVA 精讲JAVA 微信号 toooooooozi 功能介绍 讲解java深层次 ...

  8. Spring Boot 容器选择 Undertow 而不是 Tomcat Spring Boot 内嵌容器Unde

    Spring Boot 内嵌容器Undertow参数设置 配置项: # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程 # 不要设置过大,如果过大,启动 ...

  9. spring-boot开发:使用内嵌容器进行快速开发及测试

    一.简述一下spring-boot微框架 1.spring-boot微框架是什么? 大家都知道,在使用spring框架进行应用开发时需要很多*.xml的初始化配置文件,而springBoot就是用来简 ...

随机推荐

  1. NameServer路由删除

    NameServer会每隔10s扫描brokerLiveTable状态表,如果BrokerLive的lastUpdateTimestamp的时间戳距当前时间超过120s,则认为Broker失效,移除改 ...

  2. mybatis-plus使用记录

    如何and和or: QuoteSalaryEnum salaryMax = QuoteSalaryEnum.of(memberObjectInfo.getQuoteSalaryMax()); Quot ...

  3. [BUGCASE]前端码案概述

    中医有医案之说,程序会出bug,因此想到将自己在项目中遇到的疑难bug记录下来的想法,出于以下目的: 沉淀经验 通过问题学习 训练解决问题的能力 训练文档写作能力 取名:码案(Bug Case). 医 ...

  4. 【知识点】C/C++编码规范

    为了提高我们写的代码的可读性,本文章说一下C/C++的编码规范. 一.源文件头部的注释 /******************************************************* ...

  5. 痞子衡嵌入式:深入i.MXRT1050系列ROM中串行NOR Flash启动初始化流程

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是深入i.MXRT1050系列ROM中串行NOR Flash启动初始化流程. 从外部串行NOR Flash启动问题是i.MXRT系列开发最 ...

  6. 使用matpoltlib读取csv显示图表范例

    import os import numpy as np import matplotlib.pyplot as plt root = os.getcwd() list_data = [os.path ...

  7. Codeforces Educational Round 94 (Rated for Div. 2)

    昨晚算是不幸中的万幸了 A题问的是给2n-1个01串,让你构造出来一个n串使得从1开始每个长度为n的串都至少存在有一个相似的地方 这道题我一开始没什么想法,但是手动观察发现每次可以留出来的空挡间隔为1 ...

  8. ❤空植发队 影评网站FilmReviewWeb-团队介绍

    空植发队 团队展示&选题 团队展示 团队信息 ​ 队名: 空植发队 ​ 队员: 罗泉水(队长)3118005101 麦狄龙 3118005103 马志鹏 3118005102 陈鸿畅 3118 ...

  9. bootstrap table 控制checkbox在某些状态不显示

    首先columns:[{field:'column',checkbox:true}];然后设置$("#tableName").bootstrapTable('hideColumn' ...

  10. AcWing 380. 舞动的夜晚

    大型补档计划 题目链接 这题是求必须边,而不是不可行边,因为不可行边 = 必须边 + 死掉了的边(貌似lyd第三版书上还是说的不可行边)先跑最大流. 在跑完以后的残余网络上,对于一条当前匹配的边 \( ...