当前位置: 首页 > news >正文

Undertow详解

udertow概述

udertow是RedHAT红帽公司开源的产品,采用Java开发,是一款灵活,高性能的web服务器,提供了NIO的阻塞/非阻塞API,也是Wildfly的默认Web容器。在javaweb容器的世界里,Tomcat和jetty是大众熟知的,undertow目前逐步进入大众的视角,它是一款能和tomcat媲美的神器,在性能方面吊打tomcat。目前Undertow已经成为springboot 默认集成的三大容器之一。
Undertow 是一个高性能的、轻量级的 Java Web 服务器和 Servlet 容器,由 JBoss 开发。它设计用于支持高并发的 Web 应用程序,并提供了灵活的架构来处理不同的负载和使用场景。Undertow 是 Apache Tomcat、JBoss EAP 和 WildFly 等项目的组件之一,也可以独立使用。设计用于处理高并发场景。它支持多种 I/O 模型,提供灵活的架构和模块化的扩展能力。无论是作为独立的 Web 服务器还是嵌入到 Java 应用程序中,Undertow 都能够提供高效、可扩展的解决方案来满足各种需求。

Undertow 的主要特点

高性能:
Undertow 旨在处理高负载的场景,支持异步和非阻塞 I/O 操作,能够处理大量并发请求而不会出现线程阻塞。
灵活的架构:
提供了多种工作模式,如传统的阻塞模式、非阻塞模式和异步模式,以满足不同应用的需求。
嵌入式和独立运行:
Undertow 可以作为独立的 Web 服务器运行,也可以作为嵌入式 Web 服务器嵌入到 Java 应用程序中。
支持 HTTP/1.x 和 HTTP/2:
提供对现代协议的支持,如 HTTP/2,以提高性能和效率。
支持 WebSocket:
允许建立持久连接,适用于需要实时通信的应用。
模块化和扩展性:
设计允许用户通过插件和模块来扩展其功能,支持自定义的处理器和过滤器。

Undertow 组件

Undertow 的架构包括以下主要组件:
Server:
Undertow 的核心组件,负责接受和管理客户端的 HTTP 请求。提供了多种服务器配置选项,包括绑定到不同端口、配置线程池等。
Handler:
处理请求的核心组件。Undertow 的请求处理模型是基于处理器链的,允许用户定义处理请求的步骤,如解析请求、应用过滤器、生成响应等。
Exchange:
HttpServerExchange 对象表示一个 HTTP 请求和响应的交换。它包含请求信息、响应信息以及用于读写数据的方法。
Servlet:
Undertow 支持 Servlet API,使得可以与现有的 Servlet 应用程序兼容。
Deployment:
负责部署 Web 应用程序的组件。管理应用的生命周期和资源。

Undertow 配置

  1. 独立服务器配置
    以下是一个简单的 Undertow 服务器配置示例:
import io.undertow.Undertow;
import io.undertow.util.Headers;public class UndertowServer {public static void main(String[] args) {Undertow server = Undertow.builder().addHttpListener(8080, "localhost").setHandler(exchange -> {String response = "Hello, World!";exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");exchange.getResponseSender().send(response);}).build();server.start();}
}

这个示例代码创建了一个简单的 Undertow 服务器,监听端口 8080,响应每个请求时发送 “Hello, World!”。
2. 嵌入式服务器配置
以下是如何将 Undertow 嵌入到 Java 应用程序中的示例:

import io.undertow.Undertow;
import io.undertow.servlet.Servlets;
import io.undertow.servlet.api.DeploymentInfo;
import io.undertow.servlet.api.DeploymentManager;
import io.undertow.servlet.api.ServletContainer;
import io.undertow.servlet.core.DeploymentManagerImpl;
import io.undertow.servlet.core.ServletContainerImpl;public class EmbeddedUndertowServer {public static void main(String[] args) throws Exception {ServletContainer container = new ServletContainerImpl();DeploymentInfo deploymentInfo = Servlets.deployment().setClassLoader(EmbeddedUndertowServer.class.getClassLoader()).setContextPath("/").setDeploymentName("myapp.war").addServlets(Servlets.servlet("HelloServlet", HelloServlet.class).addMapping("/"));DeploymentManager deploymentManager = container.getDeploymentManager(deploymentInfo);deploymentManager.deploy();Undertow server = Undertow.builder().addHttpListener(8080, "localhost").setHandler(deploymentManager.start()).build();server.start();}
}

在这个例子中,我们创建了一个嵌入式 Undertow 服务器,配置了一个简单的 Servlet,并将其部署到服务器中。

Undertow 的 I/O 模型

Undertow 支持多种 I/O 模型,以适应不同的负载和性能需求:
Blocking I/O:
默认模式,其中每个请求分配一个线程来处理。
Non-Blocking I/O:
使用非阻塞操作来提高性能,支持异步处理请求。
HTTP/2:
支持 HTTP/2 协议,允许多路复用、头部压缩等功能,进一步提高性能。
扩展性和模块化
Undertow 允许通过以下方式进行扩展:
自定义 Handler:
通过实现 HttpHandler 接口来创建自定义的请求处理逻辑。
自定义 Filter:
通过实现 HttpHandler 接口链式地添加自定义过滤器。
Servlet 支持:
通过 Servlet API 集成现有的 Servlet 应用程序。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Spring Boot:SpringBoot入门
  • DHCP与DNS的配置
  • 【屏显MCU】多媒体接口总结
  • LNMP动态网站环境部署
  • Javascript中canvas与svg详解
  • LLM评估 | 大模型评估方法调研--论文解读(持续更新ing!!!)
  • iexcel-excel 大文件读取和写入-04-order 指定列顺序
  • Spring源码学习笔记之@Async源码
  • 智能番茄成熟度评估:基于深度学习的自动检测系统
  • AI推理硬件成本分析:AMD Instinct MI300X与Nvidia GPU比较
  • 商品中心关于缓存热key的解决方案
  • web、http协议、apache服务、nginx服务
  • 汇舟问卷:轻松入门国外问卷调查工作室
  • springboot驾校管理系统-计算机毕业设计源码55471
  • 【Dash】Dash 应用的布局 app.layout
  • 2017前端实习生面试总结
  • CAP理论的例子讲解
  • Invalidate和postInvalidate的区别
  • JavaScript 基本功--面试宝典
  • Java知识点总结(JavaIO-打印流)
  • laravel 用artisan创建自己的模板
  • Linux各目录及每个目录的详细介绍
  • 每天10道Java面试题,跟我走,offer有!
  • 排序(1):冒泡排序
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 通过调用文摘列表API获取文摘
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • #1014 : Trie树
  • #pragma data_seg 共享数据区(转)
  • (02)Hive SQL编译成MapReduce任务的过程
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (二)Kafka离线安装 - Zookeeper下载及安装
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)ssm高校实验室 毕业设计 800008
  • (六)Hibernate的二级缓存
  • (转)大型网站的系统架构
  • (转载)虚函数剖析
  • .NET Framework .NET Core与 .NET 的区别
  • .NET 反射 Reflect
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .Net多线程Threading相关详解
  • .NET性能优化(文摘)
  • .Net中wcf服务生成及调用
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • .php文件都打不开,打不开php文件怎么办
  • .考试倒计时43天!来提分啦!
  • /3GB和/USERVA开关
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • [ C++ ] 类和对象( 下 )
  • [ 转载 ] SharePoint 资料
  • [100天算法】-目标和(day 79)
  • [Android Pro] AndroidX重构和映射