Undertow介绍
Undertow是一个用java编写的灵活、高性能的web服务器,提供基于NIO的阻塞和非阻塞API。
Undertow有一个基于组合的体系结构,允许您通过组合小型单用途处理程序来构建web服务器。为您提供了在完整的Java EE servlet 4.0容器或低级别非阻塞处理程序之间进行选择的灵活性。
Undertow被设计为完全可嵌入,具有易于使用的流畅构建器API。Undertow的生命周期完全由嵌入应用程序控制。
Undertow由JBoss赞助,是Wildfly应用服务器中的默认web服务器。
官方资源和相关网址
官方网站
Undertow Homepage
GitHub仓库
Undertow on GitHub
文档
Undertow Documentation
相关项目和集成
WildFly - 一个流行的Java应用服务器,内置了Undertow作为其Web服务器。
Spring Boot - 提供了对Undertow的支持,可以作为嵌入式服务器使用。
主要特点
模块化设计:Undertow的核心非常小,它通过组合不同的功能模块来构建完整的Web服务器。这种设计使得开发者可以根据需要选择和配置所需的功能。
高性能:Undertow使用非阻塞I/O和直接缓冲区,这使得它在处理大量并发请求时非常高效。它还支持HTTP/2,进一步提高了性能和效率。
灵活的部署:Undertow可以作为独立的Web服务器运行,也可以嵌入到Java应用程序中。它支持传统的WAR部署,也支持直接部署JAR文件。
全面的Servlet支持:Undertow完全兼容Servlet 3.1规范,支持异步Servlet、WebSocket和Servlet异步I/O。
易于配置:Undertow的配置可以通过编程方式进行,也可以通过XML或属性文件进行。这使得配置和管理变得简单直观。
使用场景
Undertow适用于需要高性能和灵活性的Web应用场景,特别是对于微服务架构和云原生应用。由于其轻量级和高性能的特点,Undertow常被用于构建高并发的Web服务和API。
为什么要选择Undertow?
HTTP/2支持
Undertow支持HTTP/2开箱即用,无需覆盖所需的引导类路径。
HTTP升级支持
支持HTTP升级,允许在HTTP端口上多路传输多个协议。
Web套接字支持
Undertow提供了对Web套接字的全面支持,包括JSR-356支持。
Servlet 4.0
Undertow提供了对Servlet 4.0的支持,包括对嵌入式Servlet的支持。也可以在同一部署中混合使用Servlet和本机流下非阻塞处理程序。
可嵌入的
Undertow可以嵌入到应用程序中,也可以只需几行代码即可独立运行。
灵活的
Undertow服务器是通过将处理程序链接在一起进行配置的。可以根据需要添加尽可能多或尽可能少的功能。
示例代码1
以下是一个简单的使用Undertow创建Web服务器的示例:
public class HelloWorldServer {public static void main(final String[] args) {Undertow server = Undertow.builder().addHttpListener(8080, "localhost").setHandler(new HttpHandler() {@Overridepublic void handleRequest(final HttpServerExchange exchange) throws Exception {exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");exchange.getResponseSender().send("Hello World");}}).build();server.start();}
}
代码来自:Undertow · JBoss Community
springboot 集成Undertow
在pom.xml
添加依赖
<dependencies><!-- 其他依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-undertow</artifactId></dependency>
</dependencies>
application.yml 示例
server:# HTTP端口,默认为8080port: 8080 undertow:# 缓冲区大小buffer-size: 1024# 是否使用直接缓冲区direct-buffers: true # I/O线程数io-threads: 4# 工作线程数worker-threads: 8accesslog:# 是否启用访问日志enabled: true# 访问日志目录dir: ./logs/access
控制器示例
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class DemoController {@GetMapping("/demo")public String demo() {return "Hello, Undertow!";}
}
访问http://localhost:8080/hello
时,应该会看到“Hello, Undertow!”的响应。