SpringBoot如何使用Undertow做服务器

 更新时间:2022年07月07日 11:04:02   作者:芸灵fly  
这篇文章主要介绍了SpringBoot如何使用Undertow做服务器,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

使用Undertow做服务器

说明

undertow,jetty和tomcat可以说是javaweb项目当下最火的三款服务器,tomcat是apache下的一款重量级的服务器,不用多说历史悠久,经得起实践的考验。

然而:当下微服务兴起,spring boot ,spring cloud 越来越热的情况下,选择一款轻量级而性能优越的服务器是必要的选择。

spring boot 完美集成了tomcat,jetty和undertow,本文将通过对jetty和undertow服务器的分析以及测试,来比较两款服务器的性能如何。

值得一提的是jetty和undertow都是基于NIO实现的高并发轻量级的服务器,支持servlet3.1和websocket。所以,有必要先了解下什么是NIO。

NIO(非阻塞式输入输出)

  • Channel
  • Selector
  • Buffer
  • Acceptor

Client和Server只向Buffer读写数据不关注数据的流向,数据通过Channel通道进行流转。而Selector是存在与服务端的,用于Channel的注册以此实现数据I/O操作。Acceptor负责接受所以的连接通道并且注册到Channel中。而整个过程客户端与服务端是非阻塞的也就是异步操作。

下面是压力测试对比:

服务器命中成功率吞吐量平均耗时
Jetty11488100%96.25 trans/sec0.00sec
18393100%153.92 trans/sec0.01sec
2148499.99%179.51 trans/sec0.01sec
Undertow11280100%94.02 trans/sec0.00sec
19442100%163.35 trans/sec0.01sec
23277100%195.54 tran/sec0.01sec
Tomcat10845100%90.95 trans/sec0.02sec
2167399.98%181 trans/sec0.01sec
2508499.98%209.10 trans/sec0.01sec

从中可以看出在高负载下Undertow的吞吐量高于Jetty而且随着压力增大Jetty和Undertow成功率差距会拉大。而在负载不是太大情况下服务器处理能力差不多,jetty还略微高于Undertow。而tomcat的负载能力似乎和Undertow很接近。

对比三个服务器发现在Undertow在负载过重情况下比Jetty和Tocmat更加顽强,实践证明在负载继续加大情况下Undertow的成功率高于其它两者,但是在并发不是太大情况下三款服务器整体来看差别不大。

快速开始

更新pom.xml文件:

        <!--<dependency>-->
            <!--<groupId>org.springframework.boot</groupId>-->
            <!--<artifactId>spring-boot-starter-web</artifactId>-->
        <!--</dependency>-->
 
        <!-- 下面的配置将使用undertow来做服务器而不是tomcat -->
        <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啦~

undertow警告Buffer pool was not set on WebSocketDeploymentInfo

看提示让你设置一下buffer pool,不然他就使用默认的

这个警告不影响使用,但是看着别扭,于是

根据官方文档,和源码,自定义配置

/**
 * 功能描述:
 *
 * @author liuchaoyong
 * @version 1.0
 * @date 2019-05-26 21:41
 */
@Component
public class CustomizationBean implements WebServerFactoryCustomizer<UndertowServletWebServerFactory> {
 
    @Override
    public void customize(UndertowServletWebServerFactory factory) {
        factory.addDeploymentInfoCustomizers(deploymentInfo -> {
            WebSocketDeploymentInfo webSocketDeploymentInfo = new WebSocketDeploymentInfo();
            webSocketDeploymentInfo.setBuffers(new DefaultByteBufferPool(false, 1024));
            deploymentInfo.addServletContextAttribute("io.undertow.websockets.jsr.WebSocketDeploymentInfo", webSocketDeploymentInfo);
        });
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • SpringBoot接入轻量级分布式日志框架(GrayLog)的操作方法

    SpringBoot接入轻量级分布式日志框架(GrayLog)的操作方法

    这篇文章主要介绍了SpringBoot接入轻量级分布式日志框架(GrayLog)的方法,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • 一篇文章带你了解Maven的继承和聚合

    一篇文章带你了解Maven的继承和聚合

    这篇文章主要为大家介绍了Maven的继承和聚合,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • Java实现前端jsencrypt.js加密后端解密的示例代码

    Java实现前端jsencrypt.js加密后端解密的示例代码

    这篇文章主要为大家详细介绍了如何利用jsencrypt.js实现前端加密,利用Java实现后端解密的功能,文中的示例代码讲解详细,需要的可以参考一下
    2022-09-09
  • java利用url实现网页内容的抓取

    java利用url实现网页内容的抓取

    本文主要介绍了java利用url实现网页内容抓取的示例。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • Dubbo扩展点SPI实践示例解析

    Dubbo扩展点SPI实践示例解析

    这篇文章主要为大家介绍了Dubbo扩展点SPI实践示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • Java swing实现的计算器功能完整实例

    Java swing实现的计算器功能完整实例

    这篇文章主要介绍了Java swing实现的计算器功能,结合完整实例形式分析了java基于swing组件实现计算器布局与运算功能的具体操作技巧,需要的朋友可以参考下
    2017-12-12
  • Java回调函数与观察者模式实例代码

    Java回调函数与观察者模式实例代码

    这篇文章主要介绍了Java回调函数与观察者模式实例代码,简单介绍了使用观察者模式的场景,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • Java 如何读取Excel格式xls、xlsx数据工具类

    Java 如何读取Excel格式xls、xlsx数据工具类

    这篇文章主要介绍了Java 如何读取Excel格式xls、xlsx数据工具类的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Mybatis实体类和表映射问题(推荐)

    Mybatis实体类和表映射问题(推荐)

    在项目开发中我们经常会遇到表中的字段名和表对应实体类的属性名称不一定都是完全相同的。下面小编给大家介绍下这种情况下如何解决字段名与实体类属性名不相同的冲突问题。下面小编给大家带来了Mybatis实体类和表映射的解决方法,小伙伴们一起学习吧
    2016-09-09
  • Java中的缓冲流详细解析

    Java中的缓冲流详细解析

    这篇文章主要介绍了Java中的缓冲流详细解析,缓冲流可以分为字节缓冲流,字符缓冲流,字节缓冲流可分为字节输⼊入缓冲流,字节输出缓冲流,字符缓冲流可以分为字符输入缓冲流,字符输出缓冲流,需要的朋友可以参考下
    2023-11-11

最新评论