Netty入门教程——认识Netty
Posted 51架构师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Netty入门教程——认识Netty相关的知识,希望对你有一定的参考价值。
什么是Netty?
Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。
Netty 是一个广泛使用的 Java 网络编程框架(Netty 在 2011 年获得了Duke's Choice Award,见https://www.java.net/dukeschoice/2011)。它活跃和成长于用户社区,像大型公司 Facebook 和 Instagram 以及流行 开源项目如 Infinispan, HornetQ, Vert.x, Apache Cassandra 和 Elasticsearch 等,都利用其强大的对于网络抽象的核心代码。
Netty和Tomcat有什么区别?
Netty和Tomcat最大的区别就在于通信协议,Tomcat是基于Http协议的,他的实质是一个基于http协议的web容器,但是Netty不一样,他能通过编程自定义各种协议,因为netty能够通过codec自己来编码/解码字节流,完成类似redis访问的功能,这就是netty和tomcat最大的不同。
有人说netty的性能就一定比tomcat性能高,其实不然,tomcat从6.x开始就支持了nio模式,并且后续还有APR模式——一种通过jni调用apache网络库的模式,相比于旧的bio模式,并发性能得到了很大提高,特别是APR模式,而netty是否比tomcat性能更高,则要取决于netty程序作者的技术实力了。
为什么Netty受欢迎?(Netty的设计)
•设计
Ø统一的API,适用于不同的协议(阻塞和非阻塞)
Ø基于灵活、可扩展的事件驱动模型(SEDA)
Ø高度可定制的线程模型
Ø可靠的无连接数据Socket支持(UDP)
•性能
Ø更好的吞吐量,低延迟
Ø更省资源
Ø尽量减少不必要的内存拷贝
•安全
Ø完整的SSL/TLS和STARTTLS的支持
•易用
Ø完善的Javadoc,用户指南和样例
Ø仅依赖于JDK1.6(netty 4.x)
Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序
Netty主要组件
ØTransportChannel ---- 对应NIO中的channel
ØEventLoop---- 对应于NIO中的while循环
ØEventLoopGroup: 多个EventLoop
ØChannelHandler和ChannelPipeline---对应于NIO中的客户逻辑实现handleRead/handleWrite(interceptor pattern)
ØByteBuf---- 对应于NIO 中的ByteBuffer
ØBootstrap和 ServerBootstrap ---对应NIO中的Selector、ServerSocketChannel等的创建、配置、启动等
•Netty Server启动主要流程:
Ø设置服务端ServerBootStrap启动参数Øgroup(parentGroup,childGroup):
Øchannel(NioserverSocketChannel):设置通道类型
Øhandler():设置NioServerSocketChannel的ChannelHandlerPipeline
ØchildHandler():设置NioSocketChannel的ChannelHandlerPipeline
Ø通过ServerBootStrap的bind方法启动服务端,bind方法会在parentGroup中注册NioServerScoketChannel,监听客户端的连接请求
Ø会创建一个NioServerSocketChannel实例,并将其在parentGroup中进行注册
•Netty Server执行主要流程:
ØClient发起连接CONNECT请求,parentGroup中的NioEventLoop不断轮循是否有新的客户端请求,如果有,ACCEPT事件触发
ØACCEPT事件触发后,parentGroup中NioEventLoop会通过NioServerSocketChannel获取到对应的代表客户端的NioSocketChannel,并将其注册到childGroup中ØchildGroup中的NioEventLoop不断检测自己管理的NioSocketChannel是否有读写事件准备好,如果有的话,调用对应的ChannelHandler进行处理
NettyTransport - 传输层
•提供了统一的API,支持不同类型的传输层:
ØOIO -阻塞IO
ØNIO -JavaNIO
ØEpoll - Linux Epoll(JNI)
ØLocal Transport - IntraVM调用
ØEmbedded Transport - 供测试使用的嵌入传输
ØUDS- Unix套接字的本地传输
NettyEventLoop
•EventLoopGroup
•包括多个EventLoop
•多个EventLoop之间不交互
•EventLoop:
Ø每个EventLoop对应一个线程
Ø所有连接(channel)都将注册到一个EventLoop,并且只注册到一个,整个生命周期中都不会变化
Ø每个EventLoop管理着多个连接(channel)
ØEventLoop来处理连接(Channel)上的读写事件ØServerBootstrap
Ø包括2个不同类型的EventLoopGroup:
üParentEventLoop:负责处理Accept事件,接收请求üChildEventLoop:负责处理读写事件
NettyBuffers -ByteBuf
相比JDKByteBuffer, 更加易于使用:
Ø为读/写分别维护单独的指针,不需要通过flip()进行读/写模式切换
Ø容量自动伸缩(类似于ArrayList,StringBuilder)ØFluentAPI (链式调用)
更好的性能:
Ø通过内置的CompositeBuffer来减少数据拷贝(Zerocopy)Ø支持内存池,减少GC压力
•ByteBuf通过两个索引(readerindex、writer index)划分为三个区域:
Øreader index前面的数据是已经读过的数据,这些数据可以丢弃
Ø从reader index开始,到writerindex之前的数据是可读数据
Ø从writer index开始,为可写区域
顺序读/写:-改变reader/writerindex
üwriteByte()
üwriteLong()
üwriteXXX()- 增加write index
üreadByte()
üreadLong()
üreadXXX()- 增加read index
•随机读/写:- 不改变read/write index
ügetXXX(index)
üsetXXX(index,byte)
mark/reset:
ümarkReaderIndex()
ümarkWriterIndex()
üresetReaderIndex()
üresetWriterIndex()
üwriterIndex(index)
üreaderIndex(index)
•discardReadBytes方法 -compact
•clear方法
查询方法:
üindexOf
übytesBefore
üforEachByte(ByteBufProcessor)
DerivedBuffers(衍生缓冲区):
üduplicate()
üslice()
üslice(start,stop)
üunmodifiableBuffer(...),
DerivedBuffers(衍生缓冲区)
ü具有各自的index和markü返回的ByteBuf 与原ByteBuf 共享底层存储
缓冲区拷贝
•copy()或 copy(int, int)
•返回的ByteBuf 有数据的独立副本
以上是关于Netty入门教程——认识Netty的主要内容,如果未能解决你的问题,请参考以下文章