(一)Netty源码学习笔记之概念解读
尊重原创,转载注明出处,原文地址:http://www.cnblogs.com/cishengchongyan/p/6121065.html
博主最近在做网络相关的项目,因此有契机学习netty,先是看各种的netty资料后来自己看源码,希望在此把自己的学习历程分享出来。因为我最初对netty的了解也仅限于知道它是一个优秀的网络框架,可以说是一无所知,想来想去就把这个文章系列起名《解开迷雾看netty》,也是我学习netty的真实写照。该系列的博文全部是基于Netty4。
初学者看优秀的开源代码时不知道是不是都有一个通病,就是非常迷茫,我最初在看netty时就是这种感觉,不知道从哪里下手,经常东看一点西看一点,往往形成不了连贯的思路。当我们按照一条主线看代码时也会有这样的问题,经常会因为主线两侧的内容把我们的思路带跑偏。因此,我对看源码的浅见是:一、不能乱看,沿一条主线看;二、过程中一定要及时的回归主线,否则很难形成连贯的思路。
在第一篇文章中我们首先先了解一下netty是什么以及netty中的成员,可以说是一道开胃菜,也是后面学习的基础。
套用Netty官网的一句话:Netty是一个异步的、事件驱动的网络应用框架,可以快速开发高性能的网络协议。下图是来自netty home的官方图:
从上图中可以看出,netty包含了三块:传输服务(方便我们快速开发出网络协议)、协议支持(支持了哪些现有的协议)和核心网络模型(底层核心实现)。
对于上图我们不做过多的描述,由于是学习和研究netty,所以我们的关注点也在Core上。众所周知,Netty底层是Nio以及Reactor模式,如果是小白可以先在我的另一篇博客NIO及Reactor模式中了解一下概念。
下面进入主题,我们先大概了解一下Netty和NIO中都有哪些重要的成员:
1.Channel(NIO):字面理解为“通道”,用于完成一个I/O请求,也可以理解为通信的载体。
2.Selector(NIO):选择器,也可被称为多路复用器,是实现非阻塞IO的关键。它类似于一个监听器,通过地调用select()或selectNow()可以得到目前有多少channel处于I/O就绪状态,通过调用selectedKeys()得到就绪状态的SelectionKey的集合,然后遍历这一集合便可得到所有就绪状态的SelectableChannel,进一步便可以做相应的操作。
3.Buffer(NIO):缓冲区,在NIO中数据的读写都是面向buffer的,可以理解为内存里开辟的一块临时保存数据的区域,而本质上就是一个数组,然后基于position、limit、capacity、address来操作这个数组。在netty中衍生出ChannelBuffer。
4.ChannelHandler(Netty):ChannelHandler负责与I/O无关的业务逻辑处理。可以处理或拦截ChannelInboundInvoker或ChannelOutboundInvoker操作,分别用于处理上行和下行的消息,并将其转发到ChannelPipeline中交给下一个ChannelHandler。
5.ChannelEvent(Netty):Netty是基于事件驱动的,ChannelEvent是事件(数据或者状态改变)载体,例如传输的数据对应MessageEvent,状态的改变对应ChannelStateEvent。当对Channel进行操作时,会产生一个ChannelEvent,并发送到ChannelPipeline。ChannelPipeline会选择一个ChannelHandler进行处理。这个ChannelHandler处理之后,可能会产生新的ChannelEvent,并流转到下一个ChannelHandler。
6.ChannelPipeline(Netty):Pipeline的中文含义是“管道”,传输途径。也就是说在ChannelPipeline控制ChannelEvent事件分发和传递,流转到ChannelHandler中进行处理。ChannelPipeline包含两条线路:Upstream和Downstream,分别对应上行和下行的通信。
7.ChannelFuture(Netty):在Netty中所有的I/O操作都是异步的,因此我们总是得不到最终实际的I/O结果,而是得到ChannelFuture,它会包含一些I/O执行状态的结果。ChannelFuture往往配合监听器使用,在其中注册一个监听器,当操作执行成功或失败时监听会自动触发,相当于一个回调。
8.EventLoop(Netty):Netty中的线程池模型,后面会详细介绍,下一篇将会先从boss线程和worker线程说起。
(一)Netty源码学习笔记之概念解读的更多相关文章
- (二)Netty源码学习笔记之服务端启动
尊重原创,转载注明出处,原文地址:http://www.cnblogs.com/cishengchongyan/p/6129971.html 本文将不会对netty中每个点分类讲解,而是一个服务端启 ...
- (三)Netty源码学习笔记之boss线程处理流程
尊重原创,转载注明出处,原文地址:http://www.cnblogs.com/cishengchongyan/p/6160194.html 本文我们将先从NioEventLoop开始来学习服务端的 ...
- Netty源码学习笔记
1.ByteBuf
- RocketMQ 源码学习笔记————Producer 是怎么将消息发送至 Broker 的?
目录 RocketMQ 源码学习笔记----Producer 是怎么将消息发送至 Broker 的? 前言 项目结构 rocketmq-client 模块 DefaultMQProducerTest ...
- RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的?
目录 RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的? 前言 项目结构 rocketmq-client 模块 DefaultMQProducerTest Roc ...
- Spring 源码学习笔记10——Spring AOP
Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...
- Spring 源码学习笔记11——Spring事务
Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...
- 【Netty源码学习】DefaultChannelPipeline(三)
上一篇博客中[Netty源码学习]ChannelPipeline(二)我们介绍了接口ChannelPipeline的提供的方法,接下来我们分析一下其实现类DefaultChannelPipeline具 ...
- 【Netty源码学习】ChannelPipeline(一)
ChannelPipeline类似于一个管道,管道中存放的是一系列对读取数据进行业务操作的ChannelHandler. 1.ChannelPipeline的结构图: 在之前的博客[Netty源码学习 ...
随机推荐
- win10使用技巧之如何打出偏僻字母
一.背景 有时需要在打出一些希腊字母,诸如ɛ.μ等字符,如果输入法不支持该怎么办呢?在很多国产拼音软件中,都会提供扩展方便用户寻找这类字符,但是如果用户换过一款软件,可能要在一定时间找到这些字符就没那 ...
- 一些常用的git指令
PyCharm编辑器 如何切换分支 git branch 查看当前在哪个分支,也会显示本地所有的分支名 git branch dev-chenqiao 新建分支 git checkout dev-ch ...
- 小猪cms微信二次开发之怎样分页
$db=D('Classify'); $zid=$db->where(array('id'=>$this->_GET('fid'),'token'=>$this->tok ...
- EasyUI 解决 datagrid 中 NumberBox 限制小数位数后不能输入小数点问题
初始化界面,发现编辑datagrid,不能输入小数点. var arrColumnsCNT = [[ { title: '毛重', field: 'GrossWeight', halign: 'cen ...
- js比较版本号
比较版本v2.2.3和2.1.15大小 //假定字符串的每节数都在5位以下 function toNum(a){ var a=a.toString(); //也可以这样写 var c=a.split( ...
- 论php数组合并
注:尽量不要在循环中操作数据库. 1.两个一维数组合并成一个一维数组 $a = array('morning','afternoon','night'); $b = array('breakfast' ...
- W3Help-兼容性-知识库
http://www.w3help.org/zh-cn/kb/ clear:none/left/right/both/inherit该特性表明元素框的哪一边不可以和先前的浮动框相邻.'clear' 特 ...
- Servlet使用注解标注监听器(Listener)
Servlet3.0提供@WebListener注解将一个实现了特定监听器接口的类定义为监听器,这样我们在web应用中使用监听器时,也不再需要在web.xml文件中配置监听器的相关描述信息了. 下面我 ...
- thinkphp模型
1.获取系统常量信息的方法:在控制器DengLuController里面下写入下面的方法,然后调用该方法. public function test() { //echo "这是测试的&qu ...
- vim(vi)常用操作及记忆方法
vi(vim)可以说是linux中用得最多的工具了,不管你配置服务也好,写脚本也好,总会用到它.但是,vim作为一个“纯字符”模式下的工具,它的操作和WINDOWS中的文本编辑工具相比多少有些复杂.这 ...