本文节选自
http://www.ibm.com/developerworks/cn/java/j-lo-jetty/
基于 NIO 方式工作
前面所描述的 Jetty 建立客户端连接到处理客户端的连接都是基于 BIO 的方式,它也支持另外一种 NIO 的处理方式,其中 Jetty 的默认 connector 就是 NIO 方式。
关于 NIO 的工作原理可以参考 developerworks 上关于 NIO 的文章,通常 NIO 的工作原型如下:
Selector selector = Selector.open();
ServerSocketChannel ssc = ServerSocketChannel.open();
ssc.configureBlocking( false );
SelectionKey key = ssc.register( selector, SelectionKey.OP_ACCEPT );
ServerSocketChannel ss = (ServerSocketChannel)key.channel();
SocketChannel sc = ss.accept();
sc.configureBlocking( false );
SelectionKey newKey = sc.register( selector, SelectionKey.OP_READ );
Set selectedKeys = selector.selectedKeys();
创建一个 Selector 相当于一个观察者,打开一个 Server 端通道,把这个 server 通道注册到观察者上并且指定监听的事件。然后遍历这个观察者观察到事件,取出感兴趣的事件再处理。这里有个最核心的地方就是,我们不需要为每个被观察者创建一个线程来监控它随时发生的事件。而是把这些被观察者都注册一个地方统一管理,然后由它把触发的事件统一发送给感兴趣的程序模块。这里的核心是能够统一的管理每个被观察者的事件,所以我们就可以把服务端上每个建立的连接传送和接受数据作为一个事件统一管理,这样就不必要每个连接需要一个线程来维护了。
这里需要注意的地方时,很多人认为监听 SelectionKey.OP_ACCEPT 事件就已经是非阻塞方式了,其实 Jetty 仍然是用一个线程来监听客户端的连接请求,当接受到请求后,把这个请求再注册到 Selector 上,然后才是非阻塞方式执行。这个地方还有一个容易引起误解的地方是:认为 Jetty 以 NIO 方式工作只会有一个线程来处理所有的请求,甚至会认为不同用户会在服务端共享一个线程从而会导致基于 ThreadLocal 的程序会出现问题,其实从 Jetty 的源码中能够发现,真正共享一个线程的处理只是在监听不同连接的数据传送事件上,比如有多个连接已经建立,传统方式是当没有数据传输时,线程是阻塞的也就是一直在等待下一个数据的到来,而 NIO 的处理方式是只有一个线程在等待所有连接的数据的到来,而当某个连接数据到来时 Jetty 会把它分配给这个连接对应的处理线程去处理,所以不同连接的处理线程仍然是独立的。
分享到:
相关推荐
基于这些模式,可以构建高效稳定的NIO网络服务器。例如,作者创建了一个简单的NIO Server,能够在保持6万连接的同时承受3到4万TPS的负载,验证了这种模式的有效性。这个模式对于未来设计高性能的网络服务具有很高的...
Jetty 8在设计时特别强调了性能和可扩展性,它使用了Java NIO(New I/O)API来处理网络通信,相比于传统的基于BIO( Blocking I/O)的服务器,NIO能更好地处理高并发场景。NIO允许单个线程服务多个连接,通过选择器...
Jetty 6.1.6 是一个开源的、轻量级的Java Web服务器和Servlet容器。这个版本的Jetty发布于较早时期,但它的设计理念和...虽然这个版本相对较旧,但其基本原理和架构对于学习现代Web服务器的工作方式仍具有参考价值。
通过自动配置、起步依赖和内嵌的HTTP服务器(如Tomcat或Jetty),Spring Boot使得开发者可以快速启动并运行应用,无需繁琐的配置工作。 在本项目中,Spring Boot主要负责以下几个方面: 1. **依赖管理**:Spring ...
基于Jetty OSGi的产品 OSGi贴士 Equinox中使用Jetty实现HTTP Service Felix中使用Jetty实现HTTP Service PAX中使用Jetty实现HTTP Srevice ProSyst mBedded Server Equinox Edition Spring Dynamic Modules里的Jetty ...
7. 性能优化:Jetty采用非阻塞I/O模型,基于NIO(New I/O)API,这使其在处理高并发连接时表现出色。此外,Jetty的线程池策略也是其性能优化的关键,可以根据需要动态调整线程数量。 8. 监控与日志:Jetty提供了...
4. **异步I/O**:Jetty利用Java NIO(非阻塞I/O)来提高性能,允许服务器同时处理大量连接,从而提高了并发性。 5. **模块化设计**:Jetty的模块化架构允许用户根据需求选择安装组件,降低了不必要的资源消耗。 6....
Jetty是一款轻量级、高性能的Java Web服务器和Servlet容器,因其开源、小巧且易于集成的特点,被广泛应用于各种项目中。...在学习过程中,配合源代码示例`testjetty`,动手实践是理解Jetty工作原理的最佳途径。
1. **事件驱动**:i-jetty采用非阻塞I/O(NIO)模型,基于Java的Selector API,以事件驱动的方式处理网络通信,提高系统资源利用率。 2. **模块化**:i-jetty的架构高度模块化,每个功能组件都可以独立加载和卸载,...
在工作原理上,Jetty采用事件驱动和非阻塞I/O模型,通过NIO(New IO)API实现高效的数据传输。这种设计使得Jetty能够处理大量并发连接,而不会因为线程上下文切换导致的开销而降低性能。同时,Jetty的生命周期管理也...
理解并掌握Jetty的这些核心特性对于开发和维护基于Java的Web应用至关重要,特别是那些需要高效、轻量级服务器解决方案的场景。通过熟练运用Jetty,开发者可以构建出高性能、可扩展且易于维护的Web应用程序。
Jetty 9是一款轻量级、高性能且开源的Servlet容器,它主要负责处理基于Java Servlet规范的应用程序。作为Java服务的一部分,Jetty9为开发者提供了高效、稳定且灵活的平台来部署和运行Web应用程序。 首先,Jetty 9...
- **高性能IO**: 提供了基于NIO的高效连接器,以提高并发处理能力。 **1.2 Jetty的特点** Jetty相较于其他Web容器(如Tomcat)有以下几个显著特点: - **轻量级**: 占用资源少,启动速度快。 - **模块化**: 组件...
- **会话管理**:Jetty提供会话跟踪和管理,支持基于cookie的会话以及基于URL重写的方式。 5. **集成与扩展** - **与其他框架集成**:Jetty可以与Spring、Hibernate等Java框架无缝集成,简化Web应用开发。 - **...
Jetty是一款轻量级、高性能的Java Web服务器和Servlet...通过理解和掌握这些关键知识点,你可以轻松地构建和调试基于Jetty的应用。在实际项目中,根据需求选择适当的配置和扩展,可以实现更加灵活、高效的Web服务部署。
5. **jetty-io-9.2.13.v20150730.jar**:负责底层的I/O操作,包括NIO(非阻塞I/O)和选择器,为高并发环境下的高效网络通信提供了基础。 6. **jetty-webapp-9.2.13.v20150730.jar**:这个模块负责部署和管理Web应用...
<New id="httpConnector" class="org.eclipse.jetty.server.nio.SelectChannelConnector"> <Set name="host">localhost <Set name="port">8080 ``` **4.3 org.mortbay.xml.XmlConfiguration** `org....
1. **Servlet容器**:Jetty是一个实现了Java Servlet和JavaServer Pages(JSP)规范的服务器,允许开发者部署和运行基于这些标准的Web应用。在9.4.6版本中,它支持Servlet 3.1规范,提供对异步处理、过滤器和监听器...
- 会话管理可以通过`org.eclipse.jetty.server.session`包实现,支持基于内存或数据库的会话存储。 7. **性能优化** - Jetty提供了线程池配置,可以通过调整线程数量来优化并发性能。 - 使用NIO或Epoll(针对...
Servlet是Java平台上用于创建动态Web内容的标准API,而Jetty作为Servlet容器,允许开发者运行和管理基于Servlet的Web应用。Jetty 9.4.6 版本是一个稳定版本,包含了对Servlet 3.1规范的支持,这意味着它支持异步处理...