远方的灯塔 - 专注于服务端技术分享 远方的灯塔 - 专注于服务端技术分享
首页
  • Java SE
  • Struts2
  • Hibernate
  • MyBatis
  • JAX-WS
  • 并发
  • 分布式
  • Git
  • 文章分类
  • 文章标签
  • 文章归档
  • 《C程序设计语言》
心情随笔
友情链接
给我留言 (opens new window)
关于我
GitHub (opens new window)

Terwer Green

一个后端老菜鸟
首页
  • Java SE
  • Struts2
  • Hibernate
  • MyBatis
  • JAX-WS
  • 并发
  • 分布式
  • Git
  • 文章分类
  • 文章标签
  • 文章归档
  • 《C程序设计语言》
心情随笔
友情链接
给我留言 (opens new window)
关于我
GitHub (opens new window)
  • JavaSE

  • 开源框架

  • Linux

  • Struts2

  • Hibernate

  • Webservice

  • 分布式

    • RPC架构设计及IO模型
    • NIO编程及其三大核心原理
    • NIO三大核心之缓冲区(Buffer)
    • NIO三大核心之通道(Channel)
    • NIO三大核心之选择器(Selector)
    • Netty核心原理
    • 线程模型以及传统IO阻塞模型
    • Reactor模型
    • Netty线程模型
    • Netty核心API介绍
      • Netty入门与异步模型
      • Netty高级进阶之Netty编解码器
      • Netty高级进阶之基于Netty的群聊天室案例
      • Netty高级进阶之基于Netty的HTTP服务器开发
      • Netty高级进阶之基于Netty的Websocket开发网页聊天室
      • Netty高级进阶之Netty中的粘包和拆包的解决方案
      • Nety源码剖析
      • 自定义RPC框架之分布式架构网络通信理论
      • 自定义RPC框架之基于Netty实现RPC框架
      • 分布式架构理论
      • 分布式理论之数据一致性
      • 分布式理论之CAP定理
      • 分布式理论之BASE定理
      • 分布式一致性协议之两阶段提交协议(2PC)
      • 分布式一致性协议之三阶段提交协议(3PC)
      • 分布式一致性协议之NWR协议
      • 分布式一致性协议之Gossip协议
      • 分布式一致性协议之Paxos协议
      • 分布式一致性协议之Raft协议
      • 分布式一致性协议之Lease机制
      • 分布式系统设计策略之心跳检测
      • 分布式系统设计策略之高可用
      • 分布式系统设计策略之容错性
      • 分布式系统设计策略之负载均衡
      • 分布式架构服务调用
      • 分布式服务治理之服务协调
      • 分布式服务治理之服务削峰
      • 分布式服务治理之服务降级
      • 分布式服务治理之服务限流
      • 分布式服务治理之服务熔断
      • 分布式服务治理之服务链路追踪
      • 架构设计基本原则之开闭原则(OCP)
      • 架构设计基本原则之单一职责原则(SRP)
      • 架构设计基本原则之接口隔离原则(ISP)
      • 架构设计基本原则之里式替换原则(LSP)
      • 架构设计基本原则之依赖倒置原则(DIP)
      • 架构设计基本原则知识扩展
      • 分布式架构知识拓展与总结
    • 分布式框架

    • 后端开发
    • 分布式
    terwer
    2022-04-21
    目录

    Netty核心API介绍

    本文介绍了Netty的核心API以及他们的使用。

    # Netty核心API介绍

    # ChannelHandler及其实现类

    API关系如下:

    classDiagram
    direction BT
    class ChannelHandler {
    <<Interface>>
    
    }
    class ChannelHandlerAdapter
    class ChannelInboundHandler {
    <<Interface>>
    
    }
    class ChannelInboundHandlerAdapter
    class ChannelOutboundHandler {
    <<Interface>>
    
    }
    class ChannelOutboundHandlerAdapter
    
    
    ChannelInboundHandler  -->  ChannelHandler 
    ChannelInboundHandlerAdapter  -->  ChannelHandlerAdapter 
    ChannelInboundHandlerAdapter  ..>  ChannelInboundHandler 
    ChannelHandlerAdapter  ..>  ChannelHandler 
    ChannelOutboundHandler  -->  ChannelHandler 
    ChannelOutboundHandlerAdapter  -->  ChannelHandlerAdapter 
    ChannelOutboundHandlerAdapter  ..>  ChannelOutboundHandler 
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26

    如果图片无法显示,请看这里

    image-20220420001840283

    Netty开发中需要定义一个Handler类去实现ChannelHandler接口或其子类或其实现类,然后通过重写相关方法实现业务逻辑:

    • public void channelActive(ChannelHandlerContext ctx):通道就绪事件
    • public void read(ChannelHandlerContext ctx, Object msg):通道读取数据事件
    • public void readComplete(ChannelHandlerContext ctx):数据读取完毕事件
    • publi void exceptionCaught(ChannelHandlerContext ctx, Throwable cause):通道发生异常事件

    # ChannelPipline

    ChannelPipline是一个handler集合,它负责处理和拦截inbound和outbound事件和操作,相当于一个贯穿Netty的责任链。

    image-20220420120120457

    如果客户端和服务端的handler是一样的,那么消息从客户端到服务端或者反过来,每个inbound类型或许outbound类型只会经过一次,混合类型(同时实现了inbound和outbound的handler)的handler会经过两次。

    ChannelPipline中的每个ChannelHandlerContext中都含有一个ChannelHandler。

    InboundHandler是按照Pipline的加载顺序顺序执行,OutboundHandler是按照Pipline的加载顺序逆序执行。

    # ChannelHandlerContext

    事件处理器上下文对象,Pipline链中的实际处理节点。

    每个处理节点ChannelhandlerContxet包含一个具体的处理器ChannelHandler,同时ChannelHandlerContext中也绑定了对应的ChannelPipline和Channel的信息,方便对ChannelHandler进行调用。常用方法如下:

    • ChannelFuture close():关闭通道
    • ChannelOutboundInvoker flush():刷新
    • ChannelFuture writeAndFlush(Object msg):将数据写入ChannelPipline中当前ChannelHandler的下一个ChannelHandler开始处理(出站)

    # ChannelOption

    Netty在创建Channel实例后,一般都需要设置ChannelOption参数。

    ChannelOption是socket的标准参数,不是Netty特有的。常见的参数如下:

    • ChannelOption.SO_BACKLOG:对应TCP/IP协议listen函数中的backlog参数,用来初始化服务器可连接队列大小。

      服务端处理客户端连接请求是顺序处理的,所以同一时间只能处理一个客户端连接。

      多个客户端来的时候,服务端将不能处理的客户端请求放在等待队列里,backlog参数指定了队列的大小。

    • ChannelOption.SO_KEEPALIVE:一直保存连接处于活动状态。该参数用于设置TCP连接。

      当设置该选项之后,会测试连接的状态,用于可能长时间没有数据交流的连接。

      当设置该选项后,如果两小时内没有数据通信时,TCP会自动发送一个活动探测数据报文。

    # ChannelFuture

    表示Channel中异步I/O操作的结果。

    在Netty中所有的I/O操作都是异步的,IO的调用会直接返回,调用者并不能立即获得结果,但是可以通过ChannelFuture来获取I/O操作的处理状态。

    常用方法如下:

    • Channel channel():返回当前正在进行IO操作的通道
    • ChannelFuture sync():等待异步操作执行完毕,将异步改为同步

    # EventLoopGroup和实现类NioEventLoopGroup

    EventLoopGroup是一组EventLoop的抽象,Netty为了更好的利用多核CPU的资源,一般会有多个EventLoop同时同工作,每个EventLoop维护着一个Selector对象。

    EventLoopGroup提供next接口,可以从组里面按照一定规则,获取其中一个EventLoop来处理任务。

    在Netty的服务端编程中,一般需要提供两个EventLoopGroup,例如:BossEventLoopGroup和WorkerEventLoopGroup。

    通常一个服务端口就是一个ServerSocketChannel,对应一个Selector和一个EventLoop线程。

    BossEventLoop负责接收客户端连接,并将SocketChannel交给WorkerEventLoopGroup进行I/O处理。

    image-20220420180506604

    BossEventLoopGroup通常是一个单线程的EventLoop,EventLoop维护者一个注册了ServerSocketChannel的Selector实例。

    BossEventLoop不断轮询Selector,将连接事件分离出来,通常是ON_ACCEPT事件,然后将接收到的SocketChannel交给WorkerEventLoopGroup。

    WorkerEventLoopGroup会由next选择其中一个EventLoopGroup来讲这个SocketChannel注册到其维护的Selector,并对其后的IO事件进行处理。

    一般情况下都是使用NioEventLoopGroup,常用方法如下:

    • public NioEventLoopGroup():构造方法,创建线程组
    • public Future<?> shutdownGracefully():断开连接,关闭线程

    # ServerBootStrap和Bootstrap

    ServerBootstrap是Netty中的服务端启动助手,通过它可以完成服务端的各种配置。

    Bootstrap是Netty中的客户端启动助手,通过它可以完成客户端的各种配置。常见方法如下:

    • public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup):用于服务端,用于设置两个EventLoop
    • public B group(EventLoopGroup group):用于客户端,用于设置一个EventLoop
    • public B channel(Class<? Extends C> channelClass):该方法用于设置服务端的通道实现
    • public B option(ChannelOption option, T value):用来给ServerChannel添加配置
    • public ServerBootstrap childOption(ChannelOption option, T value):用来给接收到的通道添加配置
    • public ServerBootstrap childHandler(ChannelHandler childHandler):该方法设置业务处理类,自定义Handler
    • public ChannelFuture bind(int inetPort):该方法用于服务端,用来设置占用的端口号
    • public ChannelFuture connect(String inetPort, int inetPort):该方法用于客户端,用于连接服务端

    # Unpooled类

    这是Netty提供的一个专门用来操作缓冲区的工具类,常用方法如下:

    • public static ByteBuf copiedBuffer(CharSequence string, Charset charset):通过给定的数据和字符编码返回一个BuyeBuf对象,类似于NIO中的ByteBuffer对象。
    编辑 (opens new window)
    #netty#api
    上次更新: 2023/02/22, 13:47:25
    Netty线程模型
    Netty入门与异步模型

    ← Netty线程模型 Netty入门与异步模型→

    最近更新
    01
    解决css部分border被圆角切掉之后圆角的边框消失问题
    03-18
    02
    使用TypeScript开发一个自定义的Node-js前端开发脚手架
    03-08
    03
    Github-Actions使用release-please实现自动发版
    03-06
    更多文章>
    Theme by Vdoing | Copyright © 2011-2023 Terwer Green | MIT License | 粤ICP备2022020721号-1 | 百度统计
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式