Undertow使用详解

在这里插入图片描述

简介

在这里插入图片描述

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的特性包括:

  1. 轻量化和灵活:Undertow非常小,整个服务器的基本运行只需要不到4MB的Jar包。它可以作为独立的嵌入式服务器运行,也可以作为大型的集群应用服务器运行。
  2. 高性能:Undertow是一款高性能的服务器,能够处理大量的并发连接,而且处理效率非常高。
  3. 支持HTTP/2:Undertow支持HTTP/2协议,这使得它能够有效地利用网络资源,提高响应速度。
  4. 对Servlet 4.0的支持:Undertow提供了对Servlet 4.0的支持,可以无缝集成各种现代化的Web技术。
  5. 非阻塞性I/O:Undertow的非阻塞性I/O模型可以最大限度地减少线程的使用,提高系统的扩展性。

Undertow的常见使用场景包括:作为一种嵌入式的服务器,用于为独立的应用程序提供网络服务;作为一种传统的应用服务器,用于部署和运行各种Web应用。由于Undertow提供了高性能和高并发性,因此它非常适合于处理大量的用户请求。

在这里插入图片描述

在这里插入图片描述

Undertow使用场景

Undertow的使用场景包括但不限于以下几个方面:

  1. 嵌入式服务器:Undertow可以作为嵌入式服务器,用于为独立的应用程序提供网络服务。由于其轻量化和灵活性,它非常适合于微服务架构,可以用于构建小型的、独立的服务。
  2. 传统应用服务器:Undertow也可以作为一种传统的应用服务器,用于部署和运行各种Web应用。由于Undertow提供了高性能和高并发性,因此它非常适合于处理大量的用户请求。
  3. 支持WebSockets:Undertow提供了对Web Socket的全面支持,包括JSR-356支持,这使得它适合构建需要实时通信的Web应用。
  4. 非阻塞性处理:Undertow支持非阻塞性处理方式,可以最大限度地减少线程的使用,提高系统的扩展性,使其适合处理高并发的请求。
  5. 灵活的扩展性:Undertow的Servlet容器支持多种传输方式,如HTTP、HTTPS、AJP和JOSE,这使得它具有很高的可扩展性,可以轻松地与各种现代Web技术集成。

Undertow是一个强大且灵活的服务器,适用于各种规模的项目和应用。

在这里插入图片描述

Undertow优缺点

  • Undertow的优势包括:
  1. 高性能:Undertow采用了异步处理方式,可以更好地利用CPU资源,提高系统的吞吐量和响应速度。
  2. 轻量级:Undertow的代码量比Tomcat少很多,因此在运行时的内存占用也更小。
  3. 灵活的配置:Undertow提供了很多可配置项,可以根据具体需求进行灵活配置,而Tomcat则相对固定。
  4. 更好的异步支持:Undertow在异步处理方面更加强大,可以支持WebSocket、Servlet 3.1等技术。
  5. 更好的可扩展性:Undertow的架构更加灵活,可以方便地进行扩展和定制。
  • Undertow也有一些劣势:
  1. 社区规模:尽管Undertow在某些方面表现优秀,但与Tomcat相比,其社区规模较小,可能意味着在遇到问题时获取支持和解决方案的难度可能会更大。
  2. 成熟度:Undertow的历史相对较短,与Tomcat相比,其成熟度可能稍逊一筹。这可能会影响到在生产环境中部署和使用的稳定性。
  3. 依赖问题:Undertow的某些高级特性可能需要依赖较难获取或管理的第三方库,这可能会增加部署和管理的复杂性。
  4. 工具支持:与Tomcat相比,一些开发工具可能对Undertow的支持不够完善,这可能会影响到开发效率和问题调试。

选择是否使用Undertow需要根据具体的应用场景和需求来决定。在需要高性能、轻量级和灵活配置的场景下,Undertow可能是一个不错的选择。而在需要稳定性和成熟度的场景下,Tomcat可能更为合适。

在这里插入图片描述

Undertow与Tomcat的比较

Undertow和Tomcat都是常用的Java Web服务器,它们在性能和特性上有所差异。

Undertow的优势包括:

  1. 高性能和低资源消耗:Undertow基于NIO,设计目标是高性能和低资源消耗。它利用了NIO的非阻塞IO特性,可以更高效地处理并发请求。相比之下,Tomcat使用的BIO模型在高并发情况下可能导致资源耗尽。
  2. 支持HTTP/2协议:Undertow支持HTTP/2协议,这是一种新一代高效的HTTP协议,通过多路复用的方式在单个TCP连接上同时处理多个请求,减少了网络延迟,提升了性能。而Tomcat目前只支持HTTP/1.1协议。
  3. 灵活的配置和扩展性:Undertow具有更灵活的配置方式,可以方便地进行扩展和定制。它还支持嵌入式开发,可以直接嵌入到Java项目中使用。

Tomcat的优势包括:

  1. 成熟的生态系统和广泛的支持:Tomcat拥有成熟的生态系统,广泛用于企业级应用开发,得到了社区的广泛支持和文档丰富的资料。这使得Tomcat在处理复杂的企业级应用程序时更加可靠和稳定。
  2. 功能完备:Tomcat提供了丰富的功能,例如支持Servlet和Web Socket,还提供了更完善的社区支持、更高的稳定性和更成熟的生态系统等特点。

