学习资料
https://juejin.im/book/5b4bc28bf265da0f60130116/section/5b6a1a9cf265da0f87595521
收获:
转载
1. Netty 是什么? 经过我们整个小册的学习,我们可以了解到,Netty 其实可以看做是对 BIO 和 NIO 的封装,并提供良好的 IO 读写相关的 API,另外还提供了非常多的开箱即用的 handler,工具类等等。
2. 服务端和客户端启动 Netty 提供了两大启动辅助类,ServerBootstrap 和 Bootstrap, 他们的启动参数类似,都是分为 配置 IO 类型,配置线程模型。 配置 TCP 参数,attr 属性。 配置 handler。server 端除了配置 handler,还需要配置 childHandler,他是定义每条连接的处理器。
3. ByteBuf 接着,我们又学习了 Netty 对二进制数据的抽象类 ByteBuf,ByteBuf 底层又可以细分为堆内存和堆外内存,它的 API 要比 jdk 提供的 ByteBuffer 要更好用,ByteBuf 所有的操作其实都是基于读指针和写指针来进行操作的,把申请到的一块内存划分为可读区、可写区,另外还提供了自动扩容的功能。
4. 自定义协议拆包与编解码 通常,我们要实现客户端与服务端的通信,需要自定义协议,说白了就是双方商量在字节流里面,对应位置的字节段分别表示什么含义。 我们用的最多的协议呢就是基于长度的协议,一个协议数据包里面包含了一个长度字段,我们在解析的时候,首先第一步就是从字节流里面根据自定义协议截取出一个个数据包,使用的最多的拆包器就是 LengthFieldBasedFrameDecoder,只需要给他配置一些参数,即可实现自动拆包。 拆包之后呢,我们就拿到了代表字节流区段的一个个 ByteBuf,我们的解码器的作用就是把这些个 ByteBuf 变成一个个 java 对象,这样我们后续的 handler 就可以进行相应的逻辑的处理。
5. handler 与 pipeline Netty 对逻辑处理流的处理其实和 TCP 协议栈的思路非常类似,分为输入和输出,也就是 inBound 和 outBound 类型的 handler,inBound 类 handler 的添加顺序与事件传播的顺序相同,而 outBound 类 handler 的添加顺序与事件传播的顺序相反,这里一定要注意。 无状态的 handler 可以改造为单例模式,但是千万记得要加 @ChannelHandler.Sharable 注... https://juejin.im 掘金 — 一个帮助开发者成长的社区
需要掌握的东西有以下
netty的整体架构:
线程模型:主从reactor模型
https://mrdear.cn/2018/08/07/framework/netty/netty--reactor_model/
netty的核心组件:
- Channel:表示客户端与服务端建立起的连接通道
- EventLoop:不断的循环多路复用器中事件的一个Reactor线程,对于NIO多路复用器则为
java.nio.channels.Selector
- ChannelPipeline:业务逻辑执行链封装,比如对消息的decode,compute,encode等
这三个实现也是Netty线程模型的核心,接下来逐一分析。
不同场景的可解决方案: