文档章节

Mina源码阅读笔记(一)-整体解读

Gaischen
 Gaischen
发布于 2012/11/19 20:25
字数 1043
阅读 21618
收藏 173

今天的这一节,将从整体上对mina的源代码进行把握,网上已经有好多关于mina源码的阅读笔记,但好多都是列举了一下每个接口或者类的方法。我倒是想从mina源码的结构和功能上对这个框架进行剖析。源码的阅读一般有如下几种方法:第一,根据问题读源码,这种方法可能用的最多,哪里有问题了,然后F3一步步点进去;第二种,专门为了读源码而读,从整体到局部,总用法到设计。第三种,可是根据软件的设计特点,根据特点逐一解读。这几篇文章主要将根据第三种方法进行阅读,因为mina的各个模块很有条理,而且我关注的重点也主要分布在几个核心点上,对我来说,这样的读法更合理。

Apache MINA is a network application framework which helps users develop high performance and high scalability network applications easily. It provides an abstract ·event-driven · asynchronous API over various transports such as TCP/IP and UDP/IP via Java NIO.


写过NIO的人都知道,NIO里主要有那么几部分,用于内容切换的各类缓冲区,当然我们印象最深的就是ByteBuffer;用于IO服务直接连通的通道Channel,这里有用于文件和网络的通道;有用于实现NIO socket Reactor模式的选择器selector;和处理字符集的Charset。而mina就是将这几部分有机的整合,实现了这个高性能的框架。

在看代码之前,我们要先了解mina到底为我们提供了什么,我按照源码的结构整理如下:

用于缓冲区的IoBuffer

org.apache.mina.core.buffer

用于提供连接的service

org.apache.mina.core.service

org.apache.mina.transport.*

用于提供两端状态的session

org.apache.mina.core.session

用于拦截所有IO事件和请求的filter chain和各类拦截器(在IoServiceIoHandler之间)

org.apache.mina.core.filterchain

org.apache.mina.filter.*

用于处理IO事件的handler

org.apache.mina.handler.*

用于实现异步IO操作的 future

org.apache.mina.core.future

用于实现IO轮询的的polling

org.apache.mina.core.polling

用于实现代理的proxy

org.apache.mina.proxy.*


至此,mina-core-2.0.7中的代码大致就可以分成上述这几类了。而我们对源码的浏览也会按照这几部分逐一进行。

在开始阅读代码之前,我们再熟悉一下mina在通信时会做的事情,这样的事情不是徒劳的,对过程理解的越透彻对代码的分析也会越深刻,我们不但要学习代码里的设计模式和组织结构,更要去理解里面的实现逻辑。没装UML的工具,就拿PPT画了:

这里的变现没有像之前mina通信那篇文章里一样,描述具体的编码和解码过程,这个图主要描述了两端对接的过程,是一个宏观上的通信过程:

1、  图中的一对应的是service执行的过程,首先肯定是要建立连接,对于服务端是Accept,客户端则是connect

2、  图中的二,指的是在每次连接之后就会产生一个记录通信信息的session,我们看mina官方的描述:every time a client connects to the server, a new session is created, and will be kept in memory until the client is disconnected.

3、  图中的三指的是过滤器链,这里主要实现我们对通信的要求,比如编码、解码、日志等。

4、  图中的四是Handler,是filter chain的最后一步,通过adapter接入了session的整个生命周期。

服务器端反之亦然。

上面的图示mina官方给出的,表述的同一个意思。在IoHandler这里mina是这么给出描述的: The interface is hub of all activities done at the end of the Filter Chain.

分析清楚了整个代码的体系,后面开始,我们就可以针对每一个部分详细分析了。我们会从最基本的缓冲区开始,这部分相对比较独立,之后会根据连接过程进行一步步分析。后面的一篇,我会从IoBuffer开始写起。

© 著作权归作者所有

Gaischen

Gaischen

粉丝 829
博文 55
码字总数 73789
作品 1
杭州
架构师
私信 提问
加载中

评论(19)

edcSam
edcSam
it is really cool.
futur2099
futur2099
我想问下博主是在什么环境下阅读MINA的源码的啊,怎么把源码部署到myeclipse里啊?
Gaischen
Gaischen 博主

引用来自“jiangjianming”的评论

刚开始看mina
第2张图看起来有点误导呢?不知道我的理解对不对
1.iohandler是属于mina的一部分,还是不属于呢?如果是的话,iohandle怎么没在mina的那个大括号范围内

