IO有不少種,從最開始的Block IO,到nonblocking IO,再到IO多路複用和異步IO,一步一步的將IO的性能提高作到極致。java
今天咱們要介紹一下怎麼使用Tomcat Native來提高Tomcat IO的效率。linux
Tomcat中使用鏈接器來處理與外部客戶端的通訊。Connecter主要用來接受外部客戶端的請求,並轉交給處理引擎處理。web
在Tomcat中有兩種Connector。一種是 HTTP connector, 一種是AJP connector。shell
HTTP connector你們應該很好理解,它也是tomcat默認使用的鏈接器。apache
還有一個鏈接器叫作AJP,AJP主要是用來和web服務器進行通訊用的,由於AJP協議的速度要比HTTP的快,因此AJP除了用來和其餘webserver進行通訊以外,還能夠經過AJP來構建tomcat集羣。windows
這兩種方式都支持4中協議,分別是BIO,NIO,NIO2和APR。tomcat
#如下四種Connector實現都是直接處理來自客戶端Http請求 org.apache.coyote.http11.Http11Protocol : 支持HTTP/1.1 協議的鏈接器。 org.apache.coyote.http11.Http11NioProtocol : 支持HTTP/1.1 協議+New IO的鏈接器。 org.apache.coyote.http11.Http11Nio2Protocol : 支持HTTP/1.1 協議+New IO2的鏈接器。 org.apache.coyote.http11.Http11AprProtocol : 使用APR(Apache portable runtime)技術的鏈接器,利用Native #如下四種實現方法則是與web server打交道 org.apache.coyote.ajp.AjpProtocol:使用AJP協議的鏈接器,實現與web server(如Apache httpd)之間的通訊 org.apache.coyote.ajp.AjpNioProtocol:SJP協議+ New IO org.apache.coyote.ajp.AjpNio2Protocol:SJP協議+ New IO2 org.apache.coyote.ajp.AjpAprProtocol:AJP + APR
講下他們的區別,BIO就是block IO是最最基礎的IO方式, 咱們經過這樣來配置:服務器
<Connector port=」8080」 protocol=」HTTP/1.1」 maxThreads=」150」 connectionTimeout=」20000」 redirectPort=」8443」 />
Tomcat7如下版本在默認狀況下是以bio模式運行的。自Tomcat 8.5 版本開始,Tomcat就移除了對BIO的支持。網絡
New IO是基於java.nio包及其子包的一種IO方式。能提供非阻塞IO方式,比傳統的BIO擁有與更加高效的運行效率。dom
咱們這樣配置New IO:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443" />
New IO和New IO2有什麼區別呢?
New IO2是tomcat8中引入的IO方式,咱們能夠這樣配置:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol" connectionTimeout="20000" redirectPort="8443" />
apr這種方式就高級了,這個是咱們今天要講解的tomcat native的主要做用。
apr的全稱是Apache Portable Runtime,它是一個高度可移植的庫,它是Apache HTTP Server 2.x的核心。 APR有許多用途,包括訪問高級IO功能(例如sendfile,epoll和OpenSSL),操做系統級別的功能(生成隨機數,系統狀態等)和本機進程處理(共享內存,NT管道和Unix套接字)。
Tomcat能夠經過JNI的形式調用Apache HTTP服務器的核心動態連接庫來處理文件讀取或網絡傳輸操做,從而大大地提升Tomcat對靜態文件的處理性能。
經過使用APR咱們能夠得到以下的特性:
Tomcat Native是一個庫,經過這個庫,Tomcat可使用APR。
因此使用Tomcat Native的前提是須要安裝好APR library,OpenSSL和JDK。
咱們能夠經過下面的方式來安裝apr和openssl:
debian based linux系統:
apt-get install libapr1.0-dev libssl-dev
rpm based Linux 系統:
yum install apr-devel openssl-devel
在windows下面,tcnative是以一個dll的形式來提供的,咱們直接下載使用就能夠了。
可是在linux下面,由於平臺不一樣,因此在linux下面tcnative是須要自行編譯的。
通常來講咱們能夠在 bin/tomcat-native.tar.gz 找到tcnative的源碼包。將其解壓。
先運行configure命令:
./configure --with-apr=/usr/bin/apr-1-config \ --with-java-home=/home/jfclere/JAVA/jdk1.7.0_80/ \ --with-ssl=yes \ --prefix=$CATALINA_HOME
再進行make操做:
make && make install
生成的lib文件將會被放入$CATALINA_HOME/lib中。
安裝好tcnative以後,咱們就能夠在tomcat中使用APR了。
先檢查一下conf/server.xml中是否有下面的配置:
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
而後咱們須要修改 $CATALINA_HOME/bin/setenv.sh 將tc-native 的lib文件添加到LD_LIBRARY_PATH中。
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CATALINA_HOME/lib export LD_LIBRARY_PATH
最後添加APR的鏈接:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol" connectionTimeout="20000" redirectPort="8443" />
運行便可。
從日誌中,咱們會發現下面的內容:
org.apache.catalina.core.AprLifecycleListener init INFO: Loaded APR based Apache Tomcat Native library 1.x.y. org.apache.catalina.core.AprLifecycleListener init INFO: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true]. org.apache.coyote.http11.Http11AprProtocol init INFO: Initializing Coyote HTTP/1.1 on http-8080
說明APR安裝完畢而且已經在被使用了。
本文做者:flydean程序那些事本文連接:http://www.flydean.com/tomcat-native-startup/
本文來源:flydean的博客
歡迎關注個人公衆號:「程序那些事」最通俗的解讀,最深入的乾貨,最簡潔的教程,衆多你不知道的小技巧等你來發現!