Undertow使用详解

在这里插入图片描述

简介

在这里插入图片描述

Undertow是一个开源的、灵活的、高性能的非阻塞性应用服务器,由JBoss提供。它可以用作嵌入式服务器,也可以用作大型项目的全功能应用服务器。Undertow的设计以提供最高的性能和最大的灵活性为主要目标,支持非阻塞性和阻塞性处理方式,可以处理十万级的并发连接。

Undertow的历史可以追溯到2013年,当时Red Hat发布了JBoss AS 7,这是一个基于Java 7的轻量级应用服务器。Undertow作为JBoss AS 7的默认Web服务器,提供了高效的非阻塞I/O和异步处理能力。

随着时间的推移,Undertow不断发展和完善。在WildFly 10中,Undertow被确立为默认的Web服务器,取代了之前的Jetty。Undertow继续成为WildFly和WildFly Swarm等项目的核心组件。

在2018年,Red Hat宣布将Undertow捐赠给Jakarta EE,作为默认的Web服务器和Servlet容器。这标志着Undertow在Java EE生态系统中得到了更广泛的认可和应用。

Undertow的历史与JBoss AS 7、WildFly和Jakarta EE等项目紧密相关,它的发展得到了开源社区和Red Hat等公司的支持。

Undertow的核心是一个非阻塞性的HTTP服务器,提供了HTTP/1.1、HTTP/2和SPDY支持。Undertow的特性包括:

  1. 轻量化和灵活:Undertow非常小,整个服务器的基本运行只需要不到4MB的Jar包。它可以作为独立的嵌入式服务器运行,也可以作为大型的集群应用服务器运行。
  2. 高性能:Undertow是一款高性能的服务器,能够处理大量的并发连接,而且处理效率非常高。
  3. 支持HTTP/2:Undertow支持HTTP/2协议,这使得它能够有效地利用网络资源,提高响应速度。
  4. 对Servlet 4.0的支持:Undertow提供了对Servlet 4.0的支持,可以无缝集成各种现代化的Web技术。
  5. 非阻塞性I/O:Undertow的非阻塞性I/O模型可以最大限度地减少线程的使用,提高系统的扩展性。

Undertow的常见使用场景包括:作为一种嵌入式的服务器,用于为独立的应用程序提供网络服务;作为一种传统的应用服务器,用于部署和运行各种Web应用。由于Undertow提供了高性能和高并发性,因此它非常适合于处理大量的用户请求。

在这里插入图片描述

在这里插入图片描述

Undertow使用场景

Undertow的使用场景包括但不限于以下几个方面:

  1. 嵌入式服务器:Undertow可以作为嵌入式服务器,用于为独立的应用程序提供网络服务。由于其轻量化和灵活性,它非常适合于微服务架构,可以用于构建小型的、独立的服务。
  2. 传统应用服务器:Undertow也可以作为一种传统的应用服务器,用于部署和运行各种Web应用。由于Undertow提供了高性能和高并发性,因此它非常适合于处理大量的用户请求。
  3. 支持WebSockets:Undertow提供了对Web Socket的全面支持,包括JSR-356支持,这使得它适合构建需要实时通信的Web应用。
  4. 非阻塞性处理:Undertow支持非阻塞性处理方式,可以最大限度地减少线程的使用,提高系统的扩展性,使其适合处理高并发的请求。
  5. 灵活的扩展性:Undertow的Servlet容器支持多种传输方式,如HTTP、HTTPS、AJP和JOSE,这使得它具有很高的可扩展性,可以轻松地与各种现代Web技术集成。

Undertow是一个强大且灵活的服务器,适用于各种规模的项目和应用。

在这里插入图片描述

Undertow优缺点

  • Undertow的优势包括:
  1. 高性能:Undertow采用了异步处理方式,可以更好地利用CPU资源,提高系统的吞吐量和响应速度。
  2. 轻量级:Undertow的代码量比Tomcat少很多,因此在运行时的内存占用也更小。
  3. 灵活的配置:Undertow提供了很多可配置项,可以根据具体需求进行灵活配置,而Tomcat则相对固定。
  4. 更好的异步支持:Undertow在异步处理方面更加强大,可以支持WebSocket、Servlet 3.1等技术。
  5. 更好的可扩展性:Undertow的架构更加灵活,可以方便地进行扩展和定制。
  • Undertow也有一些劣势:
  1. 社区规模:尽管Undertow在某些方面表现优秀,但与Tomcat相比,其社区规模较小,可能意味着在遇到问题时获取支持和解决方案的难度可能会更大。
  2. 成熟度:Undertow的历史相对较短,与Tomcat相比,其成熟度可能稍逊一筹。这可能会影响到在生产环境中部署和使用的稳定性。
  3. 依赖问题:Undertow的某些高级特性可能需要依赖较难获取或管理的第三方库,这可能会增加部署和管理的复杂性。
  4. 工具支持:与Tomcat相比,一些开发工具可能对Undertow的支持不够完善,这可能会影响到开发效率和问题调试。

