Springboot: Tomcat很好我选Undertow
Posted 洪宏鸿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Springboot: Tomcat很好我选Undertow相关的知识,希望对你有一定的参考价值。
Tomcat很好我选Undertow 🚲
Spring Boot服务器容器
Spring Boot默认使用嵌入式Tomcat作为其服务器容器,因为Tomcat是一个成熟、可靠的服务器容器,它能够很好地支持Java Web应用程序。除了Tomcat之外,Spring Boot还支持其他多种服务器容器,包括:
-
Jetty: Jetty是一个轻量级的服务器容器,它具有快速启动时间和占用资源少的优势。Jetty还具有高度可定制性,可以根据需要添加或删除功能。
-
Undertow: Undertow是一个灵活、高性能的服务器容器,可以在高并发情况下提供更好的性能。它的设计目标是支持异步请求处理,从而提高应用程序的性能。
-
Netty: Netty是一个基于NIO的网络框架,它可以作为服务器容器来使用。Netty的主要优势是其高性能和可扩展性。
-
GlassFish: GlassFish是一个完整的Java EE应用服务器,它支持多种Java EE规范和技术。虽然GlassFish相对较重,但它可以为开发人员提供更多的Java EE功能。
如何更换到 Undertow 作为服务器容器
要将Spring Boot应用程序切换到Undertow作为服务器容器,可以遵循以下步骤:
- 添加Undertow依赖:在pom.xml文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
- 排除Tomcat依赖:在pom.xml文件中排除Tomcat依赖,以确保Spring Boot使用Undertow作为服务器容器。添加以下代码:
<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>
- 配置Undertow属性:在application.properties或application.yml文件中添加以下属性配置:
server.port=8080
server.undertow.worker-threads=100
server.undertow.io-threads=100
这些配置属性可以根据需要进行调整,其中server.port是服务器监听的端口号,server.undertow.worker-threads和server.undertow.io-threads是Undertow服务器的工作线程和I/O线程数。
完成上述步骤后,重新启动Spring Boot应用程序即可使用Undertow作为服务器容器。可以通过浏览器访问http://localhost:8080 来验证服务器是否成功更换。
选择适合自己项目的服务器容器主要根据项目的性质和要求来决定。如果需要轻量级、快速启动和低资源占用的服务器容器,可以考虑Jetty或Undertow。如果需要高性能和可扩展性,可以考虑Netty。如果需要完整的Java EE支持,可以考虑GlassFish。
一般什么时候需要考虑更换springboot服务器容器
选择Spring Boot的服务器容器是根据项目的特定需求和实际情况来决定的。下面列举了一些情况,可能需要考虑更换Spring Boot的服务器容器:
-
高并发场景:如果应用程序需要处理大量并发请求,可能需要考虑使用高性能的服务器容器,例如Undertow或Netty。
-
资源占用问题:如果应用程序需要占用较少的系统资源,例如内存或CPU,可能需要考虑使用轻量级服务器容器,例如Jetty或Undertow。
-
安全性问题:如果应用程序需要更高的安全性保障,例如支持HTTPS协议或安全认证等,可能需要考虑使用支持这些功能的服务器容器,例如Tomcat或Undertow。
-
兼容性问题:如果应用程序需要支持特定的协议或技术栈,可能需要考虑使用支持这些功能的服务器容器,例如GlassFish。
-
性能测试结果:在进行性能测试时,可以尝试使用不同的服务器容器来比较其性能和稳定性,并根据测试结果选择最适合的服务器容器。
总的来说,选择适合自己项目的服务器容器主要根据项目的性质和要求来决定,需要考虑多种因素来进行选择。
Undertow 和 Tomcat 作为服务器容器的优势跟劣势
Undertow和Tomcat都是常用的Java服务器容器,它们各有优缺点。下面是它们的优缺点比较:
- 性能优劣
Undertow比Tomcat具有更高的性能,可以更好地处理高并发请求。Undertow采用异步IO的方式来处理请求,能够更好地利用服务器资源,从而提高性能。Tomcat采用线程池的方式来处理请求,相比异步IO的方式存在一些性能瓶颈。
- 内存占用
Undertow相比Tomcat占用更少的内存,因为它采用了异步IO的方式,可以更好地利用服务器资源。而Tomcat采用线程池的方式,需要为每个请求分配一个线程,这会导致内存占用较高。
- 启动速度
Undertow启动速度比Tomcat快,因为它占用的资源更少,启动时间也更短。
- 配置复杂度
Undertow的配置比Tomcat略复杂一些,但是在Spring Boot中使用Undertow相对简单,只需要添加相应的依赖并配置几个属性即可。
- 兼容性
Tomcat支持更多的Java EE规范和技术,因此在某些情况下可能更适合需要完整Java EE支持的项目。Undertow虽然不支持Java EE规范,但是可以通过集成其他框架来实现相应的功能。
综上所述,Undertow相对于Tomcat而言具有更高的性能和更少的内存占用,适用于处理高并发请求的情况。但是Tomcat在Java EE支持和兼容性方面更好,适用于需要完整Java EE支持的项目。因此,在选择服务器容器时,需要根据项目实际需求和特点进行选择。
Undertow 成功案例
Undertow在兼容性方面的确比传统的Java EE服务器容器如Tomcat稍有不足,但是也有很多成功的案例,说明Undertow在实际生产环境中已经足够使用。
一些成功的Undertow案例包括:
-
WildFly: WildFly是一个Java EE应用服务器,它使用Undertow作为其Web服务器容器,因此在实际生产环境中得到了广泛应用。
-
Red Hat OpenShift: Red Hat OpenShift是一个开源的容器应用平台,它使用Undertow作为其Web服务器容器,以提供高性能和可扩展性。
-
Apache Camel: Apache Camel是一个基于规则的消息路由和转换框架,它使用Undertow作为其Web服务器容器,以提供高性能和可靠性。
-
JBoss Fuse: JBoss Fuse是一个集成平台,它使用Undertow作为其Web服务器容器,以提供高性能和可靠性。
总的来说,虽然Undertow在兼容性方面不如传统的Java EE服务器容器如Tomcat,但是在实际生产环境中已经得到了广泛应用,足以满足大多数企业级应用程序的需求。并且随着Undertow的不断发展和完善,其兼容性也在不断提高。
总结
选择适合自己项目的服务器容器主要根据项目的性质和要求来决定,需要考虑多种因素来进行选择。但我觉得 Undertow 会越来越强的, 替代Tomcat也不是不可能
springboot对jsp模板引擎的支持
1.导入依赖:
<!--注意:spring boot对jsp的支持不是很好,在使用spring boot自带tomcat的同时,还需要引入另外的一个tomcat,以来如下所示,且scope属性需要被注释掉 -->
<!--注掉的原因是:maven默认scope是compile,表示打包时会把此包打入jar包中,而provided表示打包时不会打如jar包中,因为它默认是jar包中会提供,说白了就是你标注了 provided tomcat-embed-jasper就不会被打入jar包中,项目跑起来就肯定会有问题了 tomcat-embed-jasper是tomcat下的插件用来支持jsp的-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<!--<scope>provided</scope> 注意,这个scope需要被注释掉-->
</dependency>
<!-- jsp标签库 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
2、创建相关文件夹和修改配置文件
在src/main路径下创建一个文件夹webapp,然后在wepapp下面再创建一个文件夹WEB-INF,在WEB-INF下再创建一个文件夹jsp用来存放jsp页面(WEB-INF下的jsp页不能直接访问,必须通过控制器跳转)。我们还可以直接在webapp下创建一个hello.jsp,这个页面可以直接在浏览器中访问
修改配置文件application.properties
#页面默认前缀目录 spring.mvc.view.prefix=/WEB-INF/jsp/ #页面默认后缀目录 spring.mvc.view.suffix=.jsp
3、创建一个UserController.java3、创建一个UserController.java
package com.xdw.springbootdemo5; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller public class UserController { /** * 采用model往request域中存值,存入2个普通的字符串 * @param model * @return */ @RequestMapping(value = "/userinfo1",method = RequestMethod.GET) public String userinfo1(Model model) { String username = "xiadewang"; String password = "123456"; model.addAttribute("username", username); model.addAttribute("password", password); return "userinfo1"; } }
4.创建一个jsp页面userinfo1.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <p>用户名:${username}</p> <p>密码:${password}</p> </head> <body> </body> </html>
bug日记:在pom文件中,每个子父元素之间都只能相隔一个空格
运行项目时,如果idea启动有bug,试试mvn启动springboot工程命令如下: mvn spring-boot:run 注:这里一定要切换到带有pom文件的根目录下执行该命令
以上是关于Springboot: Tomcat很好我选Undertow的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot系列之tomcat内嵌web容器是如何启动的
spring boot .war tomcat 应用程序日志不存在
Spring Boot在部署到Tomcat期间无法加载外部jar