Undertow在SpringBoot项目的使用,Undertow、Jetty和Tomcat之间的区别比较

在部署微服务应用的时候,使用更轻量高性能的web服务器的需求很迫切,因为这样可以更好的提高服务的性能,同时节省开销

什么是Undertow
 Undertow是一个用java编写的灵活的高性能Web服务器,提供基于NIO的阻塞和非阻塞API。

      Lightweight(轻量级)

          Undertow非常轻量级,Undertow核心jar包在1Mb以下。 它在运行时也是轻量级的,有一个简单的嵌入式服务器使用少于4Mb的堆空间

      HTTP Upgrade Support(支持http升级)

          支持HTTP升级,允许多个协议通过HTTP端口进行多路复用

      Web Socket Support(支持WebScoket)

          Undertow提供对Web Socket的全面支持,包括JSR-356支持

      Servlet 3.1  

           Undertow提供对Servlet 3.1的支持,包括对嵌入式servlet的支持。 还可以在同一部署中混合Servlet和本机Undertow非阻塞处理程序

      Embeddable(可嵌入的)

           Undertow可以嵌入在应用程序中或独立运行,只需几行代码

       Flexible(灵活性)

         Undertow框架jar包: undertow-core.jar undertow-servlet.jar

Jetty

Jetty 比 Tomcat 架构更加简单。 jetty的所有组件都是基于 Handler 来实现,它的主要功能扩展都可以用 Handler 来实现;Tomcat 的整体设计上很复杂,tomcat是基于容器的架构,开发者要想扩展tomcat功能就需要了解tomcat架构,遵循tomcat的规范。Jetty更轻量级,由于Tomcat除了遵循Java Servlet规范之外,自身还扩展了大量JEE特性以满足企业级应用的需求,所以Tomcat是较重量级的,而且配置较Jetty亦复杂许多。但对于大量普通互联网应用而言,并不需要用到Tomcat其他高级特性,所以在这种情况下,使用Tomcat是很浪费资源的。这种劣势放在分布式环境下,更是明显。换成Jetty,每个应用服务器省下那几兆内存,对于大的分布式环境则是节省大量资源。而且,Jetty的轻量级也使其在处理高并发细粒度请求的场景下显得更快速高效。
        jetty比较容易扩展第三方框架,所以也跟容易定制,Jetty更灵活,体现在其可插拔性和可扩展性,更易于开发者对Jetty本身进行二次开发,定制一个适合自身需求的Web Server。相比之下,重量级的Tomcat原本便支持过多特性,要对其瘦身的成本远大于丰富Jetty的成本。用自己的理解,即增肥容易减肥难。
        jetty更加轻量可以节省内存

         Jetty默认采用NIO(非阻塞IO)结束在处理I/O请求上更占优势,在处理静态资源时,性能较高。
        tomcat更加稳定、更加成熟,在企业级中占有率很大

       Jetty更满足公有云的分布式环境的需求,而Tomcat更符合企业级环境。当支持大规模企业级应用时,Jetty也许便需要扩展,在这场景下Tomcat便是更优的。

从架构上来看 Tomcat 在处理少数非常繁忙的连接上更有优势,也就是说连接的生命周期如果短的话,Tomcat 的总体性能更高。

而 Jetty 刚好相反,Jetty 可以同时处理大量连接而且可以长时间保持这些连接。例如像一些 web 聊天应用非常适合用 Jetty 做服务器,像淘宝的 web 旺旺就是用 Jetty 作为 Servlet 引擎。

另外由于 Jetty 的架构非常简单,作为服务器它可以按需加载组件,这样不需要的组件可以去掉,这样无形可以减少服务器本身的内存开销,处理一次请求也是可以减少产生的临时对象,这样性能也会提高。另外 Jetty 默认使用的是 NIO 技术在处理 I/O 请求上更占优势,Tomcat 默认使用的是 BIO,在处理静态资源时,Tomcat 的性能不如 Jetty。



在springboot中使用Undertow

去除其他服务容器,如除去默认Tomcat容器

依赖引入
<!-- 内置服务器使用 Undertow -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

配置Undertow参数

server.undertow.accesslog.dir=     # Undertow access log directory.
server.undertow.accesslog.enabled=false     # Enable access log.
server.undertow.accesslog.pattern=common     # Format pattern for access logs.
server.undertow.accesslog.prefix=access_log.     # Log file name prefix.
server.undertow.accesslog.rotate=true     # Enable access log rotation.
server.undertow.accesslog.suffix=log     # Log file name suffix.
server.undertow.buffer-size=     # Size of each buffer in bytes.
server.undertow.buffers-per-region=     # Number of buffer per region.
server.undertow.direct-buffers=     # Allocate buffers outside the Java heap.
server.undertow.io-threads=     # Number of I/O threads to create for the worker.
server.undertow.max-http-post-size=0     # Maximum size in bytes of the HTTP post content.
server.undertow.worker-threads=     # Number of worker threads.


在SpringBoot中使用jetty

去除其他容器如Tomcat的依赖

引入jetty依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

配置Jetty参数

server.jetty.acceptors=2 # acceptor线程数
server.jetty.max-http-post-size=0 # put或post方法最大字节数
server.jetty.selectors=4 # selector线程数
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true 


       

发布了117 篇原创文章 · 获赞 17 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/Jack__iT/article/details/100593297