NIO
文章平均质量分 79
iter_zc
关注互联网架构方向
展开
-
Netty5源码分析(一) -- 服务器绑定过程分析
Netty5的类层次结构相比于之前版本有了很大的变化,我准备写一系列文章来分析Netty5的源码。这篇讲讲服务器绑定的过程。一个典型的Netty5服务器端代码如下,首先需要提供两个EventLoopGroup线程池,在随后的文章中会分析Netty的线程模型,这里只需要知道两个线程池,bossGroup是用来接受客户端TCP连接,workGroup是用来处理IO事件。然后指定采用何种Ch原创 2014-09-17 22:22:22 · 5175 阅读 · 2 评论 -
从ZooKeeper源代码看如何实现分布式系统(三)高性能的网络编程
对网络编程来说,最基本的三要素是IO, 协议(编解码),服务器端线程模型。这篇来看看ZooKeeper是如何实现高性能的网络程序。IO模型ZooKeeper默认提供了两种网络IO的实现,一个是Java原生的NIO,一个是基于Netty的IO。先从ServerCnxn这个抽象类看起,它表示一个从客户端到服务器端的网络连接。ServerCnxn实现了Stat服务器端统计接口,Watch原创 2016-01-11 17:35:42 · 4292 阅读 · 0 评论 -
《Netty权威指南》私有协议开发的可运行源代码分享
之前看了《Netty权威指南》一书,第14章用整个章节介绍了如何设计和实现一个简单的私有协议,内容很好,但是作者提供的代码片段有很多错误,根本不可能正确编译。比如MarshallingEncoder这个类是Netty提供了JBoss Marshalling的一个适配类,它的encode方法是protected,不是public,并且其中用到的ChannelBufferByteOutput类是原创 2014-09-16 14:53:17 · 8539 阅读 · 17 评论 -
Netty的几个要点
Netty是一个传输层的框架,主要的功能就是两个:封装了NIO的操作,封装了CodeC接口,从而使得NIO的开发者只需要关注与业务功能本身的ChannelHandler。不只是Netty,传输层主要解决的问题就是这两个,处理IO,处理CodeCCodeC主要处理的问题就是字节流的分帧(Frame),一般有以下几种按结束符,比如http定长使用消息头消息体的方式,在消原创 2014-09-16 15:26:58 · 3778 阅读 · 2 评论 -
NIO的写操作分析
很多人对NIO的写操作理解的不深,不知道为什么要注册写事件,何时注册写事件,为什么写完之后要取消注册写事件。Selector.isWriteable()方法监控的是内核的写缓冲器是否可写,所以除非内核的写缓冲区满了,否则一旦一个SocketChannel注册了写事件,每次selector都会选中这个SocketChannel,进入到isWriteable()分支中去。实际上原创 2014-09-15 12:46:07 · 4893 阅读 · 0 评论 -
Netty5源码分析(八) -- 总结
这个系列通过七篇文章,结合Netty5的原代码1. 分析了服务器绑定端口的过程,从整体上可以看到Netty执行的流程和主要组件2. 分析了Netty的线程模型,解析了Reactor模式。很多人都不理解这块,被EventLoop的名称和复杂的类层次所迷惑3. 通过比较使用Java原生的NIO API来编程的流程,再分析了Netty是如何把这些基本流程封装地,进一步地理清了Netty的封装原创 2014-09-23 10:34:05 · 3204 阅读 · 0 评论 -
Netty5源码分析(七) -- 异步执行Future和Promise
java.util.concurrent.Future是Java提供的接口,表示异步执行的状态,Future的get方法会判断任务是否执行完成,如果完成就返回结果,否则阻塞线程,直到任务完成。// Java FutureTask.get()public V get() throws InterruptedException, ExecutionException { i原创 2014-09-23 09:42:20 · 8805 阅读 · 0 评论 -
Netty5源码分析(六) -- CodeC编解码分析
Netty5的CodeC编解码对以往的版本进行了简化,没有单独的Encoder / Decoder接口,都继承了ChannelHandlerApdater类,来实现ChannelHandler接口。对Decoder来说,主要有两个顶层的抽象类,一个是从字节流到消息的ByteToMessageDecoder,一个是中间消息到业务消息的MessageToMessageDecoder。B原创 2014-09-22 17:45:59 · 5199 阅读 · 0 评论 -
Netty5源码分析(五) -- ByteBuf缓冲区
Netty的ByteBuf缓冲区实现地比Java本身的ByteBuffer更加灵活,方便。它的类结构也比较复杂,这里只说ByteBuf核心的几个要点。1. 最重要的是要理解为什么要ByteBuf这个组件。主要还是因为基于select / poll / epoll这种IO多路复用技术的NIO是非阻塞同步IO的模型,由于是同步IO,需要用户线程自己来处理IO的读写,由于是非阻塞的,每次调用原创 2014-09-22 16:31:21 · 5602 阅读 · 0 评论 -
Netty5源码分析(四) -- 事件分发模型
所谓Netty5的事件分发模型,主要指的是ChannelPipline, ChannelHandlerContext, ChannelHandler, Unsafe ChannelHandlerInvoker这几个核心接口之间的交互模型。首先是ChannelPipline接口,它是Netty中事件分发的路径。每个Channel都会绑定一个ChannelPipeline来分发事件。p原创 2014-09-22 12:26:50 · 4083 阅读 · 0 评论 -
Netty5源码分析(三) -- Channel如何注册OP_ACCEPT, OP_READ, OP_WRITE
抛开Netty,一个典型的Java NIO服务端开发需要做几件事:1. 创建ServerSocketChannel,设置为非阻塞,并绑定端口2. 创建Selector对象3. 给ServerSocketChannel注册SelectionKey.OP_ACCEPT事件4. 启动一个线程循环,调用Selector的select方法来检查IO就绪事件,一旦有IO就绪事件,就通知用原创 2014-09-19 11:44:43 · 9060 阅读 · 0 评论 -
Netty5源码分析(二) -- 线程模型分析
线程模型是Netty的核心设计,设计地很巧妙,之前项目中有一块处理并发的设计和Netty的Eventloop单线程设计类似,效果得到了实证。Netty5的类层次结构和之前的版本变化很大,网上也有很多文章写Netty的线程模型,Reactor模式,比如这篇http://blog.csdn.net/xiaolang85/article/details/37873059, 应该是引自《Net原创 2014-09-18 18:11:02 · 6062 阅读 · 0 评论 -
深入理解非阻塞同步IO和非阻塞异步IO
这篇文章分析了Linux下的5种IO模型 http://blog.csdn.net/hguisu/article/details/7453390很多人对阻塞 / 非阻塞, 同步 / 异步 的概念理解的不深入,搞不清楚非阻塞和异步IO的区别,笼统的认为非阻塞IO就是异步IO。其实区别很大,编程模型完全不同。阻塞 / 非阻塞描述的是函数,指访问某个函数时是否会阻塞线程(bl原创 2014-09-15 13:45:05 · 19725 阅读 · 8 评论