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 配置
- 独立服务器配置
以下是一个简单的 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 应用程序。