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. JMeter学习-020-JMeter 监听器之【聚合报告】错误率、吞吐量、传输速率实例计算

    上文 对聚合报告的结果字段进行了概要的讲述释义,同时对吞吐量.传输速率.分位数等进行了详细的阐述,此文针对上文中描述的吞吐量及传输速率的计算进行详细的实例计算演示. 多不闲述,直入主题! 实际操作步骤 ...

  2. 弱引用?强引用?未持有?额滴神啊-- Swift 引用计数指导

    ARC ARC 苹果版本的自动内存管理的编译时间特性.它代表了自动引用计数(Automatic Reference Counting).也就是对于一个对象来说,只有在引用计数为0的情况下内存才会被释放 ...

  3. leetcode_222 Count Complete Tree Nodes

    题目: Given a complete binary tree, count the number of nodes. Definition of a complete binary tree fr ...

  4. C# App.config文件配置数据的读写

    添加程序集引用  System.configuration.dll 和命名空间 using System.Configuration; 读: ConfigurationManager.AppSetti ...

  5. SQL复制一个表的数据到另一个表

    最近做一个项目,由于客户数据量大,为了不将数据彻底删除,于是将数据移动到历史表,原始表的数据删除.由于技术有限,想不到好的方法,于是写个存储过程 执行,为了防止执行过程中出现异常,执行不完整.用到hI ...

  6. 25条提高iOS app性能的方法和技巧

    以下这些技巧分为三个不同那个的级别---基础,中级,高级. 基础 这些技巧你要总是想着实现在你开发的App中. 1. 用ARC去管理内存(Use ARC to Manage Memory) 2.适当的 ...

  7. web工程目录结构

    /WEB-INF/web.xml Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则. /WEB-INF/classes/包含了站点所有用的 class 文件,包括 ser ...

  8. php Windows系统 wamp集成环境下redis的使用

    先说一下我的本地环境,使用的是wamp集成环境,(Apache 2.4.9.PHP 5.5.12.MySQL 5.6.17) windows下安装PHP扩展: 第一步:找到扩展文件(.dll),htt ...

  9. 关于treeview手动添加的方法

    1.首先判断有没有父节点,有父节点的,NEW一个父节点然后增加:没有父节点就选当前的节点 treeView2.Nodes.Add(newChildNode); 2.父节点的判断可以用leveL来判断 ...

  10. Posix消息队列

    转载于:http://blog.csdn.net/zx714311728/article/details/53197196 1.消息队列 消息队列可以认为是一个消息链表,消息队列是随内核持续的.队列中 ...