选择是否使用Undertow需要根据具体的应用场景和需求来决定。在需要高性能、轻量级和灵活配置的场景下,Undertow可能是一个不错的选择。而在需要稳定性和成熟度的场景下,Tomcat可能更为合适。

在这里插入图片描述

Undertow与Tomcat的比较

Undertow和Tomcat都是常用的Java Web服务器,它们在性能和特性上有所差异。

Undertow的优势包括:

  1. 高性能和低资源消耗:Undertow基于NIO,设计目标是高性能和低资源消耗。它利用了NIO的非阻塞IO特性,可以更高效地处理并发请求。相比之下,Tomcat使用的BIO模型在高并发情况下可能导致资源耗尽。
  2. 支持HTTP/2协议:Undertow支持HTTP/2协议,这是一种新一代高效的HTTP协议,通过多路复用的方式在单个TCP连接上同时处理多个请求,减少了网络延迟,提升了性能。而Tomcat目前只支持HTTP/1.1协议。
  3. 灵活的配置和扩展性:Undertow具有更灵活的配置方式,可以方便地进行扩展和定制。它还支持嵌入式开发,可以直接嵌入到Java项目中使用。

Tomcat的优势包括:

  1. 成熟的生态系统和广泛的支持:Tomcat拥有成熟的生态系统,广泛用于企业级应用开发,得到了社区的广泛支持和文档丰富的资料。这使得Tomcat在处理复杂的企业级应用程序时更加可靠和稳定。
  2. 功能完备:Tomcat提供了丰富的功能,例如支持Servlet和Web Socket,还提供了更完善的社区支持、更高的稳定性和更成熟的生态系统等特点。

Undertow在轻量级、高性能方面具有优势,适用于对性能要求较高的应用场景。而Tomcat虽然在性能方面稍逊一筹,但其稳定性和功能完备性使其成为企业级应用的首选。

在这里插入图片描述

Undertow与Jetty的比较

Undertow和Jetty都是高性能的Java Web服务器,它们在功能和性能上有所差异。

Undertow的优势包括:

  1. 高性能:Undertow采用了异步处理方式,可以更好地利用CPU资源,提高系统的吞吐量和响应速度。
  2. 灵活的配置:Undertow提供了很多可配置项,可以根据具体需求进行灵活配置,而Jetty则相对固定。
  3. 更好的异步支持:Undertow在异步处理方面更加强大,可以支持WebSocket、Servlet 3.1等技术。
  4. 更好的可扩展性:Undertow的架构更加灵活,可以方便地进行扩展和定制。

Jetty的优势包括:

  1. 轻量级:Jetty的代码量比Undertow少很多,因此在运行时的内存占用也更小。
  2. 社区规模:Jetty的社区规模较大,这意味着在遇到问题时更容易获取支持和解决方案。
  3. 成熟度:Jetty的历史相对较长,这意味着其在稳定性方面可能更优秀。

Undertow在高性能、灵活配置和异步处理方面具有优势,而Jetty则在轻量级、社区规模和成熟度方面表现优秀。

在这里插入图片描述

Undertow与Netty的比较

Undertow和Netty都是基于Java开发的网络通信框架,它们在应用范围和协议支持方面存在一些差异。

在应用范围上,Undertow主要用于构建Web服务器和Web应用程序,例如作为WildFly的默认Web服务器。而Netty的应用范围更加广泛,它主要用于构建各种网络应用,包括服务器和客户端,例如用于处理金融交易、大数据计算、游戏等领域。

在协议支持方面,Undertow主要支持HTTP协议,用于处理Web请求和响应。而Netty支持多种协议,包括TCP、UDP、HTTP、WebSocket等,可以灵活地应用于不同的网络通信场景。

此外,Undertow采用异步处理方式,具有高性能和低资源消耗的特点,而Netty也支持异步操作,但更注重于对各种网络协议的全面支持和灵活配置。

Undertow主要用于构建Web服务器和Web应用程序,而Netty则广泛应用于各种网络应用领域,支持多种协议并具有灵活的配置。选择使用哪个框架取决于具体的应用需求和场景。

在这里插入图片描述

SpringBoot整合Undertow

在Spring Boot中整合Undertow,可以通过以下步骤实现:

  1. 添加依赖:在pom.xml文件中添加Spring Boot Starter Undertow的依赖。例如:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
  1. 配置Undertow:在application.properties或application.yml文件中配置Undertow的相关属性。例如:
