点击上方“方志朋”,选择“设为星标”

回复”666“获取新整理的面试文章

本文来源:http://8rr.co/uBVt

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的核心组件包括以下几个部分:

  • 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的基本架构如下图所示:

热门内容:
BeanUtils 是用 Spring 的还是 Apache 的好?因用了Insert into select语句,美女同事被开除了!
我们已经不用AOP做操作日志了!Spring Boot+JWT+Shiro+MyBatisPlus 实现 RESTful 快速开发后端脚手架
MyBatis动态SQL(认真看看, 以后写SQL就爽多了)最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡

Netty是个啥?简单来说就这!相关推荐

  1. 使用Netty实现的一个简单HTTP服务器

    为什么80%的码农都做不了架构师?>>>    使用Netty实现的一个简单HTTP服务器 1.HttpServer,Http服务启动类,用于初始化各种线程和通道 public cl ...

  2. 让Netty入门变得简单

    让Netty入门变得简单 https://mp.weixin.qq.com/s/MBnbLmCmFJo0QK9WNwXrXQ 如果先启动nettyClient就不会有nettyServer输出了: p ...

  3. 1 根文件系统 简单来说,(根文件系统)

    1 根文件系统 简单来说,(根文件系统)就是系统第一个mount的文件系统 Filesystem Handling Like every   traditional   Unix   system,  ...

  4. nailwl(吴磊)地方论坛推广总结的简单来说

    地方论坛推广总结的简单来说,我们将要分为两大类; 第一类:分为线上 第二类:分为线下(做地方论坛的都知道这点,但是真的懂得运用起来的不多) 线上手段良多,线下花样繁杂. 地方论坛效果又可分为两类; 第 ...

  5. JavaScript 进阶 31 -- 简单来说下vue.js 数据监测observe的实现的原理

    这篇文章是接上一篇继续来总结一下关于数据监测 observer 实现响应式的原理. 响应式的原理: 只要要数据发生改变,页面视图就发生变化 简单来说 就是一个方法,里面使用for in循环,分别为对象 ...

  6. Netty之实现一个简单的群聊系统

    要求 编写一个 Netty 群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞) 实现多人群聊 服务器端:可以监测用户上线,离线,并实现消息转发功能 客户端:通过channel可以无阻塞发送消息 ...

  7. Netty学习笔记(六) 简单的聊天室功能之WebSocket客户端开发实例

    在之前的Netty相关学习笔记中,学习了如何去实现聊天室的服务段,这里我们来实现聊天室的客户端,聊天室的客户端使用的是Html5和WebSocket实现,下面我们继续学习. 创建客户端 接着第五个笔记 ...

  8. Netty实现长连接简单例子

    Netty实现长连接的简单例子 服务端 NettyServerBootstrap提供长连接服务 public class NettyServerBootstrap {private static fi ...

  9. Netty实例:实现简单的通讯功能

    文章目录 1. Netty工作模型 2. 通讯实例 2.1 引入依赖 2.2 Server Handler 2.3 Server 2.4 Client Handler 2.5 Client 3. 测试 ...

最新文章

  1. python面向对象(part1)--类和对象
  2. 面向对象软件开发代码结构(1)
  3. UILabel常用属性
  4. 删除链表中绝对值相等的结点(C++)
  5. 可以用AppleWatch解鎖iPhone
  6. html4 form日期,bootstrap4日期时间选择器插件
  7. sudo apt-get:command not found报错解决
  8. Tomcat6.0 管理器配置
  9. mseed读取[2]
  10. linux 多线程计算pi,单/多线程计算测试:SuperPI/国际象棋_IntelCPU_CPUCPU评测-中关村在线...
  11. roller for little vGL
  12. CSDN企业账户用户手册操作文档
  13. html5吻胸小游戏,html5气球大战小游戏代码
  14. java需要数学_学java要数学好嘛?
  15. Matlab plot3显示成平面图像
  16. java计算机毕业设计网上书城网站源码+系统+数据库+lw文档+mybatis+运行部署
  17. 计算机二级关于ppt背景音乐,计算机二级考试真题-PPT-校摄影社团优秀作品展
  18. oracle修改表的owner,Oracle中改变表的Owner和tablespace
  19. php程序员的情书,2018浪漫七夕:7款程序员必备表白源码(超炫酷)
  20. 从道通诉大疆一案看美国337调查中的国内实业原则

热门文章

  1. Python:线程之定位与销毁
  2. 异步使用委托delegate --- BeginInvoke和EndInvoke方法
  3. 【单调栈 前缀和 异或】7.21序列求和
  4. Vue2.0使用vue-cli脚手架搭建
  5. 将Eclipse代码导入到AndroidStudio的两种方式
  6. git phpstorm 配置
  7. java web 开发应用 ----过滤器
  8. C++ STL的sort 函数 以及自定义的比较函数
  9. 韩宇:如何准备天池深度学习比赛?
  10. 【青少年编程】【答疑】控制Scratch异步代码的执行顺序