欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Tomcat 连接器Connector 的三种运行模式 Bio、Nio、Apr

程序员文章站 2024-03-25 14:26:52
...

Tomcat 连接器Connector 的三种运行模式 Bio、Nio、Apr

一、Connector


在Tomcat架构中,Connector主要负责处理与客户端的通信。Connector的实例用于监听端口,接受来自客户端的请求并将请求转交给Engine处理。同时将来自Engine的答复返回给客户端。

Connector的种类

Tomcat源码中与connector相关的类位于org.apache.coyote包中,Connector分为以下几类:

  1. Http Connector, 基于HTTP协议,负责建立HTTP连接。它又分为BIO Http Connector与NIO Http Connector两种,后者提供非阻塞IO与长连接Comet支持。默认情况下,Tomcat使用的就是这个Connector。
  2. AJP Connector, 基于AJP协议,AJP是专门设计用来为tomcat与http服务器之间通信专门定制的协议,能提供较高的通信速度和效率。如与Apache服务器集成时,采用这个协议。
  3. APR HTTP Connector, 用C实现,通过JNI调用的。主要提升对静态资源(如HTML、图片、CSS、JS等)的访问性能。现在这个库已独立出来可用在任何项目中。Tomcat在配置APR之后性能非常强劲。

tomcat中实现了以下几种Connector:

#以下三种Connector实现都是直接处理来自客户端Http请求

  • org.apache.coyote.http11.Http11Protocol : 支持HTTP/1.1 协议的连接器。
  • org.apache.coyote.http11.Http11NioProtocol : 支持HTTP/1.1 协议+New IO的连接器。
  • org.apache.coyote.http11.Http11AprProtocol : 使用APR(Apache portable runtime)技术的连接器,利用Nativ


#以下三种实现方法则是与web server打交道

  • org.apache.coyote.ajp.AjpProtocol:使用AJP协议的连接器,实现与web server(如Apache httpd)之间的通信
  • org.apache.coyote.ajp.AjpNioProtocol:SJP协议+ New IO
  • org.apache.coyote.ajp.AjpAprProtocol:AJP + APR

 

二、Tomcat Connector的三种运行模式: bio nio apr 


Tomcat 连接器Connector 的三种运行模式 Bio、Nio、Apr

1、bio(blocking I/O)
即阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包)。是基于JAVA的HTTP/1.1连接器,Tomcat7以下版本在默认情况下 是以bio模式运行的。一般而言,bio模式是三种运行模式中性能最低的一种(一个线程只处理一个请求)。自Tomcat 8.5 版本开始,Tomcat就移除了对BIO的支持;

(bio(blocking I/O,阻塞式I/O操作),表示Tomcat使用的是传统的Java I/O操作(即Java.io包及其子包)。 默认的模式,性能最差,没有经过任何优化处理和支持。)

server.xml配置:

<Connector  port=”8080”  
protocol=”HTTP/1.1”
  
maxThreads=”150”  
connectionTimeout=”20000”   
redirectPort=”8443” />

 2、nio(new I/O)

为了提高I/O性能,JDK自1.4版本引入了NIO模式,它弥补了原来BIO方式的不足,在标准的java代码中提供了高速、面向块的I/O。 通过定义包含数据的类以及以块的形式处理数据,NIO可以在不编写本地代码的情况下利用底层优化,这是BIO所无法做到的; NIO模式 是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,它拥有比传统I/O操作(bio)更好的并发运行性能。要让Tomcat以nio模式来运行比较简单,只需要在Tomcat安装目录/conf/server.xml文件中将如下配置:

server.xml配置:

# protocol属性值改为org.apache.coyote.http11.Http11NioProtocol即可:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443" />

在tomcat8中有最新的nio2,速度更快,也建议使用nio2,nio2连接器需要tomcat8.0以上才有,修改conf目录下的server.xml

<!-- HTTP1.1连接器 tmocat8以上默认使用NIO,7及以下默认BIO -->
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
<!-- 修改protocol属性使用NIO2 -->
<Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
               connectionTimeout="20000"
               redirectPort="8443" />

<!-- AJP1.3连接器 tmocat8以上默认使用NIO,7及以下默认BIO -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<!-- 修改protocol属性使用NIO2 -->
<Connector port="8009" protocol="org.apache.coyote.ajp.AjpNio2Protocol" redirectPort="8443" />


20-Oct-2020 10:50:02.533 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio2-8080"]
20-Oct-2020 10:50:02.551 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio2-8009"]

 3、apr

apr(Apache Portable Runtime/Apache可移植运行时库),Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能。从操作系统级别来解决异步的IO问题,大幅度的提高性能。 Tomcat apr也是在Tomcat上运行高并发应用的首选模式。

要让Tomcat以apr模式来运行,必须安装apr和native

安装apr:

[aaa@qq.com ~]# yum -y install apr apr-devel

安装native:

[aaa@qq.com ~]# cd /usr/local/tomcat/bin/
[aaa@qq.com bin]# tar xf tomcat-native.tar.gz 
[aaa@qq.com tomcat-native-1.2.10-src]# cd native/
[aaa@qq.com native]# ./configure --with-apr=/usr/bin/apr-1-config 
[aaa@qq.com native]# make && make install

在/etc/profile中加入:

export CATALINA_OPTS=-Djava.library.path=/usr/local/apr/lib
[aaa@qq.com native]# ls /usr/local/apr/lib 
libtcnative-1.a   libtcnative-1.so    libtcnative-1.so.0.2.10
libtcnative-1.la  libtcnative-1.so.0  pkgconfig
[aaa@qq.com ~] source /etc/profile

修改server.xml

<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
               connectionTimeout="20000"

重启tomcat查看日志

可以看到处理器是apr
12-Oct-2020 15:18:09.475 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-apr-8080"]

如果做了动静分离就没有需要使用这个,因为静态分离了给了nginx,apr库是tomcat扩展移植库,可以提高静态文件的处理性能

(做了动静分离就不需要该模式了,用nio就行了) 

相关标签: tomcat