NIO技术讨论-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

NIO技术讨论

简介:

1 2015-11-01 NIO讨论

2 Java原生NIO类库

2.1 BIO的问题

InputStream的读取和写入问题

2.2 引入NIO,基本示例

基本概念:

  • Channel
  • Buffer

Channel实现类:

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

Buffer实现类:

  • ByteBuffer
  • CharBuffer
  • DoubleBuffer
  • LongBuffer

Channel和Buffer的关系

Buffer原理介绍

  • capacity,position和limit工作原理
  • rewind()方法
  • clear()与compact()方法
  • mark()与reset()方法

2.3 Socket类库

  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel
  • Selector
  • SelectorProvider,用于提供Selector实现,而自身靠系统属性或者SPI机制来加载

要学会的案例:

  • 1 不使用Selector的情况下,非阻塞式的socket编程
  • 2 使用Selector的情况下,socket的无阻塞式编程(有了前者才能更好的体会出Selector的好)

ZooKeeper中就是使用的原生的NIO Socket类库来实现NIO通讯,展示:

ZooKeeper NIO通讯

ZooKeeper NIO通讯

2.4 BIO NIO AIO简单对比总结

3 Reactor线程模型

3.1 传统BIO模型

传统BIO模型

3.2 Reactor单线程模型

Reactor单线程模型

3.3 Reactor多线程模型

Reactor多线程模型

3.4 Reactor主从多线程模型

Reactor主从多线程模型

4 Netty使用案例及源码分析

主要讲解这篇文章Netty系列之Netty线程模型

  • 1 每一个NioEventLoop:包含一个线程和一个Selector selector复用器

    因此一个NioEventLoop就可以处理很多链路,每个链路的读写操作全部交给这一个线程来处理,避免了并发操作同一个链路的可能性

    NioEventLoop处理

  • 2 每当有一个新的客户端接入,则从NioEventLoop线程组中顺序获取一个可用的NioEventLoop,当到达数组上限之后,重新返回到0,通 过这种方式,可以基本保证各个NioEventLoop的负载均衡。一个客户端连接只注册到一个NioEventLoop上,这样就避免了多个IO线程去 并发操作它

5 网络通信问题

  • tcp粘包以及封包和拆包,见经典tcp粘包分析,对于此问题常见的解决办法,使用固定的消息长度、使用分隔符、使用固定长度的Header和Body组合
  • 使用固定的Header和Body组合来定制自己的协议,如dubbo协议

    dubbo协议

  • 编解码问题和序列化问题

    • 使用固定长度的消息
    • 使用分隔符
    • 使用固定长度的Header加Body的形式

编解码需要处理半包问题,而序列化则不用关心,序列化专注于byte数组和对象之间的相互转化

在dubbo中,编解码器用于处理Header部分,序列化框架用于处理Body部分

dubbo的编解码和序列化

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章