[关闭]
@adamhand 2018-12-30T15:40:29.000000Z 字数 2564 阅读 711

Netty系列(1)--初识Netty


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函数有个好处就是它可以同时监听多个文件句柄,从而提高系统的并发性!

异步非阻塞IO:
在此种模式下,用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了。目前Java中还没有支持此种IO模型。

Netty相关概念和基本架构

Netty的核心组件包括以下几个部分:

Netty的基本架构如下图所示:




参考:

【面试题】Netty相关
为什么Netty受欢迎?
Netty入门教程2——动手搭建HttpServer
BIO、NIO和AIO的区别(简明版)
reactor和proactor模式
基本概念_同步、异步有什么区别
事件驱动机制跟消息驱动机制相比
Netty学习笔记之三——认识Netty架构
Netty4详解三:Netty架构设计
Netty整体架构


添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注