目标
网络通信领域知识、技能的提升
方便后续项目Netty实战
主要学习内容
- 概念
- 源码
- 黑科技
- ByteBuf todo
1、Netty概念梳理
1.1EventLoopGroup 、 EventLoop 和 Channel 的关系
- Channel 是 Java NIO 的一个基本构造。A nexus to a network socket or a component which is capable of I/O operations such as read, write, connect, and bind.
-
EventLoop 本身只由一个线程驱动,其处理了一个 Channel 的所有 I/O 事件,并且在该
EventLoop 的整个生命周期内都不会改变。 -
EventLoopGroup 包含一个或者多个 EventLoop;
注意,在这种设计中,一个给定 Channel 的 I/O 操作都是由相同的 Thread 执行的,实际
上消除了对于同步的需要。
1.2ChannelHandler 、 ChannelPipeline和ChannelHandlerContext的关系
- Netty 的主要组件是 ChannelHandler,用于实现所有处理入站和出站数据的应用程序逻辑。ChannelHandler的方法对应一个事件。
- ChannelPipeline 提供了 ChannelHandler 链的容器。
- 当 ChannelHandler 被添加到 ChannelPipeline 时,它将会被分配一个 ChannelHandlerContext,其代表了 ChannelHandler 和 ChannelPipeline 之间的绑定。虽然这个对象可以被用于获取底层的 Channel,但是它主要还是被用于写出站数据。
- ChannelHandler 的事件方法都有一个 ChannelHandlerContext参数。通过使用作为参数传递到每个方法的 ChannelHandlerContext,事件可以被传递给当前ChannelHandler 链中的下一个 ChannelHandler。
- 在Netty中,有两种发送消息的方式。你可以直接写到Channel中,也可以 写到和Channel- Handler 相关联的 ChannelHandlerContext 对象中。前一种方式将会导致消息从 Channel- Pipeline 的尾端开始流动,而后者将导致消息从 ChannelPipeline 中的下一个 Channel- Handler 开始流动。
1.3主要ChannelHandler及主要事件
1.4 ChannelPipeline
1.5 ChannelHandlerContext
1.6 EventLoop
Executor的执行逻辑
为了解决上述问题,Netty 采用了串行化设计理念,从消息的读取、编码以及后续 Handler 的执行,始终都由 IO 线程 NioEventLoop 负责,这就意外着整个流程不会进行线程上下文的切换,数据也不会面临被并发修改的风险,