Netty介绍及实战(一)

一、Netty到底是什么?什么是多路复用?什么叫做零拷贝?

Netty是一个NIO客户端服务器框架,可以快速、轻松地开发协议服务器和客户端等网络应用程序。它极大地简化和简化了网络编程,避免了程序本身去处理断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常码流等操作,也避免了程序直接对NIO的操作。使我们更加专注于业务的实现。

二、性能方面有哪些优势

1.更高的吞吐量,更低的延迟
2.减少资源消耗
3.最小化不必要的内存拷贝

三 、IO与NIO的区别

step1.首先我们了解一下什么是阻塞和非阻塞

阻塞:阻塞的例子包括RPC和web service的调用。

非阻塞:包含非阻塞的队列和非阻塞模式的websocket,还有一些非阻塞模式的数据库等。

我们根据上图(左)可以看到:阻塞模式是一个线程发出请求后,阻塞等待调用结果。

上图(右):当一个线程发出请求后,不需要等待返回结果,可以再次发送请求。

step2.我们接下来看一个网络模型示意图:

我们有一个线程池去管理线程和不同的客户端进行通信,其中有两个线程在阻塞状态,一个线程在传输状态,当第四个客户端连接的时候,我们发现没有线程可以用了,我们把他放在队列里面,当第五个线程来了,发现队列也满了,那么我们就只能丢弃这个客户端的连接了。

那么我们传统的网络模式有哪些有劣势呢?

优点:因为线程是阻塞的,直到整条请求发送完毕,我们不需要处理报文的粘包、拆包等。

缺点:频繁的上下文切换 , cpu消耗过高。如果线程过多的话,会导致内存使用过高。

四 、多路复用与零拷贝

step1.我们看一下阻塞io和非阻塞io的工作模式

图左:一个线程对应一个socket连接。

图右: 一个线程对应不同的buffer,然后再通过buffer和socket channel建立连接。

step2:什么是零拷贝?

上图1,2: 可以看到,如果我们想要发送/接收一个报文,首先需要把内核数据拷贝到缓冲区里面,再进行操作

上图3: 可以看到线程直接去读取内核的数据,这样就减少了内核到buffer的拷贝操作,直接操作堆外内存。

为什么非要操作堆外内存呢?这里画个重点

1.操作系统并不感知jvm堆内存,而且jvm的内存布局与操作系统分配的不一致,所以操作系统不会直接操作jvm堆内存来处理数据

2.我们知道jvm有着强大的GC机制,这也就意味着同一个对象的内存地址会随时发生变化。由于JNI(java native interface) 在调用IO操作的C语言的类库时,规定写入时地址不能失效,所以我们无法直接使用jvm堆内存。

step3:什么是多路复用?

释义:多路指的是多个socket连接,复用指的是复用同一个线程。

上图可以看到,我们利用一个线程select去管理不同的channel,只有当channel中有读写操作,才真正调用ready的channel去进行实际的IO操作。

那多路复用模型的优势时什么呢?

IO多路复用使得我们只需要建立一个线程去维护客户端不同的请求(channel),不需要为每一个channel创建一个独立的线程,大大降低了系统的资源开销。

下一篇文章会和大家分享,传统的NIO架构和我们Netty的架构的区别,本文如有错误,欢迎大家批评指出。

