简介
Undertow是一个开源的、灵活的、高性能的非阻塞性应用服务器,由JBoss提供。它可以用作嵌入式服务器,也可以用作大型项目的全功能应用服务器。Undertow的设计以提供最高的性能和最大的灵活性为主要目标,支持非阻塞性和阻塞性处理方式,可以处理十万级的并发连接。
Undertow的历史可以追溯到2013年,当时Red Hat发布了JBoss AS 7,这是一个基于Java 7的轻量级应用服务器。Undertow作为JBoss AS 7的默认Web服务器,提供了高效的非阻塞I/O和异步处理能力。
随着时间的推移,Undertow不断发展和完善。在WildFly 10中,Undertow被确立为默认的Web服务器,取代了之前的Jetty。Undertow继续成为WildFly和WildFly Swarm等项目的核心组件。
在2018年,Red Hat宣布将Undertow捐赠给Jakarta EE,作为默认的Web服务器和Servlet容器。这标志着Undertow在Java EE生态系统中得到了更广泛的认可和应用。
Undertow的历史与JBoss AS 7、WildFly和Jakarta EE等项目紧密相关,它的发展得到了开源社区和Red Hat等公司的支持。
Undertow的核心是一个非阻塞性的HTTP服务器,提供了HTTP/1.1、HTTP/2和SPDY支持。Undertow的特性包括:
- 轻量化和灵活:Undertow非常小,整个服务器的基本运行只需要不到4MB的Jar包。它可以作为独立的嵌入式服务器运行,也可以作为大型的集群应用服务器运行。
- 高性能:Undertow是一款高性能的服务器,能够处理大量的并发连接,而且处理效率非常高。
- 支持HTTP/2:Undertow支持HTTP/2协议,这使得它能够有效地利用网络资源,提高响应速度。
- 对Servlet 4.0的支持:Undertow提供了对Servlet 4.0的支持,可以无缝集成各种现代化的Web技术。
- 非阻塞性I/O:Undertow的非阻塞性I/O模型可以最大限度地减少线程的使用,提高系统的扩展性。
Undertow的常见使用场景包括:作为一种嵌入式的服务器,用于为独立的应用程序提供网络服务;作为一种传统的应用服务器,用于部署和运行各种Web应用。由于Undertow提供了高性能和高并发性,因此它非常适合于处理大量的用户请求。
Undertow使用场景
Undertow的使用场景包括但不限于以下几个方面:
- 嵌入式服务器:Undertow可以作为嵌入式服务器,用于为独立的应用程序提供网络服务。由于其轻量化和灵活性,它非常适合于微服务架构,可以用于构建小型的、独立的服务。
- 传统应用服务器:Undertow也可以作为一种传统的应用服务器,用于部署和运行各种Web应用。由于Undertow提供了高性能和高并发性,因此它非常适合于处理大量的用户请求。
- 支持WebSockets:Undertow提供了对Web Socket的全面支持,包括JSR-356支持,这使得它适合构建需要实时通信的Web应用。
- 非阻塞性处理:Undertow支持非阻塞性处理方式,可以最大限度地减少线程的使用,提高系统的扩展性,使其适合处理高并发的请求。
- 灵活的扩展性:Undertow的Servlet容器支持多种传输方式,如HTTP、HTTPS、AJP和JOSE,这使得它具有很高的可扩展性,可以轻松地与各种现代Web技术集成。
Undertow是一个强大且灵活的服务器,适用于各种规模的项目和应用。
Undertow优缺点
- Undertow的优势包括:
- 高性能:Undertow采用了异步处理方式,可以更好地利用CPU资源,提高系统的吞吐量和响应速度。
- 轻量级:Undertow的代码量比Tomcat少很多,因此在运行时的内存占用也更小。
- 灵活的配置:Undertow提供了很多可配置项,可以根据具体需求进行灵活配置,而Tomcat则相对固定。
- 更好的异步支持:Undertow在异步处理方面更加强大,可以支持WebSocket、Servlet 3.1等技术。
- 更好的可扩展性:Undertow的架构更加灵活,可以方便地进行扩展和定制。
- Undertow也有一些劣势:
- 社区规模:尽管Undertow在某些方面表现优秀,但与Tomcat相比,其社区规模较小,可能意味着在遇到问题时获取支持和解决方案的难度可能会更大。
- 成熟度:Undertow的历史相对较短,与Tomcat相比,其成熟度可能稍逊一筹。这可能会影响到在生产环境中部署和使用的稳定性。
- 依赖问题:Undertow的某些高级特性可能需要依赖较难获取或管理的第三方库,这可能会增加部署和管理的复杂性。
- 工具支持:与Tomcat相比,一些开发工具可能对Undertow的支持不够完善,这可能会影响到开发效率和问题调试。
选择是否使用Undertow需要根据具体的应用场景和需求来决定。在需要高性能、轻量级和灵活配置的场景下,Undertow可能是一个不错的选择。而在需要稳定性和成熟度的场景下,Tomcat可能更为合适。
Undertow与Tomcat的比较
Undertow和Tomcat都是常用的Java Web服务器,它们在性能和特性上有所差异。
Undertow的优势包括:
- 高性能和低资源消耗:Undertow基于NIO,设计目标是高性能和低资源消耗。它利用了NIO的非阻塞IO特性,可以更高效地处理并发请求。相比之下,Tomcat使用的BIO模型在高并发情况下可能导致资源耗尽。
- 支持HTTP/2协议:Undertow支持HTTP/2协议,这是一种新一代高效的HTTP协议,通过多路复用的方式在单个TCP连接上同时处理多个请求,减少了网络延迟,提升了性能。而Tomcat目前只支持HTTP/1.1协议。
- 灵活的配置和扩展性:Undertow具有更灵活的配置方式,可以方便地进行扩展和定制。它还支持嵌入式开发,可以直接嵌入到Java项目中使用。
Tomcat的优势包括:
- 成熟的生态系统和广泛的支持:Tomcat拥有成熟的生态系统,广泛用于企业级应用开发,得到了社区的广泛支持和文档丰富的资料。这使得Tomcat在处理复杂的企业级应用程序时更加可靠和稳定。
- 功能完备:Tomcat提供了丰富的功能,例如支持Servlet和Web Socket,还提供了更完善的社区支持、更高的稳定性和更成熟的生态系统等特点。
Undertow在轻量级、高性能方面具有优势,适用于对性能要求较高的应用场景。而Tomcat虽然在性能方面稍逊一筹,但其稳定性和功能完备性使其成为企业级应用的首选。
Undertow与Jetty的比较
Undertow和Jetty都是高性能的Java Web服务器,它们在功能和性能上有所差异。
Undertow的优势包括:
- 高性能:Undertow采用了异步处理方式,可以更好地利用CPU资源,提高系统的吞吐量和响应速度。
- 灵活的配置:Undertow提供了很多可配置项,可以根据具体需求进行灵活配置,而Jetty则相对固定。
- 更好的异步支持:Undertow在异步处理方面更加强大,可以支持WebSocket、Servlet 3.1等技术。
- 更好的可扩展性:Undertow的架构更加灵活,可以方便地进行扩展和定制。
Jetty的优势包括:
- 轻量级:Jetty的代码量比Undertow少很多,因此在运行时的内存占用也更小。
- 社区规模:Jetty的社区规模较大,这意味着在遇到问题时更容易获取支持和解决方案。
- 成熟度:Jetty的历史相对较长,这意味着其在稳定性方面可能更优秀。
Undertow在高性能、灵活配置和异步处理方面具有优势,而Jetty则在轻量级、社区规模和成熟度方面表现优秀。
Undertow与Netty的比较
Undertow和Netty都是基于Java开发的网络通信框架,它们在应用范围和协议支持方面存在一些差异。
在应用范围上,Undertow主要用于构建Web服务器和Web应用程序,例如作为WildFly的默认Web服务器。而Netty的应用范围更加广泛,它主要用于构建各种网络应用,包括服务器和客户端,例如用于处理金融交易、大数据计算、游戏等领域。
在协议支持方面,Undertow主要支持HTTP协议,用于处理Web请求和响应。而Netty支持多种协议,包括TCP、UDP、HTTP、WebSocket等,可以灵活地应用于不同的网络通信场景。
此外,Undertow采用异步处理方式,具有高性能和低资源消耗的特点,而Netty也支持异步操作,但更注重于对各种网络协议的全面支持和灵活配置。
Undertow主要用于构建Web服务器和Web应用程序,而Netty则广泛应用于各种网络应用领域,支持多种协议并具有灵活的配置。选择使用哪个框架取决于具体的应用需求和场景。
SpringBoot整合Undertow
在Spring Boot中整合Undertow,可以通过以下步骤实现:
- 添加依赖:在pom.xml文件中添加Spring Boot Starter Undertow的依赖。例如:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
- 配置Undertow:在application.properties或application.yml文件中配置Undertow的相关属性。例如:
server.port=8080
server.undertow.servlet-container.servlet-mapping=/myapp/*=/myapp/*
上述配置中,server.port指定了服务器的端口号,server.undertow.servlet-container.servlet-mapping用于配置Undertow的Servlet映射。
- 创建Spring Boot应用程序:按照正常的Spring Boot应用程序开发流程,创建控制器、实体类等。
- 启动应用程序:通过运行Spring Boot应用程序,启动Undertow服务器。
通过以上步骤,就可以在Spring Boot中整合Undertow,并使用它作为Web服务器。需要注意的是,Undertow与Tomcat在特性和配置上存在差异,因此在进行整合时需要参考相关文档和资源,以确保配置正确和应用程序正常运行。
Undertow常用配置参数
Undertow的常用配置参数包括:
- io-threads:指定用于处理I/O操作的线程数,默认为CPU核心数。增加线程数可以提高并发性能,但也会增加CPU负载。
- worker-threads:指定用于处理请求的工作线程数,默认为CPU核心数的两倍。增加线程数可以提高并发处理能力。
- buffer-size:指定输入输出缓冲区的大小,默认为8192字节。可以根据实际情况调整该值,以平衡内存消耗和性能。
- server.undertow.io-threads:设置IO线程数,主要执行非阻塞的任务,它们会负责多个连接,默认设置每个CPU核心一个线程。
- server.undertow.worker-threads:阻塞任务线程池,当执行类似servlet请求阻塞IO操作时,undertow会从这个线程池中取得线程。它的值设置取决于系统线程执行任务的阻塞系数,默认值是IO线程数*8。
- server.undertow.buffer-size:每块buffer的空间大小,越小的空间被利用越充分,不要设置太大,以免影响其他应用,合适即可。
这些参数可以通过在Spring Boot的配置文件中进行设置来调整Undertow的性能和行为。请注意,具体参数可能会根据Undertow的版本和配置有所不同。在调整这些参数时,建议仔细阅读相关文档并进行适当的测试,以确保最佳的性能和稳定性。
Undertow架构设计
Undertow的架构设计是组合式的,可以通过组合各种小型的目的单一的处理程序来构建Web服务器。这种设计使得Undertow非常灵活,可以选择完整的Java EE servlet 3.1容器或初级非阻塞程序处理。
Undertow的设计目标是完全可嵌入的,具有简单易用的编译接口。其生命周期完全由嵌入的应用程序控制。在Undertow中,没有任何容器的概念,应用程序是由多个处理程序组合而来的,通过嵌入的方式来管理所有这些处理程序的生命周期。
Undertow基于Java XNIO,这是一个对JDK NIO类的扩展,与netty的基本功能类似。但相较于后者,Undertow更像是扩展封装。Undertow的核心瓶子在1Mb以下,它在运行时也是轻量级的,具有一个简单的嵌入式服务器使用少于4Mb的堆空间。
Undertow支持对Web套接字的全面支持,包括JSR-356支持,也提供对Servlet 3.1的支持,包括对嵌入式servlet的支持。它还可以在同一部署中混合Servlet和本机Undertow非阻塞处理程序。
Java使用Undertow示例
以下是一个简单的Java使用Undertow的示例:
- 添加Undertow依赖
在项目的pom.xml文件中添加Undertow的依赖:
<dependency>
<groupId>io.undertow</groupId>
<artifactId>undertow-core</artifactId>
<version>2.0.15.Final</version>
</dependency>
- 创建Undertow服务器
创建一个Undertow服务器实例:
Undertow server = Undertow.builder()
.addHttpListener(8080, "localhost")
.setHandler(new HttpHandler() {
@Override
public void handleRequest(HttpServerRequest request, HttpServerResponse response) throws Exception {
response.setStatusCode(200);
response.getOutputStream().write("Hello, Undertow!".getBytes());
response.getOutputStream().flush();
}
})
.build();
上述代码创建了一个监听8080端口的Undertow服务器,并设置了一个简单的请求处理程序,将响应码设置为200,并将响应内容为"Hello, Undertow!"。
- 启动Undertow服务器
启动Undertow服务器:
server.start();
- 停止Undertow服务器
当需要停止Undertow服务器时,可以调用stop()
方法:
server.stop();
这就是一个简单的Java使用Undertow的示例,通过它你可以开始使用Undertow进行Web开发。请注意,这只是一个基本的示例,实际使用中可能需要根据具体需求进行更复杂的配置和开发。
Tomcat与Netty比较
OpenSergo使用详解
Kafka集群详解