Undertow在轻量级、高性能方面具有优势,适用于对性能要求较高的应用场景。而Tomcat虽然在性能方面稍逊一筹,但其稳定性和功能完备性使其成为企业级应用的首选。

在这里插入图片描述

Undertow与Jetty的比较

Undertow和Jetty都是高性能的Java Web服务器,它们在功能和性能上有所差异。

Undertow的优势包括:

  1. 高性能:Undertow采用了异步处理方式,可以更好地利用CPU资源,提高系统的吞吐量和响应速度。
  2. 灵活的配置:Undertow提供了很多可配置项,可以根据具体需求进行灵活配置,而Jetty则相对固定。
  3. 更好的异步支持:Undertow在异步处理方面更加强大,可以支持WebSocket、Servlet 3.1等技术。
  4. 更好的可扩展性:Undertow的架构更加灵活,可以方便地进行扩展和定制。

Jetty的优势包括:

  1. 轻量级:Jetty的代码量比Undertow少很多,因此在运行时的内存占用也更小。
  2. 社区规模:Jetty的社区规模较大,这意味着在遇到问题时更容易获取支持和解决方案。
  3. 成熟度: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,可以通过以下步骤实现:

  1. 添加依赖:在pom.xml文件中添加Spring Boot Starter Undertow的依赖。例如:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
  1. 配置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映射。

  1. 创建Spring Boot应用程序:按照正常的Spring Boot应用程序开发流程,创建控制器、实体类等。
  2. 启动应用程序:通过运行Spring Boot应用程序,启动Undertow服务器。

通过以上步骤,就可以在Spring Boot中整合Undertow,并使用它作为Web服务器。需要注意的是,Undertow与Tomcat在特性和配置上存在差异,因此在进行整合时需要参考相关文档和资源,以确保配置正确和应用程序正常运行。

在这里插入图片描述

Undertow常用配置参数

Undertow的常用配置参数包括:

  1. io-threads:指定用于处理I/O操作的线程数,默认为CPU核心数。增加线程数可以提高并发性能,但也会增加CPU负载。
  2. worker-threads:指定用于处理请求的工作线程数,默认为CPU核心数的两倍。增加线程数可以提高并发处理能力。
  3. buffer-size:指定输入输出缓冲区的大小,默认为8192字节。可以根据实际情况调整该值,以平衡内存消耗和性能。
  4. server.undertow.io-threads:设置IO线程数,主要执行非阻塞的任务,它们会负责多个连接,默认设置每个CPU核心一个线程。
  5. server.undertow.worker-threads:阻塞任务线程池,当执行类似servlet请求阻塞IO操作时,undertow会从这个线程池中取得线程。它的值设置取决于系统线程执行任务的阻塞系数,默认值是IO线程数*8。
  6. 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的示例:

  1. 添加Undertow依赖

在项目的pom.xml文件中添加Undertow的依赖:

<dependency>
    <groupId>io.undertow</groupId>
    <artifactId>undertow-core</artifactId>
    <version>2.0.15.Final</version>
</dependency>
  1. 创建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!"。

  1. 启动Undertow服务器

启动Undertow服务器:

server.start();
  1. 停止Undertow服务器

当需要停止Undertow服务器时,可以调用stop()方法:

server.stop();

这就是一个简单的Java使用Undertow的示例,通过它你可以开始使用Undertow进行Web开发。请注意,这只是一个基本的示例,实际使用中可能需要根据具体需求进行更复杂的配置和开发。

在这里插入图片描述

Tomcat与Netty比较

OpenSergo使用详解

Kafka集群详解

  • 42
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论
Undertow是一个基于Java的灵活高效的Web服务器,它的配置非常灵活,可以根据不同的需求进行定制化配置。下面是Undertow配置的详细介绍: 1. 线程池配置:Undertow使用线程池来处理请求,可以通过以下代码进行配置: ```java Undertow.builder() .setWorkerThreads(200) .setIoThreads(Runtime.getRuntime().availableProcessors() * 2) .build(); ``` 其中,setWorkerThreads()方法用于设置工作线程数,setIoThreads()方法用于设置I/O线程数。 2. Buffer配置:Undertow使用缓冲区来处理请求和响应,可以通过以下代码进行配置: ```java Undertow.builder() .setBufferSize(1024 * 16) .setDirectBuffers(true) .build(); ``` 其中,setBufferSize()方法用于设置缓冲区大小,setDirectBuffers()方法用于设置是否使用直接缓冲区。 3. Http协议配置:Undertow支持HTTP/1.1和HTTP/2协议,可以通过以下代码进行配置: ```java Undertow.builder() .addHttpListener(8080, "localhost") .setServerOption(UndertowOptions.ENABLE_HTTP2, true) .build(); ``` 其中,addHttpListener()方法用于添加HTTP监听器,setServerOption()方法用于设置服务器选项。 4. AccessLog配置:Undertow可以记录访问日志,可以通过以下代码进行配置: ```java Undertow.builder() .setHandler(new AccessLogHandler( new MyHandler(), new CombinedAccessLogReceiver( new FileOutputStream("/var/log/access.log", true)) )) .build(); ``` 其中,setHandler()方法用于设置处理程序,AccessLogHandler用于记录访问日志,CombinedAccessLogReceiver用于接收日志。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有梦想的攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值