Netty4.1学习笔记

2017/12/03

对Netty4.1源码的一些学习记录


整个事件驱动模式就是

  1. 每个channel实例都会有个pipeline实例然后pipeline下面会有一个持有很多handler的双向链表.每个channel实例里面的pipeline实例都是不共享的,但是相同的handler实例是可以在不同pipeline中共用的,这时候你可以打上Sharable注解
  2. ChannelHandlerContext就是存储每个handler的环境的实例,实际上双向链表保存的是Chan nelHandlerContext,然后里面持有对应的handler实例
  3. inbound event在netty里面表示的是从应用外部传入的事件,inbound event 都是经过netty底层处理过之后才再抛到inboundHandler
  4. outbound event在netty里面表示的,应用代码自行触发的事情,然后outbound事件都是先抛到outboundHandler处理,之后才真正交给netty底层处理
  5. 例如channel.write(msg)就是用户触发的outbound event,这个事件会先交到outboundHandler去处理,然后才到netty底层直接把消息写出去
  6. Channel.Usafe才是真正处理socket通信的地方,inbound event是在Channel.Usafe处理逻辑中出发的,但是不会出发outbound event
  7. ChannelOutboundInvoker就是outbound event的触发者,channel就继承了它,channel继承自ChannelOutboundInvoker的方法的作用都是触发outbound event
  8. Channel.read这个方法有点特别,这个方法的作用其实就是,你调用了它,netty才会把读事件注册到监听器(换句话说就是,调用了Channel.read,netty才会开始读入消息).不过netty有个autoread的配置,默认是true(就是说,默认情况下,netty是会自动开始帮你读入消息).在netty配置了autoread=true的情况下,只要active和channelReadComplete这两个inbound event被触发了,netty就会自动调用一次Channel.read方法.所以,因为这个实际上算是由应用内部触发的,Channel.read是触发一个outbound event的
  9. 现在这个版本的netty,NioServerSocketChannel,NioSocketChannel,DefaultChannelPipeline,DefaultChannelHandlerContext是绑定的,所以只能通过继承,重写的方式来实现其中的变更了.
  10. DefaultChannelPipeline.HeadContext 是event handler的队列头部对inbound event和outbound event都会有影响,inbound event 是从这里开始的,outbound event是到这结束
  11. DefaultChannelPipeline.TailContext 是event handler的队列尾部,只对inbound event有影响,inbound event在这结束.
  12. 附上一张ChannelPipeline,和handler处理event的关系图
  13. channel.write 实质上是写到ChannelOutboundBuffer做缓存的,只有手动调用flush才会把ChannelOutboundBuffer里面的数据往socket里面写,如果socket的滑动窗口的缓存满了(就是写不进去了),会向selector注册一个OP_WRITE,等可写的时候再写. netty_event_mode