APR通道是Tomcat比较有特色的通道,在早期的JDK的NIO框架不成熟的时候,因为java的网络包的低效,Tomcat使用APR开源项目做网络IO,这样有效的缓解了java语言的不足,提供了一个高性能的直接通过jni接口进行底层IO通信内存使用的这么一个通道。
但是,当JDK的后续版本推出之后,JDK的网络底层库的性能也上来了,各种先进的IO模型,线程模型和APR开源项目几乎不相上下,这个时候,经常会出现一种测试场景是,加上APR通道之后并没有太多的实质提升,这是可以理解的,但是JDK中的SSL信道的性能至少从目前的角度来看,和APR通道基于openssl的引擎信道实现,还有不小的差距,因为SSL协议中定义的握手协议,交互次数比较多,而openssl项目经历多年,性能极为高效,因此从目前的Tomcat的APR通道来看,主推的就是这个SSL/TLS协议的高效支持:
除了上述的1,2两点,对于FIPS 140-2,中文名:美国联邦信息处理标准。外文名:Federal Information Processing Standard。根据FIPS 140-2,密码模块为“硬件(Hardware)、软件(Software)、和/或固件(Firmware)的集合,它们实现了经过经认可的安全功能(包括密码算法和密钥生成),并包括在一定的密码系统边界(Boundary)之内。整体来说,FIPS 140-2是一个高标准定义的密码安全的认证,这个被openssl所支持,而因为APR连接器使用了openssl。

看一下tomcatAPR通道中的架构图:


1.APR通道
从上图中可以看到,对于Connector通道总共有几种通道,BIO是阻塞式的通道,NIO是利用高性能的linux(windows也有)的poll或者epoll模型,APR通道就是本文中讲的内容,对于目前的JDK还支持NIO2的通道,关于这些通道的概况,我们可以从下图中进行详细查看:

这张图就是这几个通道的区别,对于APR来讲,SSL Support区别最大,使用的是openssl作为SSL的信道支持,另外从IO模型角度来看,对于Http请求头的读取,SSL握手因为调用的JNI也是阻塞的,这个是与NIO和NIO2的差距,但是从SSL信道的支持上用的是高效的openssl。
因此,如果从这个角度去分析,上面的一些测试场景得出结论就很容易解释得通。

简单看看APR通道的代码,其依然有APREndpoint,可以看到其中的组件:

依然有Acceptor接收线程池,Poller轮询,Worker工作线程池,这些和其它通道的架构区别不大,重要的是其关于socket调用和SSL的握手等内容。
看一下Acceptor中的socket接收:

直接调用的就是native;
对于SSL握手也是一样,可以看一下APREndpoint中的SSLContext的创建:

SSLContext上下文都在底层,对于java这块仅仅返回一个值是告诉是否创建成功或者一些标识吗:


到这里为止,我们可以对APR通道做一个总结,APR通道和其它的通道结构差不太多,也是几个线程池组件共同起作用,只不过因为调用方式的不同在阻塞和非阻塞上和其它几个通道有区别,对于socket建立,SSL信道建立都是调用下层的native包来做的。

2.Tomcat-Native
tomcat中对于这些jni的调用部分,做出了一个tomcat的子项目,叫做Tomcat-native,在这个调用层级中,一部分是java部分,也就是上述AprEndpoint中看到的native方法:

这些java的包,对应调用的就是jni的native的C的代码,是 一一对应的:

我们可以看看Tomcat-native发布目录的组成:
对于tomcat-native最好的教程应该是example目录中,这个目录使用一个例子完整的复现了Tomcat前端APREndpoint的几个线程组件的工作模式;对于test目录也可以从这个点切入进去,是一个好的调试tomcat-native代码的过程。

3.APR高性能网络库
tomcat-native项目,可以说是作为一个集成包,有点类似于TomEE对于JAVA EE规范的集成,它集成的内容一个是openssl,这个是ssl信道的实现,另外一个是高性能的apr网络库。
APR高性能网络库是什么?

Apache Portable Runtime (APR) project,这个库定位于在操作系统的底层封装出一层抽象的高性能库,在于屏蔽掉操作系统的差异。可以分析出来,APR相当于JDK的一个角色了,只不过它关注的大多在网络IO相关的这块:

以一个IO多路复用的例子为例:

从这个角度上来讲,没有提供windows的多路复用的技术,这点是一个遗憾,可以从Unix系统中的几种常见的IO多路复用模型上看到,epoll,poll,select,甚至freebsd中的kqueue都有,从这个角度来讲,APR支持的还算可以。
对于lock的部分也是一样:

对于更多的系统环境都进行了支持。

总结一下,APR提供了对于底层高性能的网络IO的处理,可以解决Tomcat早期网络IO低效的问题。

4.openssl库
tomcat-native除了调用APR网络库保证高性能的网络传输以外,对于SSL/TLS的支持还调用了openssl。

对于OpenSSL项目来说,选择市面上大多数的SSL信道实现都是用OpenSSL做的,这也就是说,如果要OpenSSL暴露出一个漏洞出来,那破坏性都是惊人的。

