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() {
@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 · 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端口,默认为8080
port: 8080
undertow:
# 缓冲区大小
buffer-size: 1024
# 是否使用直接缓冲区
direct-buffers: true
# I/O线程数
io-threads: 4
# 工作线程数
worker-threads: 8
accesslog:
# 是否启用访问日志
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!”的响应。