Tomcat的异步通讯配置----使用NIO
Tomcat 6.X实现了JCP的Servlet 2.5和JSP2.1的规范,并且包括其它很多有用的功能,使它成为开发
和部署web应用和web服务的坚实平台。
NIO (No-blocking I/O)从JDK 1.4起,NIO API作为一个基于缓冲区,并能提供非阻塞I/O操作的API
被引入。
作为开源web服务器的java实现,tomcat几乎就是web开发者开发、测试的首选,有很多其他商业服务
器的开发者也会优先选择tomcat作为开发时候使用,而在部署的时候,把应用发布在商业服务器上。也有
许多商业应用部署在tomcat上,tomcat承载着其核心的应用。但是很多开发者很迷惑,为什么在自己的应
用里使用tomcat作为平台的时候,而并发用户超过一定数量,服务器就变的非常繁忙,而且很快就出现了
connection refuse的错误。但是很多商业应用部署在tomcat上运行却安然无恙。
其中有个很大的原因就是,配置良好的tomcat都会使用APR(Apache Portable Runtime),APR是
Apache HTTP Server2.x的核心,它是高度可移植的本地库,它使用高性能的UXIN I/O操作,低性能的
java io操作,但是APR对很多Java开发者而言可能稍稍有点难度,在很多OS平台上,你可能需要重新编
译APR。但是从Tomcat6.0以后, Java开发者很容易就可以是用NIO的技术来提升tomcat的并发处理能力。
但是为什么NIO可以提升tomcat的并发处理能力呢,我们先来看一下java 传统io与 java NIO的差别。
Java 传统的IO操作都是阻塞式的(blocking I/O), 如果有socket的编程基础,你会接触过堵塞socket和
非堵塞socket,堵塞socket就是在accept、read、write等IO操作的的时候,如果没有可用符合条件的资
源,不马上返回,一直等待直到有资源为止。而非堵塞socket则是在执行select的时候,当没有资源的时
候堵塞,当有符合资源的时候,返回一个信号,然后程序就可以执行accept、read、write等操作,一般来
说,如果使用堵塞socket,通常我们通常开一个线程accept socket,当读完这次socket请求的时候,开一
个单独的线程处理这个socket请求;如果使用非堵塞socket,通常是只有一个线程,一开始是select状,
当有信号的时候可以通过 可以通过多路复用(Multiplexing)技术传递给一个指定的线程池来处理请求,然
后原来的线程继续select状态。 最简单的多路复用技术可以通过java管道(Pipe)来实现。换句话说,如果
客户端的并发请求很大的时候,我们可以使用少于客户端并发请求的线程数来处理这些请求,而这些来不
及立即处理的请求会被阻塞在java管道或者队列里面,等待线程池的处理。请求 听起来很复杂,在这个架
构当道的java 世界里,现在已经有很多优秀的NIO的架构方便开发者使用,比如Grizzly,Apache Mina等
等,如果你对如何编写高性能的网络服务器有兴趣,你可以研读这些源代码。
简单说一下,在web服务器上阻塞IO(BIO)与NIO一个比较重要的不同是,我们使用BIO的时候往往会
为每一个web请求引入多线程,每个web请求一个单独的线程,所以并发量一旦上去了,线程数就上去
了,CPU就忙着线程切换,所以BIO不合适高吞吐量、高可伸缩的web服务器;而NIO则是使用单线程(单
个CPU)或者只使用少量的多线程(多CPU)来接受Socket,而由线程池来处理堵塞在pipe或者队列里的请
求.这样的话,只要OS可以接受TCP的连接,web服务器就可以处理该请求。大大提高了web服务器的可
伸缩性。
我们来看一下配置,你只需要在server.xml里把 HTTP Connector做如下更改,
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
改为
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443" />
然后启动服务器,你会看到org.apache.coyote.http11.Http11NioProtocol start的信息,表示NIO已经启动。其他的配置请参考官方配置文档。
Enjoy it.
最后贴上官方文档上对tomcat的三种Connector的方式做一个简单比较,
和部署web应用和web服务的坚实平台。
NIO (No-blocking I/O)从JDK 1.4起,NIO API作为一个基于缓冲区,并能提供非阻塞I/O操作的API
被引入。
作为开源web服务器的java实现,tomcat几乎就是web开发者开发、测试的首选,有很多其他商业服务
器的开发者也会优先选择tomcat作为开发时候使用,而在部署的时候,把应用发布在商业服务器上。也有
许多商业应用部署在tomcat上,tomcat承载着其核心的应用。但是很多开发者很迷惑,为什么在自己的应
用里使用tomcat作为平台的时候,而并发用户超过一定数量,服务器就变的非常繁忙,而且很快就出现了
connection refuse的错误。但是很多商业应用部署在tomcat上运行却安然无恙。
其中有个很大的原因就是,配置良好的tomcat都会使用APR(Apache Portable Runtime),APR是
Apache HTTP Server2.x的核心,它是高度可移植的本地库,它使用高性能的UXIN I/O操作,低性能的
java io操作,但是APR对很多Java开发者而言可能稍稍有点难度,在很多OS平台上,你可能需要重新编
译APR。但是从Tomcat6.0以后, Java开发者很容易就可以是用NIO的技术来提升tomcat的并发处理能力。
但是为什么NIO可以提升tomcat的并发处理能力呢,我们先来看一下java 传统io与 java NIO的差别。
Java 传统的IO操作都是阻塞式的(blocking I/O), 如果有socket的编程基础,你会接触过堵塞socket和
非堵塞socket,堵塞socket就是在accept、read、write等IO操作的的时候,如果没有可用符合条件的资
源,不马上返回,一直等待直到有资源为止。而非堵塞socket则是在执行select的时候,当没有资源的时
候堵塞,当有符合资源的时候,返回一个信号,然后程序就可以执行accept、read、write等操作,一般来
说,如果使用堵塞socket,通常我们通常开一个线程accept socket,当读完这次socket请求的时候,开一
个单独的线程处理这个socket请求;如果使用非堵塞socket,通常是只有一个线程,一开始是select状,
当有信号的时候可以通过 可以通过多路复用(Multiplexing)技术传递给一个指定的线程池来处理请求,然
后原来的线程继续select状态。 最简单的多路复用技术可以通过java管道(Pipe)来实现。换句话说,如果
客户端的并发请求很大的时候,我们可以使用少于客户端并发请求的线程数来处理这些请求,而这些来不
及立即处理的请求会被阻塞在java管道或者队列里面,等待线程池的处理。请求 听起来很复杂,在这个架
构当道的java 世界里,现在已经有很多优秀的NIO的架构方便开发者使用,比如Grizzly,Apache Mina等
等,如果你对如何编写高性能的网络服务器有兴趣,你可以研读这些源代码。
简单说一下,在web服务器上阻塞IO(BIO)与NIO一个比较重要的不同是,我们使用BIO的时候往往会
为每一个web请求引入多线程,每个web请求一个单独的线程,所以并发量一旦上去了,线程数就上去
了,CPU就忙着线程切换,所以BIO不合适高吞吐量、高可伸缩的web服务器;而NIO则是使用单线程(单
个CPU)或者只使用少量的多线程(多CPU)来接受Socket,而由线程池来处理堵塞在pipe或者队列里的请
求.这样的话,只要OS可以接受TCP的连接,web服务器就可以处理该请求。大大提高了web服务器的可
伸缩性。
我们来看一下配置,你只需要在server.xml里把 HTTP Connector做如下更改,
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
改为
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443" />
然后启动服务器,你会看到org.apache.coyote.http11.Http11NioProtocol start的信息,表示NIO已经启动。其他的配置请参考官方配置文档。
Enjoy it.
最后贴上官方文档上对tomcat的三种Connector的方式做一个简单比较,
Java Blocking Connector Java Nio Blocking Connector APR Connector Classname Http11Protocol Http11NioProtocol Http11AprProtocol Tomcat Version 3.x 4.x 5.x 6.x 6.x 5.5.x 6.x Support Polling NO YES YES Polling Size N/A Unlimited - Restricted by mem Unlimited Read HTTP Request Blocking Blocking Blocking Read HTTP Body Blocking Blocking Blocking Write HTTP Response Blocking Blocking Blocking SSL Support Java SSL Java SSL OpenSSL SSL Handshake Blocking Non blocking Blocking Max Connections maxThreads See polling size See polling size
相关推荐
3. **NIO2连接器**:除了原有的BIO和NIO连接器,Tomcat 8.5添加了NIO2连接器,利用Java 7的异步I/O特性,提高了高并发场景下的性能。 4. **更好的错误处理**:提供了更清晰的错误页面和日志输出,便于开发者调试...
- **端口配置**:Tomcat默认使用8080端口,如果与其他应用冲突,需修改conf/server.xml中的Connector配置。 - **日志**:日志信息位于logs目录下,有助于调试和监控服务器状态。 - **应用部署**:将WAR文件放入...
1. **Servlet 3.0支持**:Tomcat 7引入了Servlet 3.0规范,允许开发者使用注解进行配置,简化了web.xml文件,同时提供了异步处理能力,提高了Web应用的响应速度。 2. **JSP 2.2支持**:这个版本支持JSP 2.2规范,...
5. **NIO与APR连接器**: Tomcat 9.0.27提供两种连接器选项,即Java NIO(非阻塞I/O)和Apache Portable Runtime (APR)。APR利用操作系统的原生库,可以提供更高的性能和并发性。 6. **管理工具**: 包括`manager`和`...
1. **Java Servlet 3.1支持**:Tomcat 8.0.x 支持最新的Servlet规范,允许开发者利用更强大的功能,如异步处理、更好的会话管理以及注解驱动的配置。 2. **JSP 2.3支持**:此版本包含了JSP 2.3规范,提供了新的...
最新版tomcat8.0,1.支持servlet3.1, jsp 2.3, el表达式3.0 and Java WebSocket 1.0. 2.默认http与ajp请求实现non-blocking技术,即NIO技术。 3.多个应用发布的时候可以先打成jar包,然后打成一个总的war发布。(这...
6. **启动与配置**:使用`bin`目录下的`startup.bat`和`shutdown.bat`脚本可以启动和关闭Tomcat服务器。`conf/server.xml`是主配置文件,可以在这里配置端口号、连接器、虚拟主机等。 7. **部署应用**:将WAR文件或...
1. **Servlet 3.0规范**:Tomcat 7引入了Servlet 3.0,带来了异步处理、注解配置等新特性,这在`javax.servlet`包中体现。 2. **WebSocket支持**:Tomcat 7开始支持WebSocket协议,允许双向通信,这在`org.apache....
1. **Servlet 3.0支持**:Tomcat 7.0支持Java Servlet 3.0规范,这意味着开发人员可以利用新的特性,如异步处理、注解配置和过滤器链定义等,使得代码更加简洁和高效。 2. **JSP 2.2支持**:与Servlet 3.0一起,...
1. **Java Servlet 3.0**:Tomcat 7引入了Servlet 3.0 API,提供了异步处理能力、注解配置和过滤器链的改进,使得开发者能更高效地管理Web应用程序。 2. **JSP 2.2**:支持JSP 2.2规范,带来了更强大的EL...
3. **NIO.2支持**:除了传统的BIO和NIO连接器外,Tomcat 8.5还引入了对Java NIO.2的支持,这提高了并发性能,特别是对于高流量网站。 4. **更好的安全性**:Tomcat 8.5包含了许多安全更新,如强化了默认的安全配置...
要开始使用这个版本的Tomcat,用户需要配置`conf/server.xml`文件,根据自己的需求调整服务器设置,然后可以在`webapps`目录下部署应用。启动Tomcat,可以通过`bin`目录下的脚本进行,例如在命令行输入`./catalina....
1. **Java Servlet 3.0**:这个版本引入了诸如异步处理、过滤器链和注解配置等增强功能,使得开发人员可以更灵活地编写Web应用程序。 2. **JSP 2.2**:JSP 2.2标准提供了更好的模板语言支持,增强了EL(Expression ...
6. **NIO和 APR连接器**:在Windows环境下,Tomcat支持两种连接器模式,即NIO(Non-blocking I/O)和APR(Apache Portable Runtime)。APR连接器利用操作系统的原生socket接口,通常能提供更好的性能。 7. **目录...
1. **Servlet 3.0支持**:Tomcat 7全面支持Servlet 3.0规范,这引入了诸如异步处理、注解配置、动态部署等功能,提高了Web应用的开发效率和性能。 2. **JSP 2.2支持**:它包含对JSP 2.2的实现,提供了更多的EL...
3. **NIO和APR连接器**:Tomcat 7.0.6包含了两种连接器实现,即NIO(非阻塞I/O)和APR(Apache Portable Runtime)。APR利用操作系统的原生I/O功能,以提高性能和可扩展性。 4. **更好的安全管理**:Tomcat 7提供了...
4. **NIO2异步处理**:Tomcat 9.0引入了Java NIO2 API,支持异步I/O操作,提高了服务器处理高并发请求的能力。 5. **更好的可扩展性**:Tomcat 9.0通过改进的插件系统和API提供了更好的可扩展性,允许开发者轻松地...
3. 启动和停止:通过bin目录下的startup.sh(Linux/Unix)或startup.bat(Windows)脚本启动Tomcat,使用shutdown.sh或shutdown.bat脚本停止服务。 4. 部署应用:将Web应用的WAR文件放入webapps目录下,Tomcat会自动...
它引入了NIO2(New I/O 2)选择器,提供了更好的异步I/O处理能力,这对于高并发的Web应用尤其有益。此外,还改进了线程池管理,以适应不同规模的应用需求。 在安全性方面,Tomcat 8加强了安全配置,例如,默认情况...
3. NIO2改进:Tomcat 8.5优化了网络I/O模型,支持Java 7的NIO2 API,提供更好的异步处理能力,提高了并发性能。 4. WebSocket升级:8.5版本对WebSocket进行了升级,支持JSR 356规范,增强了WebSocket应用程序的开发...