天天看點

Tomcat 連接配接器Connector 的三種運作模式 Bio、Nio、Apr

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:

[root@localhost ~]# yum -y install apr apr-devel      

安裝native:

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

在/etc/profile中加入:

export CATALINA_OPTS=-Djava.library.path=/usr/local/apr/lib
[root@localhost 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
[root@localhost ~] source /etc/profile      

修改server.xml

<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
               connectionTimeout="20000"      
可以看到處理器是apr
12-Oct-2020 15:18:09.475 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-apr-8080"]