Netty是个啥?简单来说就这!
作者 | @adamhand
来源 | 8rr.co/uBVt
上一篇:微软苏州集体抵制来自阿里、华为的跳槽者:请停止你的“奋斗逼”行为!网友:看到 955 不加班的公司名单,我酸了
Netty是什么
Netty 是一款异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端。
异步和同步
同步(Sync):所谓同步,就是线程发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作,而是等待可以调用。当可以调用之后,线程自行进行调用。
异步(Async):异步与同步相对,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。当这个调用完成后,一般通过状态、通知和回调来通知调用者。对于异步调用,调用的返回并不受调用者控制。
关注顶级架构师公众号回复“架构整洁”,送你一份惊喜礼包。
总结来说,同步和异步的区别大概有两个:
请求发出后,是否可以返回执行其他操作。 当可以进行调用时,同步情况是发起调用的线程自己去调用并得到结果,异步情况是内核将调用动作完成,将结果返回给调用线程。
事件驱动
一个典型的事件驱动的程序,就是一个死循环,并以一个线程的形式存在,这个死循环包括两个部分,第一个部分是按照一定的条件接收并选择一个要处理的事件,第二个部分就是事件的处理过程。程序的执行过程就是选择事件和处理事件,而当没有任何事件触发时,程序会因查询事件队列失败而进入睡眠状态,从而释放cpu。
也就是说,事件驱动就是有事件就处理,没时间就等待。
BIO、NIO和AIO的区别
事件分离器
在IO读写时,把 IO请求 与 读写操作 分离调配进行,需要用到事件分离器。根据处理机制的不同,事件分离器又分为:同步的Reactor和异步的Proactor。
Reactor模型:
应用程序在事件分离器注册 读就绪事件 和 读就绪事件处理器 事件分离器等待读就绪事件发生 读就绪事件发生,激活事件分离器,分离器调用 读就绪事件处理器(即:可以进行读操作了,开始读) 读事件处理器开始进行读操作,把读到的数据提供给程序使用
Proactor模型:
应用程序在事件分离器注册 读完成事件 和读完成事件处理器,并向操作系统发出异步读请求 事件分离器等待操作系统完成读取 在分离器等待过程中,操作系统利用并行的内核线程执行实际的读操作,并将结果数据存入用户自定义缓冲区,最后通知事件分离器读操作完成 事件分离器监听到 读完成事件 后,激活 读完成事件的处理器 读完成事件处理器 处理用户自定义缓冲区中的数据给应用程序使用
同步和异步的区别就在于 读 操作由谁完成:同步的Reactor是指程序发出读请求后,由分离器监听到可以进行读操作时(需要获得读操作条件)通知事件处理器进行读操作,异步的Proactor是指程序发出读请求后,操作系统立刻异步地进行读操作了,读完之后在通知分离器,分离器激活处理器直接取用已读到的数据。
同步阻塞IO(BIO):在此种方式下,用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,用户进程才能运行。JAVA传统的IO模型属于此种方式!
同步非阻塞IO(NIO):在此种方式下,用户进程发起一个IO操作以后边可返回做其它事情,但是用户进程需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的CPU资源浪费。其中目前JAVA的NIO就属于同步非阻塞IO。
异步阻塞IO(AIO):此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序,这其实就是同步和异步最关键的区别,同步必须等待或者主动的去询问IO是否完成,那么为什么说是阻塞的呢?因为此时是通过select系统调用来完成的,而select函数本身的实现方式是阻塞的,而采用select函数有个好处就是它可以同时监听多个文件句柄,从而提高系统的并发性!
关注顶级架构师公众号回复“Java”,送你一份惊喜礼包。
异步非阻塞IO:在此种模式下,用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了。目前Java中还没有支持此种IO模型。
Netty相关概念和基本架构
Netty的核心组件包括以下几个部分:
BootStrap和ServerBootstrap BootStrap通常称为引导类,提供一个用于应用程序网络层配置的容器。 Channel 底层网路传输API必须提供给应用I/O操作的接口,如读、写、连接、绑定等。它结构类似一个“Socket”。它有很多类似于socket的函数:bind、close、config、connect、isActive、isOpen、isWritable、read、write等等。 ChannelHandler Handle称之为处理器,支持很多协议,提供用于数据处理的容器。常用的一个接口是ChannelInboundHandler,这个类型可以处理入站事件(即外部应用连接到本应用的事件);反之有ChannelOutboundHandler接口,处理出站事件。业务逻辑经常在一个或多个ChannelInboundHandler中操作。 ChannelPipeline Netty的数据处理流程其实是一种责任链和拦截过滤器模式,ChannelPipeline 提供了一个链容器,该链包含一个或多个ChannelHandler ,并提供了一个API用于管理沿着链入站和出站事件的流动。 EventLoop EventLoop 用于处理 Channel 的 I/O操作。一个EventLoop可以处理多个Channel事件。而EventLoopGroup是一个Group,可以包括多个EventLoop。 ChannelFuture Netty是一种异步I/O模型,一个操作可能无法立即返回结果,所以它提供了ChannelFuture类,可以通过addListener添加监听器,操作完成时可以作出通知。
Netty的基本架构如下图所示:
架构师交流群
「顶级架构师」建立了读者架构师交流群,大家可以添加小编微信进行加群
扫描添加好友邀你进架构师群,加我时注明【姓名+公司+职位】
版权申明:内容来源网络,版权归原作者所有。如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。
猜你还想看
IDEA不愧为神器,结合Groovy脚本,简直无敌!
高并发:RocketMQ 削峰实战
记一次由Redis分布式锁造成的重大事故,避免以后踩坑!
如何轻松记住 Linux 命令
长按识别图片二维码关注,订阅更多精彩
顶级架构师,企业架构、系统架构、网站架构、大规模分布式架构、高可用架构等架构讨论,以及结合互联网技术的架构调整。欢迎有想法、乐于分享的架构师交流学习