IO有很多种形态,从最早的Block IO,到 Nonblocking IO,再到 IO 多路复用和异步 IO,整个演进过程都在不断提升系统的并发能力与处理性能。

今天我们就来详细介绍,如何通过使用 Tomcat Native 来提升 Tomcat IO 性能与请求处理效率。
Tomcat的连接方式Tomcat 通过连接器来处理与外部客户端之间的通信。Connector 的主要作用是接收客户端请求,并将请求转交给内部处理引擎继续处理。
在 Tomcat 中主要有两种 Connector:一种是 HTTP Connector,另一种是 AJP Connector。
HTTP Connector 比较容易理解,它也是 Tomcat 默认使用的连接器类型。
另一个连接器叫做 AJP。AJP 主要用于与 Web 服务器进行通信,因为 AJP 协议在某些场景下速度比 HTTP 更快,所以它除了可以和其他 Web Server 通信之外,也常用于构建 Tomcat 集群。
这两种方式都支持4种协议,分别是 BIO、NIO、NIO2 和 APR。
#以下四种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 模式,我们可以通过下面的方式进行配置:
protocol=”HTTP/1.1”
maxThreads=”150”
connectionTimeout=”20000”
redirectPort=”8443” />Tomcat 7 以下版本默认通常以 BIO 模式运行。从 Tomcat 8.5 开始,Tomcat 已经移除了对 BIO 的支持。
New IO 是基于 java.nio 包及其子包实现的一种 IO 模式,能够提供非阻塞 IO,相比传统 BIO 往往具备更高的运行效率和更好的并发处理能力。
我们可以这样配置 New IO:
connectionTimeout="20000"
redirectPort="8443" />那么 New IO 和 New IO2 又有什么区别呢?
New IO2 是 Tomcat 8 中引入的 IO 方式,我们可以这样配置:
connectionTimeout="20000"
redirectPort="8443" />至于 APR,这种方式就更高级一些,也是我们今天重点讲解的 Tomcat Native 在提升 Tomcat 性能方面的核心作用。
APR和Tomcat NativeAPR 的全称是 Apache Portable Runtime。它是一个高度可移植的底层库,同时也是 Apache HTTP Server 2.x 的核心组件之一。APR 的应用范围非常广,既包括访问高级 IO 功能,如 sendfile、epoll 和 OpenSSL,也包括操作系统级别的功能,例如生成随机数、获取系统状态,以及本机进程处理能力,如共享内存、NT 管道和 Unix 套接字等。
Tomcat 可以通过 JNI 的方式调用 Apache HTTP 服务器的核心动态链接库来处理文件读取和网络传输操作,从而显著提升 Tomcat 对静态资源和网络 IO 的处理性能。
通过使用 APR,我们通常可以获得如下特性:
- Non-blocking I/O和请求连接保持。
- 支持OpenSSL和TLS/SSL。
Tomcat Native 本质上是一个库,借助这个库,Tomcat 才能够使用 APR 能力。
因此,使用 Tomcat Native 的前提条件是提前安装好 APR library、OpenSSL 以及 JDK。
我们可以通过下面的方式来安装 apr 和 openssl:
debian based linux系统:
apt-get install libapr1.0-dev libssl-devrpm based Linux 系统:
yum install apr-devel openssl-devel在 Windows 环境下,tcnative 通常以一个 dll 文件的形式提供,我们直接下载安装即可使用。
但在 Linux 环境下,由于平台差异,tcnative 往往需要自行编译安装。
一般来说,我们可以在 bin/tomcat-native.tar.gz 中找到 tcnative 的源码包,并将其解压。
首先运行 configure 命令:
./configure --with-apr=/usr/bin/apr-1-config
--with-ja va-home=/home/jfclere/JA VA/jdk1.7.0_80/
--with-ssl=yes
--prefix=$CATALINA_HOME然后执行 make 操作:
make && make install生成的 lib 文件会被放到 $CATALINA_HOME/lib 目录中。
在tomcat中使用APR安装好 tcnative 之后,我们就可以在 Tomcat 中正式启用 APR 了。
首先检查 conf/server.xml 中是否存在如下配置:
然后我们需要修改 $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 对应的连接器配置:
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 已经安装成功,并且当前已经被 Tomcat 正常加载和使用。
本文链接:https://www.flydean.com/tomcat-native-startup/
