前言:
现在各位老铁们对“netty用在什么地方”大概比较关心,我们都需要剖析一些“netty用在什么地方”的相关知识。那么小编在网上汇集了一些对于“netty用在什么地方””的相关文章,希望大家能喜欢,姐妹们一起来学习一下吧!Netty是什么?
首先说一个实际的应用场景:
实验室测试仪器测试的样本结果使用仪器发送数据传输到Lis盒子,盒子程序收到仪器数据再打包成固定格式文件,接下来需要把文件数据发送到服务器端做相关业务逻辑处理。
在这里,文件数据传输到服务端的功能就是通过Netty实现的。
说到这儿大家知道,Netty是用于客户端往服务端传数据用的。
对于还未接触过Netty的小伙伴,心里或许会想Netty到底是什么?有哪些不一样的地方?我们为什么要用它呢?
传统IO编程
在开始解读Netty是什么之前,我们先来回顾一下。
如果需要实现一个客户端发送数据到服务端的通信程序,使用传统的IO编程该如何实现。
服务端实现:
创建一个服务端套接字并绑定一个指定端口;创建一个线程,在线程里面不断调用accept阻塞方法;当获取到新的连接之后,给每条连接创建一个新的执行线程,这个线程负责从该连接中以字节流的方式读取数据;
客户端实现:
创建一个客户端套接字,设定服务端ip和端口;向服务端发送数据;
这样传统IO编程就实现好了,很简单。
这种IO编程模型在客户端较少的情况下运行良好,但是对于客户端比较多的业务来说,单机服务端可能需要支撑成千上万的连接,传统IO模型可能就不太合适了。
我们分析一下原因,通过刚刚描述的IO编程实现方式,每个连接创建成功之后都需要一个线程来维护。
每个线程包含一个循环读取字节流数据,假如有1w个连接对应1w个线程,就有1w个循环读取字节流数据,这就带来以下几个问题:
线程资源受限:线程是操作系统中非常宝贵的资源,同一时刻有大量的线程处于阻塞状态是非常严重的资源浪费,操作系统耗不起;线程切换效率低下:单机cpu核数固定,线程爆炸之后操作系统频繁进行线程切换,应用性能急剧下降;效率不高:IO编程中数据读写是以字节流为单位;NIO编程
为了解决以上问题,JDK在1.4版本之后提出了NIO编程,那NIO编程又是如何解决以上三个问题呢?
(1)线程资源受限方面:
NIO编程模型中,新来一个连接不再创建一个新的线程。
而是把这条连接直接绑定到某个固定的线程,然后这条连接所有的读写都由这个线程来负责。
这就是NIO模型解决线程资源受限的方案,实际开发过程中,我们会开多个线程,每个线程都管理着一批连接。
相对于IO模型中一个线程管理一条连接,消耗的线程资源大幅减少。
(2)线程切换效率低下方面:
由于NIO模型中线程数量大大降低,线程切换效率因此也大幅度提高。
(3)效率不高方面:
IO模型每次数据读写以字节为单位,NIO模型每次数据读写不再以字节为单位,是以字节块为单位,维护了一个缓冲区,可以从这个缓冲区里面读取一块的数据。
就好比一盘美味的花生米放在你面前,你用筷子一个个夹(每次一个),肯定不如用勺子挖着吃(每次一批)效率来得高。
Netty的诞生
为什么在编程中不直接使用NIO呢?
其实JDK的NIO编程犹如带刺的玫瑰,虽然美好,让人向往。
但是使用不当会让你抓耳挠腮,痛不欲生,正因为如此,Netty横空出世。
那么Netty到底是何方神圣?
用一句简单的话来说就是:Netty封装了JDK的NIO,让你用得更爽,你不用再写一大堆复杂的代码了。
用官方正式的话来说就是:Netty是一个异步事件驱动的网络应用框架,用于快速开发可维护的高性能服务器和客户端。
总结了一下使用Netty和不使用JDK原生NIO的比较:
使用JDK自带的NIO需要了解太多的概念,编程复杂,一不小心bug横飞;Netty底层IO模型随意切换,而这一切只需要做微小的改动,改改参数,Netty可以直接从NIO模型变身为IO模型;Netty自带的拆包解包,异常检测等机制让你从NIO的繁重细节中脱离出来,让你只需要关心业务逻辑;Netty底层对线程,selector做了很多细小的优化,精心设计的selector线程模型做到非常高效的并发处理;Netty已经历各大rpc框架,消息中间件,分布式通信中间件线上的广泛验证,健壮性无比强大等等;
总之,Netty是网络编程进阶必备神器,如果你知其然,还想知其所以然,一定要好好研究下Netty。
标签: #netty用在什么地方