Undertow服务器基础分析 - 概述

Undertow作为JBoss应用服务器内置的Web容器,旨在提供更高效、灵活的服务。相较于Tomcat,它满足了微服务架构的需求,并支持WebSocket协议及NIO技术。Undertow在性能测试中表现出色。

Undertow是JBoss开源组织旗下一款Web服务器的名称,随着Wildfly(原JBossAS)版本8,一并发布出来,是内置缺省的Web容器。我们知道JBoss应用服务器之前一直使用Tomcat作为Web容器,而Web容器可以说是应用服务器中最重要的模块之一,所以这个改变引起开发者的广泛关注。

为什么要重新设计一款新的Web服务器呢?官网FAQ给出一个说明:
“Before we created Undertow we needed multiple web server technologies to meet our needs. Undertow was designed to be flexible and efficient enough to meet every use case we had and every use case we could think of. Undertow is embeddable and easy to use, but is also well suited for application servers. It has great performance, but also rich enterprise Java capabilities. It has efficient non-blocking reactive APIs, but also more familiar traditional blocking APIs. It has new innovative APIs, but also standard APIs. It can run large dynamic applications, but is also lightweight enough to replace a native web server.”

归纳来说就是三点:
1. 更好的满足JBoss应用服务器的集成需要。Tomcat最初设计于10年前,体系结构没有办法进行灵活的修改。在和JBoss应用服务器集成时,需要写大量的组合代码使得Tomcat和JBossAS协同工作。
2. 嵌入式需求。不论是JBoss应用服务器本身,还是目前微服务(MicroService)的设计倾向,都希望能够web容器足够小而精悍,可以嵌入使用,而Tomcat很难满足这个需要。
3. 支持Websocket协议需求和NIO,异步化思路等的促进。异步通信框架在并发连接数,性能的优异表现促使开发人员想重新按照新的思路来设计一款Web服务器。

Undertow的主力开发人员是Stuart Douglas,也是JBossAS的核心开发者,另外David M. Lloyd(JBossAS架构师)和Jason Greene(JBossAS技术领导人)也参与了设计和开发。

在Undertow刚发布beta版时,参加了由Techempower设计的著名框架集合性能测试竞赛,在纯文本EC2服务上一举拿下第一,而且比第二名netty多出近一倍!(http://www.techempower.com/benchmarks/#section=data-r6&hw=ec2&test=plaintext)这个不俗的成绩让人侧目。最新的测试结果显示,undertow依然名列前茅。

新出炉的Web服务器能获得这么好的成绩,和它采用的异步事件机制的内核架构是分不开的。我们知道目前有一款明星Java项目Netty,在互联网应用中广泛采用,比如Finagle, Akka, Vertx, Dubbo等。Undertow同样使用了异步IO,但不是Netty,而是一款同样源自JBoss的项目XNIO。Netty和XNIO有渊源,Netty的设计师Trustin Lee和XNIO的设计师David M. Lloyd原来都是JBossRemoting的项目成员。

我们简单说一下JBossRemoting,这个IO框架一直是JBoss应用服务器自带的通信框架,从3.X版本到今天的Wildfly8,它是JBoss服务器外部通信的基础组件,包括EJB,早先的JBossMessaging等。今天它依然是同步通信框架的设计典范和良好实现。

NIO是从Java1.4引入的,带来了新的异步设计方式,到Java7引入NIO2。Netty针对早期NIO的一些不足和缺陷,进行了极大的改进,包括性能和易用性,从而一举被广大互联网公司青睐。而XNIO一直不温不火,只在JBoss内部使用,直到undertow出现才被更多人知道。

要熟悉undertow,必须得了解其强依赖的XNIO和背后的NIO思想。所以这个文章分为三个部分,除了这一篇概述之外,还有专门介绍XNIO的一篇,以及Undertow自身一篇内容。

 

 

 

Undertow 是一个轻量级、高性能的 Web 服务器Servlet 容器,其设计目标是作为嵌入式服务器使用,并支持现代 Web 技术,如 Servlet 3.1、JSP、WebSockets 等。其架构设计兼顾了性能与灵活性,适用于高并发、低延迟的场景。 ### 架构概述 Undertow 的核心架构由多个模块组成,主要包括: - **undertow-core**:提供基础的 HTTP 协议处理能力,包括请求解析、响应生成、HTTP/1.1 和 HTTP/2 支持等。 - **undertow-servlet**:实现完整的 Servlet 3.1 容器功能,支持部署标准的 WAR 文件和运行 Servlet、JSP 应用。 - **undertow-websockets-jsr**:提供对 WebSocket 协议的支持,符合 JSR-356 规范。 Undertow 的设计强调非阻塞 I/O 和灵活的请求处理机制,能够高效处理大量并发连接[^1]。 ### 工作原理 Undertow 的工作流程可以分为以下几个关键步骤: 1. **启动服务器**:通过 `Undertow.builder()` 构建服务器实例,绑定监听端口并设置请求处理器。 2. **接收请求**:服务器监听 HTTP 请求,使用非阻塞 I/O 模型处理连接和数据读取。 3. **请求处理**:通过 `HttpHandler` 接口定义请求处理逻辑,开发者可以自定义请求响应逻辑。 4. **发送响应**:处理完成后,服务器将响应数据通过 `HttpServerExchange` 发送回客户端。 以下是一个简单的内嵌 Web 服务器示例: ```java public class HelloWorldServer { public static void main(final String[] args) { Undertow server = Undertow.builder() .addHttpListener(8080, "localhost") .setHandler(new HttpHandler() { @Override public void handleRequest(final HttpServerExchange exchange) throws Exception { exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain"); exchange.getResponseSender().send("Hello World"); } }).build(); server.start(); } } ``` ### 内部机制 Undertow 的内部机制基于非阻塞 I/O 模型,使用 `XNIO` 作为底层网络库,提供高效的事件驱动 I/O 处理能力。其核心特性包括: - **非阻塞 I/O**:支持异步处理请求,减少线程阻塞,提高并发性能。 - **灵活的处理器链**:通过 `HttpHandler` 链式结构,开发者可以自定义请求处理流程。 - **HTTP/2 支持**:内置对 HTTP/2 协议的支持,提升现代 Web 应用的性能[^1]。 ### 性能与优化 在高负载场景下,Undertow 的吞吐量优于 Jetty,并且随着压力增大,其性能优势更加明显。Tomcat 的负载能力与 Undertow 相近,但在资源受限环境中,Undertow 更加轻量[^2]。 为了进一步优化 Undertow 的性能,可以通过以下方式: - **调整线程池**:合理配置线程池大小,避免资源争用。 - **启用 NIO 模式**:使用非阻塞 I/O 提高并发处理能力。 - **启用 HTTP/2**:利用 HTTP/2 的多路复用特性,减少连接延迟。 ### 总结 Undertow 是一个高性能、轻量级的 Web 服务器Servlet 容器,适用于需要嵌入式部署和高并发处理的场景。其基于非阻塞 I/O 的设计使其在高负载下表现出色,适合现代 Web 应用的需求。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值