openssl目录结构合代码流程很清晰,这里就不再缀余了。


总结:
APR通道很小的一部分是java,大部分的源码都是C的,而且和操作系统的环境有这密切的关系,不同操作系统定制的接口不同,性能特色也不同

















































h.APR通道是个怎么回事的更多相关文章

  1. m.Tomcat使用openssl走APR通道配置单向和双向认证

    引用自: http://blog.csdn.net/gtuu0123/article/details/5827800(Tomcat的SSL单向认证)  http://blog.csdn.net/gtu ...

  2. k.APR通道特殊配置

    APR/native specific configuration The following attributes are specific to the APR/native connector. ...

  3. j.APR连接器整体框图(含SSL实现分析)

    APR连接器的思路和bio,nio的整体架构也是类似的,可以看到下面的整体框图: 第一个区别是,对于从Acceptor线程中的socket解析这块,无论是nio还是bio都是在Acceptor线程内直 ...

  4. e.Tomcat中的sendfile支持

    sendfile实质是linux系统中一项优化技术,用以发送文件和网络通信时,减少用户态空间与磁盘倒换数据,而直接在内核级做数据拷贝,这项技术是linux2.4之后就有的,现在已经很普遍的用在了C的网 ...

  5. OPENCV直方图与匹配

    直方图可以用来描述不同的参数和事物,如物体的色彩分布,物体的边缘梯度模版以及目标位置的当前假设的概率分布. 直方图就是对数据进行统计的一种方法,并且将统计值定义到一系列定义好的bin(组距)中,获得一 ...

  6. stm32 DMA数据搬运 [操作寄存器+库函数](转)

    源:stm32 DMA数据搬运 [操作寄存器+库函数]        DMA(Direct Memory Access)常译为“存储器直接存取”.早在Intel的8086平台上就有了DMA应用了.   ...

  7. 嵌入式 视频编码(H264)

    这几天在编写视频录制模块,所以,闲暇之余,又粗粗的整理了一下,主要是API,以备不时之用    摄像头获取的模拟信号通过经芯片处理(我们使用的是CX25825),将模拟信号转成数字信号,产生标准的IT ...

  8. 论文笔记(2):Deep Crisp Boundaries: From Boundaries to Higher-level Tasks

    ---------------------------------------------------------------------------------------------------- ...

  9. 应用栈解决迷宫问题的C语言实现

    题目来自于严蔚敏<数据结构>,参考伪代码实现的程序: #include <stdio.h> #include <malloc.h> //记录通道块在迷宫矩阵当中的横 ...

随机推荐

  1. 配置maven仓库

    1.安装完,配置好环境变量 mvn -v 检查是否成功 mvn install 会将项目生成的构件安装到本地maven仓库 2.settings.xml文件配置: 1)修改本地仓库位置 maven_h ...

  2. mysql 三种恢复方式

    为了保障数据的安全,需要定期对数据进行备份.备份的方式有很多种,效果也不一样.一旦数据库中的数据出现了错误,就需要使用备份好的数据进行还原恢复.从而将损失降到最低.下面我们来了解一下MySQL常见的有 ...

  3. windows在cmd执行svn 命令

    1. 使用svn 命令行工具. 找到http://www.visualsvn.com/downloads/ 下载Apache Subversion command line tools,这是一个可以在 ...

  4. JSP中的指令(Directive)

  5. iOS UITableView 移除单元格选中时的高亮状态

    在处理UITableView表格时,我们希望用户能够和触摸单元格式进行交互,但是希望用户在完成交互之后,这些单元格的选中状态能够消失,.Cocoa Touch 提供了两种方法来防止单元格背持久选中. ...

  6. Asp.net 2.0 无刷新图片上传 显示缩略图 具体实现

    简单三步实现图片无刷新上传:注意是上传,至于上传时的验证,比如图片的尺寸,大小,格式判断.限制等,自行解决. 兼容性想还不错:FF,CH,IE,猎豹,都是可以实现的.如果看到回显.当然就是成功了. 经 ...

  7. [caffe]linux下安装caffe(无cuda)以及python接口

    昨天在mac上折腾了一天都没有安装成功,晚上在mac上装了一个ParallelDesktop虚拟机,然后装了linux,十分钟就安装好了,我也是醉了=.= 主要过程稍微记录一下: 1.安装BLAS s ...

  8. core animation (转)

    iOS Core Animation 简明系列教程 看到无数的CA教程,都非常的难懂,各种事务各种图层关系看的人头大.自己就想用通俗的语言翻译给大家听,尽可能准确表达,如果哪里有问题,请您指出我会尽快 ...

  9. maven参考文章推荐

    maven依赖.聚合.继承.版本管理:https://my.oschina.net/u/204498/blog/545724 maven profile : http://elim.iteye.com ...

  10. hibernate的二级缓存

    缓存(Cache): 计算机领域非常通用的概念.它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写永久性数据存储源的频率,从而提高应用的运行性能.缓存中的数 ...