阿狸先森|异步事件驱动的网络应用程序框架:Netty(DotNetty)原理解析
一、背景介绍DotNetty是微软的Azure团队 , 使用C#实现的Netty的版本发布 。 不但使用了C#和.Net平台的技术特点 , 并且保留了Netty原来绝大部分的编程接口 。 让我们在使用时 , 完全可以依照Netty官方的教程来学习和使用DotNetty应用程序 。
Netty是一个异步事件驱动的网络应用程序框架 , 用于快速开发可维护的高性能协议服务器和客户端 。
二、NIO他并不是Java独有的概念 , NIO代表的一个词汇叫着IO多路复用 。 它是由操作系统提供的系统调用 , 早期这个操作系统调用的名字是select , 但是性能低下 , 后来渐渐演化成了Linux下的epoll和Mac里的kqueue 。 我们一般就说是epoll , 因为没有人拿苹果电脑作为服务器使用对外提供服务 。 而Netty就是基于JavaNIO技术封装的一套框架 。 为什么要封装 , 因为原生的JavaNIO使用起来没那么方便 , 而且还有臭名昭著的bug , Netty把它封装之后 , 提供了一个易于操作的使用模式和接口 , 用户使用起来也就便捷多了 。
说NIO之前先说一下BIO(BlockingIO),如何理解这个Blocking呢?
3.传统的BIO模式下 , 从头到尾的所有线程都是阻塞的 , 这些线程就干等着 , 占用系统的资源 , 什么事也不干 。
Netty的非阻塞I/O的实现关键是基于I/O复用模型 , 这里用Selector对象表示:
3.线程通常将非阻塞IO的空闲时间用于在其他通道上执行IO操作 , 所以单独的线程可以管理多个输入和输出通道 。
4.由于读写操作都是非阻塞的 , 这就可以充分提升IO线程的运行效率 , 避免由于频繁I/O阻塞导致的线程挂起 。
5.一个I/O线程可以并发处理N个客户端连接和读写操作 , 这从根本上解决了传统同步阻塞I/O一连接一线程模型 , 架构的性能、弹性伸缩能力和可靠性都得到了极大的提升 。
基于Buffer传统的I/O是面向字节流或字符流的 , 以流式的方式顺序地从一个Stream中读取一个或多个字节,因此也就不能随意改变读取指针的位置 。
在NIO中 , 抛弃了传统的I/O流 , 而是引入了Channel和Buffer的概念 。 在NIO中 , 只能从Channel中读取数据到Buffer中或将数据从Buffer中写入到Channel 。
基于Buffer操作不像传统IO的顺序操作 , NIO中可以随意地读取任意位置的数据 。
事件驱动模型通常 , 我们设计一个事件处理模型的程序有两种思路:
1.轮询方式 , 线程不断轮询访问相关事件发生源有没有发生事件 , 有发生事件就调用事件处理逻辑 。 2.事件驱动方式 , 发生事件 , 主线程把事件放入事件队列 , 在另外线程不断循环消费事件列表中的事件 , 调用事件对应的处理逻辑处理事件 。 事件驱动方式也被称为消息通知方式 , 其实是设计模式中观察者模式的思路 。事件机制 , 它可以用一个线程把Accept , 读写操作 , 请求处理的逻辑全干了 。 如果什么事都没得做 , 它也不会死循环 , 它会将线程休眠起来 , 直到下一个事件来了再继续干活 , 这样的一个线程称之为NIO线程 。 用伪代码表示:
推荐阅读
- 阿狸先森|现今如何了?,被联想198亿元收购的巨头摩托罗拉
- 小胖先森|或是华米第一款联名手表?,华米预热新品
- 小胖先森|Hero 9 Black运动相机曝光,GoPro
- 阿狸先森|是时候跟百度网盘的龟速下载说拜拜了
- 三好先森|比华为还“头疼”巨头出现!美国猝不及防:“先进”得不像中企?
- 阿狸先森|真的很华为,终将闪亮归来!郭平就华为海思发声
- 辛先森科技说|五年时间会否变天?,华为与中兴的终极PK
- 阿狸先森|原因很简单,网友:太明智了,华为代言人突然从吴亦凡换成胡歌
- |Java异步任务优化CompletionService
- 阿狸先森|未来光刻机或将毫无用武之地?华为太厉害了,华为云手机若能突破