Java Netty:核心模块(二)

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:指定长度来标示整包信息,自定处理粘包和半包消息
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值