server.port=8080
server.undertow.servlet-container.servlet-mapping=/myapp/*=/myapp/*

上述配置中,server.port指定了服务器的端口号,server.undertow.servlet-container.servlet-mapping用于配置Undertow的Servlet映射。

  1. 创建Spring Boot应用程序:按照正常的Spring Boot应用程序开发流程,创建控制器、实体类等。
  2. 启动应用程序:通过运行Spring Boot应用程序,启动Undertow服务器。

通过以上步骤,就可以在Spring Boot中整合Undertow,并使用它作为Web服务器。需要注意的是,Undertow与Tomcat在特性和配置上存在差异,因此在进行整合时需要参考相关文档和资源,以确保配置正确和应用程序正常运行。

在这里插入图片描述

Undertow常用配置参数

Undertow的常用配置参数包括:

  1. io-threads:指定用于处理I/O操作的线程数,默认为CPU核心数。增加线程数可以提高并发性能,但也会增加CPU负载。
  2. worker-threads:指定用于处理请求的工作线程数,默认为CPU核心数的两倍。增加线程数可以提高并发处理能力。
  3. buffer-size:指定输入输出缓冲区的大小,默认为8192字节。可以根据实际情况调整该值,以平衡内存消耗和性能。
  4. server.undertow.io-threads:设置IO线程数,主要执行非阻塞的任务,它们会负责多个连接,默认设置每个CPU核心一个线程。
  5. server.undertow.worker-threads:阻塞任务线程池,当执行类似servlet请求阻塞IO操作时,undertow会从这个线程池中取得线程。它的值设置取决于系统线程执行任务的阻塞系数,默认值是IO线程数*8。
  6. server.undertow.buffer-size:每块buffer的空间大小,越小的空间被利用越充分,不要设置太大,以免影响其他应用,合适即可。

这些参数可以通过在Spring Boot的配置文件中进行设置来调整Undertow的性能和行为。请注意,具体参数可能会根据Undertow的版本和配置有所不同。在调整这些参数时,建议仔细阅读相关文档并进行适当的测试,以确保最佳的性能和稳定性。

在这里插入图片描述

Undertow架构设计

Undertow的架构设计是组合式的,可以通过组合各种小型的目的单一的处理程序来构建Web服务器。这种设计使得Undertow非常灵活,可以选择完整的Java EE servlet 3.1容器或初级非阻塞程序处理。

Undertow的设计目标是完全可嵌入的,具有简单易用的编译接口。其生命周期完全由嵌入的应用程序控制。在Undertow中,没有任何容器的概念,应用程序是由多个处理程序组合而来的,通过嵌入的方式来管理所有这些处理程序的生命周期。

Undertow基于Java XNIO,这是一个对JDK NIO类的扩展,与netty的基本功能类似。但相较于后者,Undertow更像是扩展封装。Undertow的核心瓶子在1Mb以下,它在运行时也是轻量级的,具有一个简单的嵌入式服务器使用少于4Mb的堆空间。

Undertow支持对Web套接字的全面支持,包括JSR-356支持,也提供对Servlet 3.1的支持,包括对嵌入式servlet的支持。它还可以在同一部署中混合Servlet和本机Undertow非阻塞处理程序。

在这里插入图片描述

Java使用Undertow示例

以下是一个简单的Java使用Undertow的示例:

  1. 添加Undertow依赖

在项目的pom.xml文件中添加Undertow的依赖:

<dependency><groupId>io.undertow</groupId><artifactId>undertow-core</artifactId><version>2.0.15.Final</version>
</dependency>
  1. 创建Undertow服务器

创建一个Undertow服务器实例:

Undertow server = Undertow.builder().addHttpListener(8080, "localhost").setHandler(new HttpHandler() {@Overridepublic void handleRequest(HttpServerRequest request, HttpServerResponse response) throws Exception {response.setStatusCode(200);response.getOutputStream().write("Hello, Undertow!".getBytes());response.getOutputStream().flush();}}).build();

上述代码创建了一个监听8080端口的Undertow服务器,并设置了一个简单的请求处理程序,将响应码设置为200,并将响应内容为"Hello, Undertow!"。

  1. 启动Undertow服务器

启动Undertow服务器:

server.start();
  1. 停止Undertow服务器

当需要停止Undertow服务器时,可以调用stop()方法:

server.stop();

这就是一个简单的Java使用Undertow的示例,通过它你可以开始使用Undertow进行Web开发。请注意,这只是一个基本的示例,实际使用中可能需要根据具体需求进行更复杂的配置和开发。

在这里插入图片描述

Tomcat与Netty比较

OpenSergo使用详解

Kafka集群详解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/453158.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

08. 【Linux教程】CentOS 目录介绍

CentOS 目录介绍 前面小节介绍了如何安装并登录连接 CentOS 系统&#xff0c;本小节围绕 CentOS 系统的目录&#xff0c;介绍其各个目录的作用&#xff0c;方便读者以后在工作中很好地将项目和软件归类存储&#xff0c;熟悉 CentOS 系统各个目录的功能介绍&#xff0c;有助于加…

Centos 内存和硬盘占用情况以及top作用

目录 只查看内存使用情况&#xff1a; 内存使用排序取前5个&#xff1a; 硬盘占用情况 定位占用空间最大目录 top查看cpu及内存使用信息 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&…

【计算机网络】Socket的SO_TIMEOUT与连接超时时间

SO_TIMEOUT选项是Socket的一个选项&#xff0c;用于设置读取数据的超时时间。它指定了在读取数据时等待的最长时间&#xff0c;如果在指定的时间内没有数据可读取&#xff0c;将抛出SocketTimeoutException异常。 SO_TIMEOUT的设置 默认情况下&#xff0c;SO_TIMEOUT选项的值…

L1-016 查验身份证-java

输入样例1&#xff1a; 4 320124198808240056 12010X198901011234 110108196711301866 37070419881216001X输出样例1&#xff1a; 12010X198901011234 110108196711301866 37070419881216001X输入样例2&#xff1a; 2 320124198808240056 110108196711301862输出样例2&#…

项目02《游戏-06-开发》Unity3D

基于 项目02《游戏-05-开发》Unity3D &#xff0c; 接下来做 背包系统的 存储框架 &#xff0c; 首先了解静态数据 与 动态数据&#xff0c;静态代表不变的数据&#xff0c;比如下图武器Icon&#xff0c; 其中&#xff0c;武器的名称&#xff0c;描述&#xff…

7min到40s:SpringBoot 启动优化实践!

目录 背景 1 耗时问题排查 1.1 观察 SpringBoot 启动 run 方法 1.2 监控 Bean 注入耗时 2 优化方案 2.1 如何解决扫描路径过多&#xff1f; 2.2 如何解决 Bean 初始化高耗时&#xff1f; 3 新的问题 3.1 SpringBoot 自动化装配&#xff0c;让人防不胜防 3.2 使用 sta…

12. onnx转为rknn测试时有很多重叠框的修改(python)

我们下载rknn-toolkit2-master后并进行前面的处理后&#xff0c;进入到rknn-toolkit2-master\examples\onnx\yolov5文件夹&#xff0c;里面有个test.py文件&#xff0c;打开该文件&#xff0c;其代码如下&#xff1a; # -*- coding: utf-8 -*- # coding:utf-8import os import…

文心一言 VS 讯飞星火 VS chatgpt (194)-- 算法导论14.3 2题

二、用go语言&#xff0c;改写 INTERVAL-SEARCH 的代码&#xff0c;使得当所有区间都是开区间时&#xff0c;它也能正确地工作。 文心一言&#xff0c;代码正常运行&#xff1a; 在Go语言中&#xff0c;处理开区间&#xff08;open intervals&#xff09;时&#xff0c;我们需…

SSH免密切换服务器案例-ssh协议(公钥和私钥)

公钥和私钥理解 公钥提供加密&#xff0c;私钥解密&#xff0c;公钥可以共享&#xff0c;私钥不可以。举例公钥相当于锁头&#xff0c;可以给别人用&#xff0c;钥匙相当于私钥&#xff0c;只能开自己发出去的锁头&#xff0c;也就是私钥和公钥成对&#xff0c;私钥只能解密对…

使用 LoRA 在 vi​​ggo 数据集上微调 Microsoft phi-2 小语言模型

一、说明 Microsoft 的基于 Transformer 的小语言模型。它可以根据 MIT 许可在HuggingFace上使用。 它在 96 个 A100 GPU 上使用 1.4T 令牌进行了 14 天的训练。Phi-2 是一个 27 亿个参数的预训练 Transformer&#xff0c;不使用 RLHF 或指示微调。它进行下一个标记预测&#x…

网络安全产品之准入控制系统

文章目录 一、什么是准入控制系统二、准入控制系统的主要功能1. 接入设备的身份认证2. 接入设备的安全性检查 三、准入控制系统的工作原理四、准入控制系统的特点五、准入控制系统的部署方式1. 网关模式2. 控制旁路模式 六、准入控制系统的应用场景七、企业如何利用准入控制系统…

智慧港口:山海鲸可视化引领未来

随着疫情的结束&#xff0c;全球贸易迎来新的春天&#xff0c;港口作为物流枢纽的地位日益凸显。然而&#xff0c;传统港口的运营和管理方式已无法满足现代物流的需求。为了提高港口运营效率&#xff0c;降低成本&#xff0c;智慧港口的概念应运而生。作为山海鲸可视化的开发者…