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. lsof 命令 系统管理 系统监控

    lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件. 在终端下输入ls ...

  2. ASP.NET 5

    docs.asp.net installing on windows Choosing the Right .NET For You on the Server DotNetCore: DotNetC ...

  3. AndroidStudio第一个项目HelloWorld

    实验内容 在Android Studio中创建项目 创建并启动Android模拟器 项目的编译和运行 实验要求 在安装好的AndroidStudio上建立第一个工程 创建并启动Android模拟器 编 ...

  4. 十二、Java基础---------异常处理机制

    异常 异常 异常就是程序在运行时产生的异常情况. 异常的由来 问题也是现实生活中的具体事物,也可以通过java 类的形式进行描述,并封装成对象.异常就是java 对不正常情况进行描述后的对象的体现. ...

  5. innodb的表最大限制

    相信大多数人都不知道,innodb的表最大限制为64TB,但是why? Each space is divided into pages, normally 16 kib each (this can ...

  6. wex5 教程之 图文讲解 文件上传attachmentSimple(1)

    视频教程地址:http://v.youku.com/v_show/id_XMTc4NDAyMTY4OA==.html 效果预览: 1 调用attchmentSimple组件,打开文件管理器,并选中,显 ...

  7. 转 C# 装箱和拆箱[整理]

    1.      装箱和拆箱是一个抽象的概念 2.      装箱是将值类型转换为引用类型 :拆箱是将引用类型转换为值类型       利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的 ...

  8. WordPress实现登录或退出后直接跳转到首页的方法

    现在Wordpress是登录之后跳回到我们上次查看的页面,那么要如何修改它登录之后直接跳回到首页呢,这里就来给给大家详细介绍一下解决方法. 首先定位到登录链接所在位置,你会看到类似下面的代码: 复制代 ...

  9. java 中继承,组合,重载,重写的实现原理 (转)

    我们知道,继承,组合,重载,重写是java语言的面向对象实现的基本特征. 那么在java内部,究竟是如何实现这些面对对象的基本特征的呢? 继承和组合是面向对象中代码复用的主要实现方式,他们可以达到类似 ...

  10. asp.net 捕获throw

    <script type="text/javascript"> function pageLoad() { Sys.WebForms.PageRequestManage ...