一、为什么会出现Netty
之前我们使用通用的应用程序或库来相互通信。例如,我们经常使用HTTP客户机库从web服务器检索信息,并通过web服务调用远程过程调用。然而,通用协议或其实现有时伸缩性不是很好。这就像我们不使用通用HTTP服务器来交换大型文件、电子邮件消息和近乎实时的消息(如财务信息和多人游戏数据)一样。所需要的是专门用于特定目的的高度优化的协议实现。例如,您可能希望实现一个针对基于ajax的聊天应用程序、媒体流或大型文件传输进行优化的HTTP服务器。您甚至可能想要设计和实现一个完全适合您需要的新协议。另一个不可避免的情况是,您必须处理遗留的专有协议,以确保与旧系统的互操作性。在这种情况下,重要的是在不牺牲结果应用程序的稳定性和性能的情况下,我们能够多快地实现该协议。
那么,Netty的出现,就能很好的解决上面的问题;
二、Netty是什么
Netty项目致力于提供异步事件驱动的网络应用程序框架和工具,以便快速开发可维护的高性能和高可伸缩性协议服务器和客户端。
换句话说,Netty是一个NIO客户机服务器框架,它支持快速而简单地开发协议服务器和客户机等网络应用程序。它大大简化和流线网络编程,如TCP和UDP套接字服务器的开发。
“快速而简单”并不意味着最终的应用程序会出现可维护性或性能问题。Netty经过精心设计,从实现许多协议(如FTP、SMTP、HTTP)和各种二进制和基于文本的遗留协议中吸取了经验。因此,Netty成功地找到了一种方法,在不妥协的情况下实现开发、性能、稳定性和灵活性。
一些用户可能已经找到了其他声称具有相同优势的网络应用程序框架,您可能想知道是什么使Netty与它们如此不同。答案是它所基于的哲学。Netty旨在从第一天起就为您提供最舒适的API和实现体验。它并不是什么有形的东西,但是当你阅读Netty官方指南并与Netty玩耍时,你会意识到这种哲学会让你的生活变得更容易。
三、Netty相关的其他概念
/** * @author zhangboqing * @date 2018/8/29 * * 关于netty ,首先要搞清楚,这是建立在客户端和服务端之间的。 * 服务端建立相应的规则,然后运行起来,等待客户端访问或者发送”消息“ * * 服务端的建立 * 第一步:先建立相应的规则 ==> DiscardServerHandler * 第二步:我们需要应用相应的规则。就是说,我们建立了接收消息的规则,但是光建立规则有什么用,仅仅只是一个规则,我们需要把这个规则”应用“起来,通常就是我们通常的”运行“;==>DiscardServer * 第三步:我们现在相应的规则已经建立,并且”运行“规则的代码也OK,所以运行DiscardServer中 public static void main(String[] args) 启动服务端。 * * 客户端访问 * 打开命令行窗口,键入 telnet 127.0.0.1 8080 回车,进入telnet 终端 * 然后随便输入回车,服务端就会打印你输入的数据 */ package com.zbq.simpledemo; /** * * * netty 官方API: http://netty.io/4.1/api/index.html * netty 中文指南:https://waylau.com/netty-4-user-guide/ * * * 关于NIO基础的知识:https://my.oschina.net/andylucc/blog/614295 * * http://www.cnblogs.com/dolphin0520/p/3919162.html * * http://blog.csdn.net/wuxianglong/article/details/6604817 * */ /** * netty 特点: * 1.并发高 * Netty是一款基于NIO(Nonblocking I/O,非阻塞IO)开发的网络通信框架,对比于BIO(Blocking I/O,阻塞IO),他的并发性能得到了很大提高 * 2.传输快 * Netty使用了NIO中的一大特性——零拷贝,利用直接内存对数据进行操作,从而加快了传输速度 * 3.封装好 * * * Channel * 数据传输流,与channel相关的概念有四个: * * Channel,表示一个连接,可以理解为每一个请求,就是一个Channel。 * 一个客户端与服务器通信的通道 * ChannelHandler,核心处理业务就在这里,用于处理业务请求。 * 业务逻辑处理器,分为ChannelInboundHandler 输入数据处理器 * 和ChannelOutboundHandler 输出业务处理器 * 通常情况下,业务逻辑都是存在于ChannelHandler之中 * ChannelHandlerContext,用于传输业务数据。 * 通信管道的上下文 * ChannelPipeline,用于保存处理过程需要用到的ChannelHandler和ChannelHandlerContext。 * 用于存放ChannelHandler的容器 * * 他们的交互流程是: * * 1.事件传递给 ChannelPipeline 的第一个 ChannelHandler * 2.ChannelHandler 通过关联的 ChannelHandlerContext 传递事件给 ChannelPipeline 中的 下一个 * * Buffer * 他有三种使用模式: * 1.Heap Buffer 堆缓冲区 * 堆缓冲区是ByteBuf最常用的模式,他将数据存储在堆空间。 * 2.Direct Buffer 直接缓冲区 * 直接缓冲区是ByteBuf的另外一种常用模式,他的内存分配都不发生在堆,jdk1.4引入的nio的ByteBuffer类允许jvm通过本地方法调用分配内存,这样做有两个好处 * 通过免去中间交换的内存拷贝, 提升IO处理速度; 直接缓冲区的内容可以驻留在垃圾回收扫描的堆区以外。 * DirectBuffer 在 -XX:MaxDirectMemorySize=xxM大小限制下, 使用 Heap 之外的内存, GC对此”无能为力”,也就意味着规避了在高负载下频繁的GC过程对应用线程的中断影响. * 3.Composite Buffer 复合缓冲区 * 复合缓冲区相当于多个不同ByteBuf的视图,这是netty提供的,jdk不提供这样的功能。 * * * Codec * Netty中的编码/解码器,通过他你能完成字节与pojo、pojo与pojo的相互转换,从而达到自定义协议的目的。 * 在Netty里面最有名的就是HttpRequestDecoder和HttpResponseEncoder了 */