快速学习Jetty-初识Jetty

简单来讲 Jetty 就是一个 开源HTTP 服务器和Servlet 引擎,它可以为 JSP 和 Servlet 提供运行时环境。比如 Java web 应用最常用的 Servlet 容器 Tomcat。由于其轻量、灵活的特性,Jetty 也被应用于一些知名产品中,例如 ActiveMQ、Maven、Spark、GoogleAppEngine、Eclipse、Hadoop 等。

为什么要使用Jetty
  1. 异步的 Servlet,支持更高的并发量
  2. 模块化的设计,更灵活,更容易定制,也意味着更高的资源利用率
  3. 在面对大量长连接的业务场景下,Jetty 默认采用的 NIO 模型是更好的选择
  4. 将jetty嵌入到应用中,使一个普通应用可以快速支持 http 服务

作为一个开源的 HTTP 服务器和 Servlet 容器,Jetty 已经在尺寸、性能以及可拓展性上超过绝大多数其他的 WEB 服务器。因其高拓展的特性,我们可以很轻松的对其增加一些特殊的组件。当然,服务器资源是珍贵的,我们完全可以将 Jetty 中的一些不必要的组件剔除,只留下我们所需要的组件,提高对服务器资源的利用率。在性能方面,Jetty 采用的 NIO 可以让我们处理更大量级的 WebSocket 连接,当然在处理静态资源上也更快。

Jetty的基本架构

Jetty 的架构比较简单, 是一个扩展性和灵活性都非常好的服务器. 在 Jetty 中有个很重要的数据模型 Handler, Jetty 的高扩展性和灵活性主要就是来自于这个数据模型 Handler. 所有的拓展组件都可以作为一个 Handler, 而这些 Handler 都可以被添加到 Server 中, 让 Jetty 帮你进行管理.
从下图来看, Jetty 有两个核心组件, Server 和 Connector. 其中 Server 是基于 Handler 容器工作了, 提到容器, 它与 Tomcat 的 Container 比较相似. 后面会详细介绍 Jetty 与 Tomcat 的比较. 另一个核心组件就是 Connector, 他的主要职责是接收客户端请求, 并将该请求分配给一个处理队列去执行.
在这里插入图片描述

Jetty与Tomcat的区别

同样作为 Servlet 引擎,Tomcat 自然是不得不提的了。Tomcat 的成名时间早于 Jetty,它已经广泛的被市场接受和认可,相对于 Jetty 来说 Tomcat 还是比较稳定和成熟,尤其是在企业级应用方面,Tomcat 任然是第一选择。不过 Jetty 在架构方面的诸多优势,也让 Jetty 的市场份额不断提高。发展至今,Jetty 已经不单单只是一款 Java Web 服务器和 Servlet 容器,而是一款功能强大的工具集。他的诸多特性都能够满足现在流行的服务端架构模式,包括开发、部署以及运维。

Jetty 与 Tomcat 相比,主要的一些区别如下:

  • Jetty 可以比较方便的贴合第三方框架,比如可以直接在 Spring 中配置 Jetty 服务器、也可以将会话交给 NoSql 数据库进行管理
  • Jetty 提供组件化的方式直接将 Jetty 作为 HTTP 组件集成到应用中,从而使应用快速支持 HTTP 服务
  • 从架构上来看,Jetty 可以说是面向 Handler 的架构,它的所有组件都是基于 Handler 实现的。而 Tomcat 则是面向容器的架构,它是以容器封层的方式去提高拓展性
  • 性能方面来看,它们之间的区别主要在于处理短连接与长连接上,Tomcat 在处理生命周期较短的连接比较有优势。而 Jetty 则刚好相反,Jetty 默认采用的 NIO 技术在处理大量长连接时比较有优势,并且在静态资源的处理上 Jetty 的 NIO 也更胜一筹
  • 从功能特性来看,Jetty 的更新速度是要高于 Tomcat 的,比如 Jetty 9.3 版本开始支持 HTTP/2 的支持,而 Tomcat 9 版本才开始支持 HTTP/2
  • Jetty 的高度模块化使我们可以很方便的对一些依赖的组件进行管理,在将 Jetty 嵌入项目使用时,我们可以随便通过 Maven 去添加我们所需的一些其他的模块,如 WebSocket。而 Tomcat 在这方面则比较欠缺

综合来看,Tomcat 容器分层的架构体系更为成熟,能够满足各种场景的部署需求,而 Jetty 则更加轻量。Jetty 比较适合组件化应用,集成到应用系统中提供 HTTP 服务。Jetty 更适组件化的应用,将其集成到应用系统中提供 HTTP 服务,也适合于以更轻量的方式管理与部署应用服务,如微服务。