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():设置NioServerSocketChannelChannelHandlerPipeline

ØchildHandler():设置NioSocketChannelChannelHandlerPipeline

Ø通过ServerBootStrapbind方法启动服务端,bind方法会在parentGroup中注册NioServerScoketChannel,监听客户端的连接请求

Ø会创建一个NioServerSocketChannel实例,并将其在parentGroup中进行注册

Netty Server执行主要流程:

ØClient发起连接CONNECT请求,parentGroup中的NioEventLoop不断轮循是否有新的客户端请求,如果有,ACCEPT事件触发

ØACCEPT事件触发后,parentGroupNioEventLoop会通过NioServerSocketChannel获取到对应的代表客户端的NioSocketChannel,并将其注册到childGroupØchildGroup中的NioEventLoop不断检测自己管理的NioSocketChannel是否有读写事件准备好,如果有的话,调用对应的ChannelHandler进行处理

Netty入门教程——认识Netty

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的主要内容,如果未能解决你的问题,请参考以下文章

Netty入门介绍

Netty:入门篇

八.Netty入门到超神系列-Netty入门程序

二.Netty入门到超神系列-Java NIO 三大核心(selector,channel,buffer)

Netty入门学习

Netty入门学习