handler更接近于应用层了,主要负责应用层的业务处理了,这张图是来自官方的。filter是mina的一个过滤器是mina的一部分,但是你也可以接入你的业务。

j
jiangjianming
刚开始看mina
第2张图看起来有点误导呢?不知道我的理解对不对
1.iohandler是属于mina的一部分,还是不属于呢?如果是的话,iohandle怎么没在mina的那个大括号范围内
拾忆
拾忆
不错,我接着看。
工匠驿站
工匠驿站
对这块非常感兴趣,先学习,嘿嘿,
Gaischen
Gaischen 博主

引用来自“公子扶苏”的评论

第一次知道这个东西。。。要学的东西好多啊~~压力很大啊

框架多的学不完 等到你用到的时候再回过来看就行了 这种 通信的框架 如果是做web的也不太用的到
公子扶苏
公子扶苏
第一次知道这个东西。。。要学的东西好多啊~~压力很大啊
Gaischen
Gaischen 博主

引用来自“Eric_sun”的评论

项目中有用到,很想深入理解,楼主再接再厉.

嗯 可以看看 我之前写的那些有关mina的 文章 可能会有点儿帮助的
Eric_sun
Eric_sun
项目中有用到,很想深入理解,楼主再接再厉.
Kafka.network包源码解读

最近阅读了kafka network包的源码,主要是想了解下kafka底层通信的一些细节,这部分都是用NIO实现的,并且用的是最基本的NIO实现模板,代码阅读起来也比较简单。抛开zookeeper这部分的通信不...

Gaischen
2013/01/15
0
0
dubbo源码学习笔记----整体结构

dubbo核心包 config dubbo-config-api dubbo-config-spring remoting dubbo-remoting-netty dubbo-remoting-netty4 dubbo-remoting-mina dubbo-remoting-grizzly dubbo-remoting-p2p dubbo-......

春哥大魔王的博客
2018/01/13
0
0
Mina源码阅读笔记(二)- IoBuffer的封装

上一篇《整体解读》的延续。。 在阅读IoBuffer源码之前,我们先看Mina对IoBuffer的描述:A byte buffer used by MINA applications. This is a replacement for ByteBuffer. 这是一个对ByteB...

Gaischen
2012/11/20
0
16
NIO.2特性总结(一)灵活的Path

NIO.2,More New I/O APIs for the Java Platform。 技术发展实在太快,NIO都没弄透,java7中的NIO2又要开始进入我们的程序,优化系统的性能了。最近在看《PRO Java 7 NIO.2》CSDN上有下载,...

Gaischen
2012/12/01
0
3
Mina源码阅读笔记(三)-Mina的连接IoAccpetor

接着上篇《IoBuffer的封装》. 其实在mina的源码中,IoService可以总结成五部分service责任、Processor线程处理、handler处理器、接收器和连接器,分别对应着IoService、IoProcessor、IoHandl...

Gaischen
2012/11/21
0
7

没有更多内容

加载失败,请刷新页面

加载更多

python虚拟环境 virtualenv

python虚拟环境 virtualenv virtualenv为Python项目创建虚拟环境,让不同的项目使用不同的环境,不会产生影响。 virtualenvwrapper是对virtualenv的封装,使用更方便。 安装 pip3 install v...

xiaobai1315
5分钟前
0
0
网络安全-->浅谈UDP协议

简介 UDP-传输控制协议 三大特点: 1、无连接的 2、不可靠的 3、面向数据报 基于UDP的网络协议 1、NFS:网络文件协议 2、TFTP:简单文件传输协议 3、DHCP:动态主机配置...

qrainly
9分钟前
0
0
在进行远程桌面时,经常锁屏怎么解决?

  想要在远程电脑的时候不出现锁屏的现象,首先,你需要将远程电脑设置为允许远程连接。在远程电脑上,打开“设置” 并选择“系统”>“关于”。记下电脑名称。稍后将需要使用此名称。然后,...

takethelas
12分钟前
0
0
小猿圈java之数组

基本数据结构中,数组是很重要的,这篇小猿圈加加对数组详解一席,具体使用,在学习过程中有困惑的朋友,可以看一下加加的这篇文章,看到就是赚到,让我们一起看看吧。 一、数组的基本使用 ...

小猿圈加加
13分钟前
0
0
如何基于日志,同步实现数据的一致性和实时抽取?

7月25日晚8点,线上直播,【AI中台——智能聊天机器人平台】,点击了解详情。 一、背景 事情是从公司前段时间的需求说起,大家知道宜信是一家金融科技公司,我们的很多数据与标准互联网企业不...

宜信技术学院
22分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部