Netty 核心模块:Bootstrap、ServerBootstrap、Future、ChannelFuture、Channel、ChannelHandler、Pipeline、ChannelPipeline、ChannelHandlerContext、ChannelOption、EventLoopGroup、NioEventLoopGroup、Unpooled
目录
Bootstrap、ServerBootstrap
- 主要作用就是配置整个 Netty 程序,串联各个组件
- Bootstrap 是客户端程序的启动类
- ServerBootstrap 是服务端启动引导类
- 常用方法
- group(bossGroup, workerGroup):用于服务端,设置两个 EventLoop,客户端设置 EventLoopGroup
- channel:设置服务端的通道实现
- option:给 ServerChannel 添加配置
- childOption:接收到到通道添加配置
- childHandler:设置业务处理类,自定义 handler
- bind:绑定端口号
- connect:用于客户端连接服务器
Future、ChannelFuture
- Netty 中所有的 IO 操作都是异步的,不能立刻得知消息是否被正确处理,可以通过 Future 和 ChannelFuture 注册监听
- 常用方法
- channel:返回正在进行 IO 操作的通道
- sync:等待异步操作执行完毕
Channel
- Netty 网络通信的组件,执行网络 IO 操作
- 通过 Channel 可以获取当前网络连接通道的状态
- 通过 Channel 可以获得网络连接的配置参数
- Channel 提供异步的网络 IO 操作(连接、读写、绑定端口),异步任何 IO 调用都将立即返回,但是不保证操作完成
- 会立即返回一个 ChannelFuture 实例,可以监听 IO 操作
- 支持关联 IO 操作与对应的处理程序
- 不同协议、不同阻塞类型都有不同的 Channel 类型
- NioSocketChannel:异步客户端 TCP Socket 连接
- NioServerSocketChannel:异步服务端 TCO Socket 连接
- NioDatagramChannel:异步 UDP 连接
- NioSctpChannel: 异步客户端 Sctp 连接
- NioSctpServerChannel:异步服务端 Sctp 连接
Selector
- Netty 基于 Selector 对象实现 IO 多路复用,一个线程可以监听多个连接 Channel 事件
- 向一个 Selector 注册 Channel 后,就可以不断查询是否有就绪的 IO 事件,可以简单高效的管理多个 Channel
ChannelHandler - 是一个接口,处理 IO 事件或者拦截 IO 操作,并转发到 ChannelPipeline 中的下一个处理程序
- 并没有很多方法,可以继承子类使用
Pipeline、ChannelPipeline
- ChannelPipeline 是一个 Handler 的集合,负责处理和拦截 inbound 或者 outbound 的事件和操作,相当于贯穿 Netty 的链
- ChannelPipeline 实现了一种高级形式的拦截过滤器模式,使用户可以完全控制事件的处理方式,以及 Channel 中各个的 ChannelHandler 如何相互交互
- 每个 Channel 有且只有一个 ChannelPipeline 与之对应
- ChannelPipeline 中又维护了一个由 ChannelHandlerContext 组成的双向链表,并且每个 ChannelHandlerContext 中又关联着一个 ChannelHandler
- 入站事件和出战事件在一个双向链表中,入站事件会从链表 head 往后传递到最后一个入站的 handler,出站事件会从链表 tail 往前传递到最新一个出站的 handler,两种类型的 handler 互不干扰
- 常用方法
- addFirst:把 handler 添加到链中第一个位置
- addLast:把 handler 添加到链中最后一个位置
ChannelHandlerContext
- 保存 Channel 所有上下文信息,同时关联一个 ChannelHandler 对象,包含一个具体到事件处理器 ChannelHandler
- 绑定对应到 pipeline 和 Channel 信息,方便 ChannelHandler 调用
- 常用方法
- close:关闭通道
- flush:刷新
- writeAndFlush:将数据写到 ChannelPipeline 中当前 ChannelHandler 的下一个 ChannelHandler 开始处理
ChannelOption
- Netty 创建 Channel 实例后,一般需要设置 Option 参数
- 参数
- SO_BACKLOG:backlog 参数,初始化服务器可连接队列大小
- SO_KEEPALIVE:保持连接活动状态
EventLoopGroup、NioEventLoopGroup
- EventLoopGroup 是一组 EventLoop 的抽象,更好利用 CPU 资源一般会有多个 EventLoop 同时工作,每个 EventLoop 维护着一个 Selector 实例
- EventLoopGroup 提供 next 接口,可以按照规则取其中一个 EventLoop 处理任务,服务器端一般需要提供两个(Boss、Worker)
- BossEventLoopGroup 通常是一个单线程的 EventLoop,维护着一个注册了 ServerSocketChannel 的 Selector 实例,不断轮询将连接事件分离出来
- 通常是 OP_ACCEPT 事件,将接收到的 SocketChannel 交给 WorkerEventLoopGroup,由 next 选择其中一个 EventLoopGroup 来注册并处理后续事件
- 通常一个服务端口即一个 ServerSocketChannel 对应一个 Selector 和一个 EventLoop 线程
- 常用方法
- NioEventLoopGroup:构造方法
- shutdownGracefully:断开连接
Unpooled
- Netty 提供的一个专门用来操作缓冲区的工具类
- 常用方法
- copiedBuffer:给定的数据和字符编码返回一个 ByteBuf 对象(类似 ByteBuffer)
编码解码
- 基本介绍
- 数据在网络中传输的都是二进制字节码数据,发送时就需要编码,接收时就需要解码
- codec(编解码器)组成分两个:decoder(解码器)和 encoder(编码器)
- 存在问题
- 无法跨语言、序列化后体积太大(二进制编码 5 倍多)、序列化性能太低
- Protobuf(Google Protocol Buffers)
- 基本介绍
- 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化或序列化
- 适合做数据存储或 RPC 数据交换格式
- Protobuf 是以 message 的方式来管理数据的,支持跨平台、跨语言、高性能、高可靠性
- protobuf 能自动生成代码
- 基本介绍
入站出站
- 基本说明
- Netty 主要组件:Channel、EventLoop、ChannelFuture、ChannelHandler、ChannelPipe 等
- ChannelHandler 充当处理入站和出站数据的容器
- ChannelPipeline 提供了 ChannelHandler 链的容器
- 客户端到服务端的方向是出站,反之入站
- 编码解码器
- 入站消息会被解码,出站消息会被编码
- 结论
- 不论解码器 handler 还是编码器 handler,接收的消息类型必须和处理的类型一致,否则不会执行
- 解码器解码时,需要判断缓存区数据是否足够,否则收到的结果可能不一致
- ReplayingDecoder 解码器
- 继承 ByteTOMessageDecoder,扩展类这个类,不必调用 readableBytes() 方法
- 局限性
- 不是所有的 ByteBuf 都支持
- 格式复杂等情况下还会比 ByteToMessageDecoder 慢,消息会被拆分成多个碎片,速度变慢
- 其他解码器
- LineBaseFrameDecoder:使用行尾控制字符作为分隔符来解析数据
- DelimiterBasedFrameDecoder:自定义特殊符号作为消息分隔符
- HttpObjectDecoder:HTTP 数据解码器
- LengthFieldBasedFrameDecoder:指定长度来标示整包信息,自定处理粘包和半包消息
- …
5364

被折叠的 条评论
为什么被折叠?



