你知道网络架构分层吗?TCP/UDP各有什么优缺点? 你知道网络通信过程吗?一次https请求要经历哪些流程? 你知道网络IO模型吗?c10k问题是如何解决的? 你知道Java如何实现网络编程吗?Netty在Java Nio上做了哪些优化呢?
个人认为,学习知识,应该先构建知识全貌,然后再针对核心知识点进行学习,最终将每个知识点串联起来,融会贯通,即最终要构建我们的知识体系.所以,这篇文章的目的,是让你了解netty在网络编程中的知识全貌,先在脑海里有了这些知识点的概念,才能避免"不识庐山真面目,只缘身在此山中"的问题。一、Netty是什么
官网: https://netty.io/index.html
github: https://github.com/netty/netty
Netty is an asynchronous event-driven network application frameworkfor rapid development of maintainable high performance protocol servers & clients.
Netty是一个异步、事件驱动的网络应用框架,用于快速开发可维护、高性能协议服务端和客户端。
下图是netty所包含的组件:
![fd1687abfb4e66c3bf22084daaf72f69.png](https://img-blog.csdnimg.cn/img_convert/fd1687abfb4e66c3bf22084daaf72f69.png)
可以看到netty包含三个模块:
Core 核心模块: 可扩展的事件模型;通用的通信api;有零拷贝能力的Byte Buffer
Transport Services 传输服务: socket、UDP、http tunnel等
Protocol Support 协议支持: http、websocket、rtsp等协议的支持
我们来看看netty涉及到的知识层级划分:
netty可以应用于各rpc框架,如dubbo等
netty是基于Java NIO实现的,并在此基础上做了优化
netty是基于reactor模式,Linux IO多路复用模型
netty可以实现传输层TCP/UDP协议的通信
netty的多路复用器基于poll、epoll系统调用实现,通过mmap、sendfile实现零拷贝
性能优秀,高吞吐、低延迟
可扩展性好,基于事件驱动模型、可自定义线程模型
支持非阻塞的socket
文档齐全、社区活跃
•Apache Mina netty与mina是同一作者的不同产品,netty是作者用来针对mina提高扩展性与解决一些已知问题的产品,可以理解为netty是mina的升级版
Sun Grizzly 社区没有Netty活跃,更新没有netty频繁
Apple Swift NIO 非java语言
tomcat/jetty tomcat/jetty是Servlet容器,主要应用基于Servlet的Http协议的处理;而netty不仅支持Http,还支持FTP、SSH等应用层协议以及传输层的UDP协议,并且还支持自定义协议;
https://java.libhunt.com/compare-netty-vs-mina https://java.libhunt.com/compare-grizzly-vs-netty
为什么不直接使用Java Nio,而使用Netty呢?Netty支持常用的应用层协议如Http,而Java Nio需要开发人员去手动进行协议处理
Netty处理了TCP粘包半包问题,而Java Nio未处理
Netty支持流浪整形,而Java Nio不支持
Netty完善的处理了断连、空闲等异常处理
Netty修复了一些Java Nio的bug
二、如何去学习Netty
如何学习一个框架,重要的不是学习如何去使用它,也不是仅仅去读一读源码,而是学习它的过程中,理解它的原理及设计思路,这样当你学习其他相关框架,或自己设计系统的时候,就能事半功倍. 在上面的[知识层级划分图]中,黄色部分是偏底层及理论的知识,让我们通过两个Java程序,来了解下它们; Java NIO Demo什么是NIO,个人理解,操作系统层面,是Non-blocking IO,Java层面叫它new IO或许比Non-blocking IO合适,因为它并不是完全非阻塞的,比如Selector.select()就是阻塞的方法;
让我们来看一个比较原始的Java NIO demoimport java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;import java.util.Date;import java.util.Iterator;public cl