Jetty 和其他容器如何在遵守 Servlet 规范的同时利用 NIO?

     2023-02-16     38

关键词:

【中文标题】Jetty 和其他容器如何在遵守 Servlet 规范的同时利用 NIO?【英文标题】:How do Jetty and other containers leverage NIO while sticking to the Servlet specification? 【发布时间】:2014-10-01 10:32:41 【问题描述】:

我是 NIO 的新手,我正在尝试弄清楚 Jetty 如何利用 NIO。

我对传统 servlet 容器如何使用 Blocking IO 服务请求的理解如下:

    请求到达 分配一个线程来处理请求并调用 servlet 方法(doGet 等) Servlet 方法被传递给 InputStreamOutputStream servlet 方法从InputStream 读取并写入OutputStream InputStreamOutputStream 基本上与底层Socket 的各自流相关联

使用 NIO 连接器有什么不同?我的猜测是这样的:

    请求到达 Jetty 使用 NIO 连接器并异步缓冲整个请求 读取请求后,将缓冲区完全包装在InputStream 中 创建一个空的响应缓冲区(包装在 OutputStream 中) 分配一个线程并调用处理上述包装流的 servlet 方法(doGet 等) Servlet 方法写入包装(缓冲)的响应流并从 servlet 方法返回 Jetty 使用 NIO 将响应缓冲区内容写入底层SocketChannel

从 Jetty 文档中,我发现了以下内容:

SelectChannelConnector - 此连接器使用具有非阻塞线程模型的高效 NIO 缓冲区。 Jetty 使用 Direct NIO 缓冲区,并且只将线程分配给有请求的连接。同步模拟 servlet API 的阻塞,请求处理结束时任何未刷新的内容都是异步写入的。

我不确定我是否理解 Synchronization simulates blocking for the servlet API 的含义?

【问题讨论】:

【参考方案1】:

你没有完全正确。当 jetty 使用 NIO 连接器(并且 9 只支持 NIO)时,它的工作原理如下:

    空闲状态为少数线程(1-4 取决于 # 核心)调用选择器,寻找 IO 活动。这已扩展到 Jetty 上超过 1,000,000 个连接。

    When selector sees IO activity, it calls a handle method on the connection, which either:

    其他东西已经注册它被阻止等待此连接的 IO,因此在这种情况下,选择器只会唤醒被阻止的人。 否则将调度线程来处理连接。

    如果一个线程被调度,那么它将尝试读取连接并解析它。现在发生的情况取决于连接是 http、spdy、http2 还是 websocket。

    对于 http,如果请求标头完整,则线程继续调用对请求的处理(最终到达 servlet),而无需等待任何内容。 对于 http2/spdy 需要另一个调度,但请参阅列表中关于 Eat-What-You-Kill 策略的讨论:http://dev.eclipse.org/mhonarc/lists/jetty-dev/msg02166.html 对于 websocket,调用消息处理。

    一旦一个线程被分派到一个 servlet,它看起来就像 servlet IO 阻塞了,但在 HttpInputStream 和 HttpOutputStream 的级别之下,所有的 IO 都是与回调异步的。阻塞 API 使用特殊的阻塞回调来实现阻塞。这意味着如果 servlet 选择使用异步 IO,那么它只是绕过阻塞回调,或多或少地直接使用异步 API。

    servlet 可以使用 request.startAsync 挂起,在这种情况下,分派的线程将返回到线程池,但关联的连接未标记为对 IO 感兴趣。可以执行异步 IO,但需要 AsyncContext 事件来重新分配线程或在异步周期完成后重新注册 IO 活动的连接。

这个视图由于 http2 和 spdy 有点复杂,它们是多路复用的,因此它们可能涉及额外的调度。

任何不分派的 HTTP 框架都可以在基准代码中运行得非常快,但是当面对一个真正的应用程序时,它可以做一些愚蠢的事情,比如阻塞数据库、文件系统、REST 服务等......然后就是缺乏分派意味着一个连接可以保持系统上的所有其他连接。

有关码头如何处理异步和调度的更多信息,请参阅:

https://webtide.com/asynchronous-callbacks/ https://webtide.com/jetty-9-goes-fast-with-mechanical-sympathy/ https://webtide.com/avoiding-parallel-slowdown-in-jetty-9/ https://webtide.com/lies-damned-lies-and-benchmarks-2/ https://webtide.com/jetty-in-techempower-benchmarks/

【讨论】:

等等! :-) 你的意思是 Jetty 9 只提供非阻塞 IO 吗?那么我的 jetty-maven-plugin 9.2.2.v20140723 呢?<groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>9.2.2.v20140723</version> <configuration>   <httpConnector> <port>8888</port> </httpConnector> 是阻塞还是非阻塞?

