NIO系列1:框架拆解

原创 2012年04月01日 08:09:30

最近一年用NIO写了不少网络程序,也研究了一些开源NIO网络框架netty、mina等,总结了一下NIO的架构特点。

无论是netty还是mina它们都在java原生NIO的基础上进行了完善的封装,虽然细节有所不同,但总体架构思路一致,都大概划分出了以下几个组成部分:

- - transport:传输层的抽象

- - protocol: 协议codec的抽象

- - event model:统一事件模型

- - buffer:底层buffer封装

在完全屏蔽底层API的同时,对上层应用提供了自身的统一API接口。

框架进行黑盒封装的同时,再进行通用化的接口开放,带来的好处是统一化,但坏处是程序的透明度降低,抽象度提高,增加理解难度和实现难度。


下面说说每个部分的一些设计考量:

transport传输层抽象都是对java原生NIO API的封装,在这一层封装的程度在于框架的实现目标。例如mina立足于通用的网络框架,因此完全屏蔽了原生的API,提供了自身的统一接口,因为它不仅需要封装NIO的API还有一系列其他类型的IO操作的API,提供统一API接口。为了通用兼顾各类传输通道因此可能不得不暴露多余的API接口,使用方需甄别传输通道的不同,增加了理解难度。

protocol封装各类常用协议的codec操作,但目前这些网络框架的codec实现都与自身的API紧密绑定,降低了可重用性。

event model 事件模型的设计通常不能完全独立,例如java NIO本身的模型是事件驱动的,但传统阻塞型IO并非事件驱动,要兼顾二者通常要付出额外的代价和开销。

有一种说法是让异步IO同步化使用(因为同步化使用更简单,异步导致了业务处理的碎片化)到底对不对值得商榷?模型阻抗导致的代价和开销屏蔽在了黑盒中,也容易误导应用程序员对本该采用同步化处理的业务却滥用了异步化机制,并不会带来什么好处。

buffer 通常都用来配合底层IO数据流和协议codec使用,本身是否适合暴露给应用方取决于框架是否整合codec,因为codec本身带有业务性质,而纯粹的IO数据流处理使用的buffer则完全无需暴露给应用方。


以上简单说了下NIO框架各部分的设计考量,可以看出目前流行的NIO框架(netty和mina)都在走一条类似“瑞士军刀”的路线,集各种功能与一身(多种IO封装、协议封装),但你又很难把瑞士军刀上的某个刀片拆下来单独使用。

在实践中感觉,考虑从单一性、简洁性、重用性、组合性、透明性几个方面去设计原子化的IO组件也许更可取,更像是一种“工具箱”路线。


典型的事件驱动模型NIO框架组件交互图如下:


Acceptor:  负责监听连接事件负责接入

Processor:负责IO读写事件处理

EventDispatcher:负责事件派发

Handler:业务处理器

后面将通过一个系列文章来讨论一个原子化的NIO组件实现的细节及设计考量。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Java NIO框架(Java编程)

Java NIO框架MINA用netty性能和链接数、并发等压力测试参数好于mina1。NIO弥补了原来的I/O的不足,它再标准java代码中提供了高速和面向块的I/O原力的I/O库与NIO最重要的区...
  • xia0615
  • xia0615
  • 2011年03月03日 15:28
  • 12955

NIO框架------Netty

Netty: JOBSS提供的一个由java开发的高性能 异步事件驱动的NIO框架,该框架支持多路复用I/O,阻塞/非阻塞I/O以及同步I/O。 类似的还有MINA框架 重要的几个概念: 1.chan...
  • u011659172
  • u011659172
  • 2016年09月09日 09:55
  • 1229

Java NIO框架Netty简单使用

之前写了一篇文章:Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码),介绍了如何使用Java原生IO支持进行网络编程,本文介绍一种更为简单的方式,即Java NIO框架。 N...
  • anxpp
  • anxpp
  • 2016年08月03日 22:37
  • 7611

Java异步NIO框架Netty实现高性能高并发

1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨节点...
  • gaowenhui2008
  • gaowenhui2008
  • 2017年02月13日 09:33
  • 10183

关于Java的一些NIO框架的一点想法

闲着有点无聊想写点东西。 问题:生活中工作中,会有人问我javaNIO框架里面 Netty Mina  xSocket Grizzly 等等哪个比较好?   在这里写一下自己的感受,也算是...
  • shuyun123456789
  • shuyun123456789
  • 2017年01月09日 21:25
  • 758

Java NIO框架Netty教程(一) – Hello Netty

先啰嗦两句,如果你还不知道Netty是做什么的能做什么。那可以先简单的搜索了解一下。我只能说Netty是一个NIO的框架,可以用于开发分布式的Java程序。具体能做什么,各位可以尽量发挥想象。技术,是...
  • kobejayandy
  • kobejayandy
  • 2013年09月09日 22:05
  • 246014

关于NIO的那些事儿

本文简介:  JDK 1.4 中引入的新输入输出 (NIO) 库在标准 Java 代码中提供了高速的、面向块的 I/O。本实用教程从高级概念到底层的编程细节,非常详细地介绍了 NIO 库。您将学到诸如...
  • wang252949
  • wang252949
  • 2017年06月01日 14:37
  • 64

Java NIO笔记(第二弹:Java NIO三大基本组件详解)

Channel Channel是什么 Channel一般翻译为通道。Java NIO的通道类似流,但又有些不同: 既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。 通道...
  • lianjiww
  • lianjiww
  • 2016年12月10日 21:00
  • 1361

JAVA NIO学习笔记1 - 架构简介

最近项目中遇到不少NIO相关知识,之前对这块接触得较少,算是我的一个盲区,打算花点时间学习,简单做一点个人学习总结。 简介 NIO(New IO)是JDK1.4以后推出的全新IO API,...
  • huangfan322
  • huangfan322
  • 2016年11月18日 17:30
  • 467

异步和非阻塞一样吗? (内容涉及BIO,NIO,AIO,Netty)

写在开头:本文不是纯讲技术,会涉及概念理解和语义分析的要点。正如博主标题说的,高效的学习方法比拥有多少知识重要。高效的学习方法途径之一就是阅读理解,理解能力越好,掌握越快,知识体系更清晰。 如果刚...
  • matthew_zhang
  • matthew_zhang
  • 2017年05月07日 18:52
  • 1506
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NIO系列1:框架拆解
举报原因:
原因补充:

(最多只允许输入30个字)