0
点赞
收藏
分享

微信扫一扫

01-netty概览


1 netty基础备忘

1.1 什么是netty?

netty是一个非阻塞i/o客户端-服务器框架,主要用于开发java网络应用程序,入协议服务器和客户端.异步事件驱动的网络应用程序框架和工具用于简化网络编程,例如TCP和UDP套接字服务器.Netty最初由JBoss开发,现在由Netty项目社区开发和维护。
* Better throughput, lower latency
* less resource consumption
* Minimized unnecessary memory copy

1.2 什么是NIO?

NIO全称是NoneBlocking IO,非阻塞IO;阻塞主要体现在:

  • Accept–>阻塞; 只有新连接来了Accept才返回;
  • Read–>阻塞; 只有请求消息来了,Read才能返回,子线程才能继续处理其他工作;
  • Write–>阻塞; 只有客户端把消息收了,Write才会返回,才能处理下一个请求!

netty基于事件驱动的机制,把一个线程的accep\读写操作,全部完成.Netty提供了一些列生命周期回调接口,当一个完整的请求到达时,当一个连接关闭时,当一个连接建立时,用户都会收到回调事件,然后进行逻辑处理。

2 NIO与BIO的区别?

01-netty概览_netty

01-netty概览_netty_02

正常客户端处理数据的过程分为两步

  • 1 建立连接后,接收客户端发送的全部数据;
  • 2 服务端处理完请求后返回response给客户端;

在BIO中,等待客户端发数据这个过程是阻塞的,这样就造成了一个线程只能处理一个请求的情况,而机器能支持的最大线程数是有限的,这就是为什么BIO不能支持高并发的原因。而NIO中,当一个Socket建立好之后,Thread并不会阻塞去接受这个Socket,而是将这个请求交给Selector,Selector会不断的去遍历所有的Socket,一旦有一个Socket建立完成,他会通知Thread,然后Thread处理完数据再返回给客户端——这个过程是不阻塞的,这样就能让一个Thread处理更多的请求了。

3 netty的最小化拷贝?

01-netty概览_netty_03


01-netty概览_客户端_04

netty接收数据时,直接从堆内存开辟一块内存,数据从io读到内存,并通过ByteBuf进行直接操作,相对于传统应用,先复制到socket缓冲区,再复制到内存减少了不必要的拷贝,加快了传输速度!

4 netty的数据流概述

01-netty概览_netty_05

  • Channel,表示一个连接,可以理解为每一个请求,就是一个Channel。
  • ChannelHandler,核心处理业务就在这里,用于处理业务请求。
  • ChannelHandlerContext,用于传输业务数据。
  • ChannelPipeline,用于保存处理过程需要用到的ChannelHandler和ChannelHandlerContext。


举报

相关推荐

0 条评论