在Spring Boot使用Undertow服务的方法

 更新时间:2023年05月16日 09:49:19   作者:Hello.Reader  
Undertow是RedHAT红帽公司开源的产品,采用JAVA开发,是一款灵活,高性能的web服务器,提供了NIO的阻塞/非阻塞API,也是Wildfly的默认Web容器,这篇文章给大家介绍了在Spring Boot使用Undertow服务的方法,感兴趣的朋友跟随小编一起看看吧

在Spring Boot使用Undertow服务

1.undertow简介

Undertow是RedHAT红帽公司开源的产品,采用JAVA开发,是一款灵活,高性能的web服务器,提供了NIO的阻塞/非阻塞API,也是Wildfly的默认Web容器。在javaweb容器的世界里,Tomcat和jetty是大众熟知的,undertow目前逐步进入大众的视角,它是一款能和tomcat媲美的神器,在性能方面吊打tomcat。目前Undertow已经成为springboot 默认集成的三大容器之一。

2.undertow特点

undertow在高并发业务场景中,性能优于tomcat

高性能,在多款同类产品的压测对比中,高并发情况下表现出色。Servlet4.0支持,它提供了对Servlet4.0的支持。Web Socket完全支持,包含JSR-356,用以满足Web应用巨大数量的客户端。内嵌式,它不需要容器,只需要通过api即可快速搭建Web服务器。灵活性,交由链式Handler配置和处理请求,可以最小化按需加载模块,无须加载多余功能。轻量级,它是一个内嵌Web服务器,由两个核心jar包组成。 3.springboot集成的web服务器

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.4</version>
    </parent>
    <groupId>com.konne</groupId>
    <artifactId>push-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>push-demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <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>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-undertow</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

配置启动成功显示如下信息:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.7.4)

2022-12-13 09:41:21.625  INFO 2416 --- [           main] com.konne.pushdemo.PushDemoApplication   : Starting PushDemoApplication using Java 1.8.0_202 on 2F-KF03 with PID 2416 (D:\i-word\push-demo\target\classes started by Administrator in D:\i-word\push-demo)
2022-12-13 09:41:21.628  INFO 2416 --- [           main] com.konne.pushdemo.PushDemoApplication   : No active profile set, falling back to 1 default profile: "default"
2022-12-13 09:41:22.226  WARN 2416 --- [           main] io.undertow.websockets.jsr               : UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used
2022-12-13 09:41:22.241  INFO 2416 --- [           main] io.undertow.servlet                      : Initializing Spring embedded WebApplicationContext
2022-12-13 09:41:22.241  INFO 2416 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 578 ms
2022-12-13 09:41:22.482  INFO 2416 --- [           main] io.undertow                              : starting server: Undertow - 2.2.19.Final
2022-12-13 09:41:22.486  INFO 2416 --- [           main] org.xnio                                 : XNIO version 3.8.7.Final
2022-12-13 09:41:22.490  INFO 2416 --- [           main] org.xnio.nio                             : XNIO NIO Implementation Version 3.8.7.Final
2022-12-13 09:41:22.514  INFO 2416 --- [           main] org.jboss.threads                        : JBoss Threads version 3.1.0.Final
2022-12-13 09:41:22.544  INFO 2416 --- [           main] o.s.b.w.e.undertow.UndertowWebServer     : Undertow started on port(s) 8080 (http)
2022-12-13 09:41:22.552  INFO 2416 --- [           main] com.konne.pushdemo.PushDemoApplication   : Started PushDemoApplication in 1.217 seconds (JVM running for 1.807)

SpringBoot使用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的成功率高于其它两者,但是在并发不是太大情况下三款服务器整体来看差别不大。

从中可以看出在高负载下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啦~

到此这篇关于在Spring Boot使用Undertow服务的文章就介绍到这了,更多相关Spring Boot使用Undertow服务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现简单井字棋小游戏代码实例

    Java实现简单井字棋小游戏代码实例

    这篇文章主要介绍了Java实现简单井字棋小游戏代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • RocketMQ NameServer架构设计启动流程

    RocketMQ NameServer架构设计启动流程

    这篇文章主要为大家介绍了RocketMQ NameServer架构设计启动流程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Java主流压缩解压工具对比、用法与选取详解

    Java主流压缩解压工具对比、用法与选取详解

    开发过程中可能会用到压缩文件的需求,下面这篇文章主要给大家介绍了关于Java主流压缩解压工具对比、用法与选取的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • Java Apache Shiro安全框架快速开发详解流程

    Java Apache Shiro安全框架快速开发详解流程

    Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序
    2021-10-10
  • 如何获得spring上下文的方法总结

    如何获得spring上下文的方法总结

    这篇文章主要介绍了如何获得spring上下文的方法总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Java接口返回json如何忽略特定属性

    Java接口返回json如何忽略特定属性

    这篇文章主要介绍了Java接口返回json如何忽略特定属性,通过SimplePropertyPreFilter方式(Json返回),这种写法,接口返回类型就要求是Json字符串类型,本文通过场景实例代码相结合给大家介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • jvm oom排查记录剖析

    jvm oom排查记录剖析

    这篇文章主要为大家介绍了jvm oom排查记录剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • springboot使用alibaba的druid数据库连接池错误的问题及解决

    springboot使用alibaba的druid数据库连接池错误的问题及解决

    这篇文章主要介绍了springboot使用alibaba的druid数据库连接池错误的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Spring中Bean注入源码示例解析

    Spring中Bean注入源码示例解析

    这篇文章主要为大家介绍了Spring中Bean注入源码示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • 简单了解Java编程中线程的创建与守护线程

    简单了解Java编程中线程的创建与守护线程

    这篇文章主要介绍了Java编程中线程的创建与守护线程,是Java多线程并发编程的基础,需要的朋友可以参考下
    2015-11-11

最新评论