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的编解码和序列化

相关文章
|
4月前
|
存储 Java 数据处理
|
3月前
|
存储 编解码 移动开发
技术笔记:NIO流—理解Buffer、Channel概念和NIO的读写操作
技术笔记:NIO流—理解Buffer、Channel概念和NIO的读写操作
24 1
|
4月前
|
存储 监控 Java
深入探索Java语言的NIO(New I/O)技术
深入探索Java语言的NIO(New I/O)技术
|
网络协议 安全 Java
即时通讯技术文集(第9期):Java NIO和Netty入门系列 [共19篇]
为了更好地分类阅读52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第9 期。
213 0
即时通讯技术文集(第9期):Java NIO和Netty入门系列 [共19篇]
|
Java 人机交互
java nio之通道和Gather技术
学到这一步,就可以和操作系统的一些IO调用结合起来了。 感觉到设计系统和语言的人是多么的牛X。 能考虑到的细节是多么的复杂!
1686 0
|
2月前
|
Java 大数据
解析Java中的NIO与传统IO的区别与应用
解析Java中的NIO与传统IO的区别与应用
|
2月前
|
Java
Java中的NIO编程详解
Java中的NIO编程详解
|
2月前
|
Java 大数据
如何在Java中进行网络编程:Socket与NIO
如何在Java中进行网络编程:Socket与NIO
|
2月前
|
Java
Java中的NIO编程详解
Java中的NIO编程详解