jetty容器

...maven+jetty)1.Jetty和Tomcat的区别  Jetty是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jett 查看详情

jetty的安装和配置

Jetty是一个开源的servlet容器,它为基于Java的web内容,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的... 查看详情

jetty简介

  Jetty是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone... 查看详情

jetty简介

1.1什么是JettyJetty是一个提供HHTP服务器、HTTP客户端和javax.servlet容器的开源项目。这个入门教程分为五个部分:第一部分部分重点介绍如何使用Jetty,它提供如下信息,如什么是Jetty,从哪可以下载它,怎么在像Maven一样的仓库中... 查看详情

jetty介绍以及小例子(代码片段)

Jetty是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的... 查看详情

springboot2使用jetty容器(替换默认tomcat)

...cle/details/99649252 Jetty和tomcat的比较Tomcat和Jetty都是一种Servlet引擎,他们都支持标准的Servlet规范和JavaEE规范。架构比较Jetty的架构比Tomcat的更为简单。Jetty的架构是基于Handler来实现的,主要的扩展功能都可以用Han 查看详情

jetty数据同步使用

1.Jetty简介  Jetty是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行... 查看详情

jetty学习小结

1.什么是jetty?开源HTTP服务器和Servlet引擎,是web应用的容器,同tomcat类似。由于其轻量灵活的特性,很多知名产品也应用了它,如maven、eclipse、hadoop、spark、activeMQ2.为什么使用jetty?异步的Servlet,支持更高的并发量(异步Servlet... 查看详情

在部署到servlet容器之前,如何生成包含springboot的war文件(代码片段)

...ingBoot有2种启动方式,通过main方法启动和实现SpringBootServletInitializer方式。如果要在Tomcat或Jetty等容器中运行SpringBoot时(类似web.xml配置方式),还需要添加一些操作。1)新建一个类,继承SpringBootServletInitial... 查看详情

jetty使用教程——开始使用jetty

...么是Jetty  Jetty是一个提供HHTP服务器、HTTP客户端和javax.servlet容器的开源项目。   这个入门教程分为五个部分:第一部分部分重点介绍如何使用Jetty,它提供如下信息,如什么是Jetty,从哪可以下载它,怎么在像Maven一样... 查看详情

总结:apache/tomcat/jboss/jetty/nginx区别.

...he支持静态页,Tomcat支持动态的。2、Jetty:Tomcat内核作为其Servlet容器引擎,并加以审核和调优.大中型系统可以应用。能够提供数据库连接池服务,还支持其他Web技术的集成,譬如PHP、.NET两大阵营.3、JBoss是一个管理EJB的容器和服务... 查看详情

day670.servlet规范&servlet容器-深入拆解tomcat&jetty(代码片段)

Servlet规范&Servlet容器Hi,我是阿昌,今天学习关于的内容是Servlet规范和Servlet容器的学习记录。浏览器发给服务端的是一个HTTP格式的请求,HTTP服务器收到这个请求后,需要调用服务端程序来处理,所谓的服... 查看详情

jetty安装启动与项目部署

Jetty是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的... 查看详情

servlet工作原理解析(代码片段)

Web技术成为当今主流的互联网Web应用技术之一,而Servlet是JavaWeb技术的核心基础。要介绍Servlet必须要先把Servlet容器说清楚,Servlet与Servlet容器的关系有点像枪和子弹的关系,枪是为子弹而生,而子弹又让枪有了杀伤力。虽然它们... 查看详情

如何在 Jetty 中的 /* 上映射 servlet 过滤器?

】如何在Jetty中的/*上映射servlet过滤器?【英文标题】:Howtomapaservletfilteron/*inJetty?【发布时间】:2012-01-0309:14:23【问题描述】:我有一个servlet过滤器,我想将它映射到Jetty中的http://127.0.0.1:8888/。我已经使用url模式/*放置了一个ser... 查看详情

jetty9安装部署

Jetty简介Jetty是一个开源的servlet容器,它为基于Java的web内容,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-... 查看详情

jetty(代码片段)

Jetty是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的... 查看详情

springboot中嵌入式servlet容器的比较

介绍随着云原生应用和微服务的流行也催生了对嵌入式Servlet容器需求的增长。为更加简单的构建应用和服务,SpringBoot为开发者提供了三种成熟的容器:Tomcat,Undertow和Jetty。在本文中,我们会演示了一种方法:测量启动和增加负... 查看详情