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.mzph.cn/news/672096.shtml

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

相关文章

openkylin(Debian系)安装nginx及安装前需要的准备

前言 现在很多linux系统都可以使用高级包管理工具安装软件了&#xff0c;但是在像是 openkylin这些新系统中&#xff0c;好多软件包虽然有&#xff0c;但是因为其依赖的包还没有做好&#xff0c;所 以安装会提示你一大堆依赖错误。所以还是要自己来编译安装咯。安装前准备&…

RCS系统之:机器人状态

在设计RCS系统平台时&#xff0c;机器人总共设计状态有&#xff1a; 离线模式&#xff1b; 如图&#xff0c;18号机器人呈灰黑色&#xff0c;表示机器人没有上电状态 工作模式&#xff1b; 如图&#xff0c;10号机器人成绿色&#xff0c;表示机器人处于工作模式&#xff0c;等…

如何区分Linux中标准分区与lvm分区

以下是标准分区 以下包含lvm分区

Android14音频进阶:MediaPlayerService如何启动AudioTrack 上篇(五十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

TOML格式配置的frp服务搭建

从frp v0.52.0 版本开始&#xff0c;frp 将TOML作为配置文件格式。INI 格式已被弃用&#xff0c;并将在未来的发布中移除。因此&#xff0c;frp v0.52.0 及更高版本的配置文件默认为TOML格式。 项目地址 GitHub&#xff1a;https://github.com/fatedier/frp/releases 服务端…

离线场景下任意文档的在线预览及原样格式翻译,不依赖其他厂商接口非侵入式一行js代码实现网站的翻译及国际化,可配置使用多种翻译语言

离线场景下任意文档的在线预览及原样格式翻译&#xff0c;不依赖其他厂商接口非侵入式一行js代码实现网站的翻译及国际化&#xff0c;可配置使用多种翻译语言。 要实现翻译需要解决以下3个主要问题&#xff1a; 1&#xff09;from&#xff1a;内容本身的语言类型是什么&#xf…

别人还在集五福,星河社区开发者已经奖品拿到手软了!

AI新年新玩法你是否曾为AI应用的神奇而惊叹&#xff1f;你是否想过用AI为你定制新年写真&#xff1f;无需编程&#xff01;&#xff01; 飞桨星河社区帮你实现&#xff0c;还可赢取新年礼包&#xff01; 先速来看看攻略吧&#xff01;页面底部见活动详情。 玩法1攻略&#xff…

什么是UI设计?

用户界面&#xff08;UI&#xff09;它是人与机器互动的载体&#xff0c;也是用户体验&#xff08;UX&#xff09;一个组成部分。用户界面由视觉设计 (即传达产品的外观和感觉) 和交互设计 (即元素的功能和逻辑组织) 两部分组成。用户界面设计的目标是创建一个用户界面&#xf…

9.0 Zookeeper 节点特性

本章节介绍一下 zookeeper 的节点特性和简单使用场景&#xff0c;正是由于这些节点特性的存在使 zookeeper 开发出不同的场景应用。 1、同一级节点 key 名称是唯一的 实例&#xff1a; $ ls / $ create /runoob 2 已存在 /runoob 节点&#xff0c;再次创建会提示已经存在。 …

MySQL:从基础到实践(简单操作实例)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 下载前言一、MySQL是什么&#xff1f;二、使用步骤1.引入库2.读入数据 提交事务查询数据获取查询结果总结 下载 点击下载提取码888999 前言 在现代信息技术的世界…

Java基于微信小程序的医院挂号系统

文章目录 1 简介2 技术栈3 系统目标3.2 系统功能需求分析3.2.1 功能需求分析 4 系统模块设计4.1 数据库模块设计 5 系统的实现5.1 微信小程序个人中心5.2 科**室内容查看的实现**5.3 预约挂号的实现5.4 后台管理界面实现5.5 医生预约管理5.6 医生信息管理 参考文献7 推荐阅读8 …

【Git教程】(一)基本概念 ——工作流、分布式版本控制、版本库 ~

Git教程 基本概念 1️⃣ 为什么要用 Git2️⃣ 为什么要用工作流3️⃣ 分布式版本控制4️⃣ 版本库5️⃣ 简单的分支创建与合并&#x1f33e; 总结 在本章中&#xff0c;将介绍一个分布式版本控制系统的设计思路&#xff0c;以及它与集中式版本控制系统的不同之处。除此之外&am…

区块链大解码:深入了解Web3的核心技术

随着技术的迅速发展&#xff0c;Web3正逐渐崭露头角&#xff0c;成为数字时代的引领者。其中&#xff0c;区块链技术作为Web3的核心&#xff0c;扮演着至关重要的角色。本文将深入解码区块链技术&#xff0c;探讨其在Web3时代的关键作用以及未来发展趋势。 1. 区块链基础原理 …

Windows 10 配置 FFmpeg 使用环境

Windows 10 配置 FFmpeg 使用环境 1.下载FFmpeg 的windows办2. 配置环境变量:3.查看是否配置正确 cmd 或者 PowerShell 执行以下命令 1.下载FFmpeg 的windows办 GitHub 地址 :https://github.com/BtbN/FFmpeg-Builds/releases 解压后得到如图: 2. 配置环境变量: 复制路径:…

java SpringBoot2.7整合Elasticsearch(ES)7 进行文档增删查改

首先 我们在 ES中加一个 books 索引 且带有IK分词器的索引 首先 pom.xml导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>applicatio…

基于A-Star搜索算法的迷宫小游戏的设计

这篇文章是作者人工智能导论课的大作业&#xff0c;发出来供大家学习参考&#xff08;有完整代码&#xff09;。想要论文WORD文件的可以在本文资源处下载&#xff08;可能还在审核&#xff09;。 摘要&#xff1a; 本文章聚焦于基于A-Star搜索算法的迷宫小游戏设计&#xff0c;…

AR特效自研AI算法技术解决方案

在当今这个高速发展的数字化时代&#xff0c;增强现实&#xff08;AR&#xff09;技术已经成为企业创新和市场竞争的重要手段。美摄科技凭借对AI技术的深厚积累&#xff0c;为企业提供了一套创新的AR特效自研AI算法技术解决方案&#xff0c;旨在满足企业在AR领域的多元化需求。…

选择大语言模型:2024 年开源 LLM 入门指南

作者&#xff1a;来自 Elastic Aditya Tripathi 如果说人工智能在 2023 年起飞&#xff0c;这绝对是轻描淡写的说法。数千种新的人工智能工具被推出&#xff0c;人工智能功能被添加到现有的应用程序中&#xff0c;好莱坞因对这项技术的担忧而戛然而止。 甚至还有一个人工智能工…

代码随想录 Leetcode46. 全排列

题目&#xff1a; 代码&#xff08;首刷自解 2024年2月6日&#xff09;&#xff1a; class Solution { private:vector<vector<int>> res;vector<int> path; public:void backtracking(vector<int>& nums, int depth, vector<bool>& us…

数据结构第十天(排序算法总结)

目录 前言 常数时间复杂度&#xff1a;O(1) 线性时间复杂度&#xff1a;O(n) 线性对数时间复杂度&#xff1a;O(n log n) 平方时间复杂度&#xff1a;O(n^2) 对数时间复杂度&#xff1a;O(log n) 前言 排序算法的学习可以告一段落了。但算法的学习永不停止。 今天&…