在JavaWeb容器的世界里,Tomcat和Jetty是最著名和使用最多的开源项目,也为大众所熟知。今天给大家介绍一款堪比Tomcat的神器:Undertow。据说在性能方面它将击败Tomcat。如果你还不知道,那你就OUT了。我们来看看SpringBoot默认支持的三种Servlet容器:NameServletVersionTomcat9.04.0Jetty9.43.1Undertow2.04.0以上来自SpringBoot2.3.2官方文档。欲了解更多信息,请单击此处参考本文。Undertow可以成为SpringBoot默认集成的三大容器之一。我认为,仅此一项就足以说明其地位。到底什么是暗流?Undertow是RedHat(红帽)的开源产品。它是用Java开发的。它是一个灵活的高性能Web服务器,提供基于NIO的阻塞/非阻塞API。它也是Wildfly的默认Web容器。搜索Undertow:页面显示JBossCommunity,自从RedHat在2006年收购了JBoss后,这并不奇怪。Undertow是一种基于组合的架构,可以通过组合一系列小型处理器来构建Web服务器。这使我们可以灵活地在JavaEEservlet4.0容器和底层非阻塞处理程序或更多容器之间进行选择。Undertow被设计成完全可嵌入的,所以它也被称为嵌入式容器,具有易于使用的平滑构建API。此外,Undertow的生命周期也完全由嵌入式应用控制。这也是为什么SpringBoot可以直接嵌入Undertow的原因,对于嵌入来说是一个发烧。我不会介绍SpringBoot的基础知识。关注公众号Java技术栈,回复后台开机,获取我写的系列教程。官网:https://undertow.io/源码托管在Github上:https://github.com/undertow-io/undertowUndertow有哪些特点?1)HTTP/2SupportUndertow开箱即用地支持HTTP/2,无需覆盖引导程序类路径。2)支持HTTP升级支持HTTP升级,允许多种协议通过HTTP端口复用。3)支持WebSocketUndertow提供了对Websockets的全面支持,包括对JSR-356的支持。4)支持Servlet4.0Undertow提供对Servlet4.0的支持,包括对嵌入式Servlets的支持,也可以混合部署Servlets和原生的Undertow非阻塞处理器。5)可嵌入Undertow可以嵌入到应用程序中,也可以通过几行代码独立运行。6)高灵活性通过链式处理器配置一个Undertow服务器,可以按需添加功能,避免不必要的功能。Undertow的性能如何?国外有个帖子比较Tomcatvs.Jettyvs.Undertow的性能:https://examples.javacodegeeks.com/enterprise-java/spring/tomcat-vs-jetty-vs-undertow-comparison-of-spring-boot-embedded-servlet-containers/从测试结果来看,三个Servlet容器都有不错的性能,但Undertow性能更好,其次是Tomcat和Jetty。Jetty在启动时的内存占用量最大:311MB,Tomcat和Undertow的初始内存占用量都很低,约为120MB,而Undertow的初始内存占用量最低:114MB。最后,关键区别是Undertow响应头参数默认包含HTTP长连接信息。在支持持久连接客户端时,此标头参数可以通过重用连接来优化性能。看看codeUndertow目前有两个主要版本:2.1:目前支持Servlet4.0,JDK8+稳定版;1.4:目前支持Servlet3.1,JDK7稳定版;独立使用Undertow需要添加如下依赖:io.undertowundertow-core2.1.0.Finalio.undertowundertow-servlet2.1.0.Finalio.undertow复制代码undertow-websockets-jsr2.1.0.Final下面例子来自官网:publicclassHelloWorldServer{publicstaticvoidmain(finalString[]args){Undertowserver=Undertow.builder().addHttpListener(8080,"localhost").setHandler(newHttpHandler(){@OverridepublicvoidhandleRequest(finalHttpServerExchangeexchange)throwsException{exchange.getResponseHeaders().put(Headers.CONTENT_TYPE,"text/plain");exchange.getResponseSender().send("HelloWorld");}}).build();server.start();}}这是一个简单的Hello使用异常IOWorld的例子SpringBoot&Undertow上文提到,Undertow是为嵌入而生的web容器,也是SpringBoot默认集成的容器之一。下面栈长将向您展示如何在SpringBoot中使用Undertow。因为在spring-boot-starter-webstarter中,Tomcat是SpringBoot默认的内嵌容器,即:spring-boot-starter-tomcat。SpringBoot还提供了另外两个starter方便替换:spring-boot-starter-jettyspring-boot-starter-undertow下面是一个简单的实用示例,说明如何在SpringBoot中使用Undertow。SpringBoot的基础知识我就不介绍了。不熟悉的可以关注公众号Java技术栈,后台回复boot可以获取我写的系列教程。排除Tomcat依赖,然后添加Undertow依赖:-->org.springframework.bootspring-boot-starter-tomcatorg.springframework.bootspring-boot-starter-undertow一步集成完成,当然是实际情况还是需要在应用配置文件中添加更多自定义或优化的Undertow配置参数。Undertow容器的具体配置可以看这两个类:org.springframework.boot.autoconfigure.web.ServerPropertiesorg.springframework.boot.autoconfigure.web.ServerProperties.Undertow也可以看SpringBoot官方文档:https://文档。spring.io/spring-boot/docs/2.3.2.RELEASE/reference/htmlsingle/#server-properties具有所有服务器配置参数和说明。再写一个测试方法进行测试:/***微信公众号:Java技术栈*/@RestController@SpringBootApplicationpublicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.run(Application.class);}@GetMapping(value="/undertow/test")publicStringundertow(){return"helloundertow";}}启动应用程序:如上图,可以看到Undertow的启动日志。访问测试方法:http://localhost:8080/undertow/test输出成功,测试完成。小结本文介绍Undertow并对其进行整合。虽然Undertow的性能很炸裂,但是你去网上找一圈,完全没有学习资料。所以对于学习和一般应用来说,Tomcat就足够了。一方面是Tomcat的学习资料多,另一方面是Tomcat的使用更加广泛。给你踩了很多坑,暴露了很多漏洞。对于一定要追求极致性能,又不想优化Tomcat的,可以考虑使用Undertow,但同时你要能hold住,需要一定的经验。否则一旦出现问题,就会卡在网上很久。到达的。最后网上很多文章说要杀掉Tomcat,用Undertow。这有点夸张。本文转载自微信公众号“Java技术栈”,可通过以下二维码关注。转载本文请联系Java技术栈公众号。