Netty介绍及实战(二)之IO与NIO和多路复用与零拷贝相关推荐

  1. Netty介绍与实战(三)之粘包拆包

    一.传统NIO架构 step1. 我们传统的nio架构已经解决了多路复用,零拷贝等问题,已经十分优秀了,那为什么我们现在Netty如此火热呢? 1) 首先他使用简单,基本上都是模板化,我们可以更专注业 ...

  2. STM32之震动传感器、继电器介绍及实战

    目录 一.震动传感器介绍及实战 二.编程代码实现 1.gpio.c---------初始化GPIO口引脚函数 2.编写中断服务函数 3.用外部中断共用入口函数,来调用外部中断处理回调函数 4.编写外部 ...

  3. netty如何实现零拷贝

    根据 Wiki 对 Zero-copy 的定义: "Zero-copy" describes computer operations in which the CPU does n ...

  4. (七)Netty与零拷贝

    零拷贝基本介绍 零拷贝是网络编程的关键,很多性能优化都离不开 在Java程序中,常用的零拷贝有mmap(内存映射)和sendFile.那么,他们在OS里,到底是怎么样一个涉及?我们分析mmap和sen ...

  5. Netty中ByteBuf 的零拷贝

    转载:https://www.jianshu.com/p/1d1fa2fe1ed9 此文章已同步发布在我的 segmentfault 专栏. 根据 Wiki 对 Zero-copy 的定义: &quo ...

  6. 对于 Netty ByteBuf 的零拷贝(Zero Copy) 的理解

    根据 Wiki 对 Zero-copy 的定义: "Zero-copy" describes computer operations in which the CPU does n ...

  7. 彻底搞懂Netty高性能之零拷贝

    作为Java网络编程学习者,不仅要知道NIO,还一定要学习Mina和Netty这两个优秀的网络框架.作为上一篇NIO效率高的原理之零拷贝与直接内存映射的补充,本文将针对Netty的零拷贝特性进行详细分 ...

  8. AIBlockChain:“知名博主独家讲授”人工智能创新应用竞赛【精选实战作品】之《基于计算机视觉、自然语言处理、区块链和爬虫技术的智能会议系统》软件系统案例的界面简介、功能介绍分享之二、会中智能

    AI&BlockChain:"知名博主独家讲授"人工智能创新应用竞赛[精选实战作品]之<基于计算机视觉.自然语言处理.区块链和爬虫技术的智能会议系统>软件系统案 ...

  9. Netty网络编程实战3,使用Netty远程传输文件

    目录 一.Netty中的一些常见关键字 1.EventLoopGroup 2.ServerBootstrap 3.ChannelFuture 4.ServerSocketChannel 5.group ...

最新文章

  1. 退出oracle系统,配置Oracle随系统启动和关闭
  2. 《javascript模式》 容易踩中的那些坑
  3. 分享Silverlight/WPF/Windows Phone一周学习导读(3月14日-3月19日)
  4. Invalid packet stream index
  5. Java关键字final、static、this、super使用总结
  6. mysql group by over,PostgreSQL相当于MySQL GROUP BY
  7. ubuntu 16.04 x86_64中arm-none-linux-gnueabi-不起作用时的解决方案
  8. 图片上传工具 java_图片上传工具类-fileUtil
  9. Java proxy 子类代理
  10. Linux桌面没有minidwep,ubuntu 12.04完整安装minidwep-gtk教程
  11. arduino SIM868发送post请求到服务器,解决只能成功发送一次的问题
  12. 如何安装TFP(tensorflow概率编程)
  13. android patch app,AndroidN,O 加载到patch 以后重启app crash了.
  14. Android Things:外设I/O接口-PWM
  15. 自动安装JDK、HADOOP、ZOOKEEPER、HIVE的shell脚本
  16. dirbuster暴力破解工具
  17. python代码如何加密
  18. 从2010 IDF 看英特尔固态硬盘现状及策略
  19. GEA 3.3 捕捉及处理错误
  20. 《先知·哀乐》《先知·苦痛》

热门文章

  1. OTT营销迎来「开卷大考」,科学评估成广告主必答题
  2. 【学术】观点动力学模型——IJAC主题分享会议上的听讲笔记
  3. python字典增加元素答案_python增加字典元素
  4. 浅谈斐波那契数列——从递推到矩阵乘法
  5. HTML5游戏实战之消灭星星(完整源代码)
  6. sqlHelper做增删改查,SQL注入处理,存储值,cookie,session
  7. 【你足够努力了吗?】
  8. “平台战略”课程学习笔记
  9. 为什么自学Java找工作越来越难,HR究竟在顾忌啥?
  10. 已知挖坑记录(不知道什么时候才填)