美文网首页
netty通信框架

netty通信框架

作者: John13 | 来源:发表于2019-05-08 11:57 被阅读0次

Netty入门教程——认识Netty
彻底理解Netty,这一篇文章就够了

Netty特点

  • 并发高
  • 传输快
  • 封装好

Netty中主要的组件:

  • Bootstrap:netty的组件容器,用于把其他各个部分连接起来;如果是TCP的Server端,则为ServerBootstrap.
  • Channel:代表一个Socket的连接
  • EventLoopGroup:一个Group包含多个EventLoop,可以理解为线程池
  • EventLoop:处理具体的Channel,一个EventLoop可以处理多个Channel
  • ChannelPipeline:每个Channel绑定一个pipeline,在上面注册处理逻辑handler
  • Handler:具体的对消息或连接的处理,有两种类型,Inbound和Outbound。分别代表消息接收的处理和消息发送的处理。
  • ChannelFuture:注解回调方法

TCP 粘包/拆包

在服务端根据我们的应用层的协议来组装数据包,这个过程通常在服务端称为拆包,而在客户端称为粘包。

  • Netty中的拆包器

Netty中的零拷贝主要体现在三个方面:

  • bytebuffer
    Netty发送和接收消息主要使用bytebuffer,bytebuffer使用对外内存(DirectMemory)直接进行Socket读写。原因:如果使用传统的堆内存进行Socket读写,JVM会将堆内存buffer拷贝一份到直接内存中然后再写入socket,多了一次缓冲区的内存拷贝。DirectMemory中可以直接通过DMA发送到网卡接口。

  • Composite Buffers
    传统的ByteBuffer,如果需要将两个ByteBuffer中的数据组合到一起,我们需要首先创建一个size=size1+size2大小的新的数组,然后将两个数组中的数据拷贝到新的数组中。但是使用Netty提供的组合ByteBuf,就可以避免这样的操作,因为CompositeByteBuf并没有真正将多个Buffer组合起来,而是保存了它们的引用,从而避免了数据的拷贝,实现了零拷贝。

  • 对于FileChannel.transferTo的使用
    Netty中使用了FileChannel的transferTo方法,该方法依赖于操作系统实现零拷贝。

Netty执行流程

  • 服务端:
  • 创建ServerBootStrap实例
  • 设置并绑定Reactor线程池:EventLoopGroup,EventLoop就是处理所有注册到本线程的Selector上面的Channel
  • 设置并绑定服务端的channel
  • 创建处理网络事件的ChannelPipeline和handler,网络时间以流的形式在其中流转,handler完成多数的功能定制:比如编解码 SSl安全认证
  • 绑定并启动监听端口
  • 当轮训到准备就绪的channel后,由Reactor线程:NioEventLoop执行pipline中的方法,最终调度并执行channelHandler
  • 客户端:

相关文章

网友评论

      本文标题:netty通信框架

      本文链接:https://www.haomeiwen.com/subject/kilmoqtx.html