美文网首页Netty专栏
Netty关键组件Channel、EventLoop 、Chan

Netty关键组件Channel、EventLoop 、Chan

作者: 千淘萬漉 | 来源:发表于2019-08-18 09:26 被阅读0次

    Netty中抽象的接口

    主要有三种类型接口

    • Channel ------ Socket
    • EventLoop ------ 控制流、多线程和并发
    • ChannelFuture ------ 异步通知

    一、Channel接口

    Channel的产生是为了降低网络传输变成的复杂性,它是传入传出数据的载体,可以打开或者关闭,连接或断开。可以当做它是Socket的升级,大大降低了直接与 Socket 进行操作的复杂性。

    1. EmbeddedChannel ----- Embedded传输,一般用于测试ChannelHandller
    2. LocalServerChannel ----- Local传输,在VM内部通过管道进行通信的本地传输
    3. NioDatagramChannel ----- UDP协议NIO传输
    4. NioSctpChannel ----- SCTP协议NIO传输(基于Session)
    5. NioSocketChannel ----- TCP协议NIO传输,使用Java提供的NIO作为基础,基于选择器的方式(重点)

    二、EventLoop 接口

    Channel 为Netty 网络操作抽象类,EventLoop 主要是为Channel 处理 I/O 操作,两者配合参与 I/O 操作。
    下图是Channel、EventLoop、Thread、EventLoopGroup之间的关系(摘自《Netty In Action》)

    Netty提供的EventLoop结合了JDK的并发编程和Channel的事件,能够帮助用户实现周期性任务调度任务,类层次如下

    层次结构

    当一个连接到达时,Netty 就会注册一个 Channel,然后从 EventLoopGroup 中分配一个 EventLoop 绑定到这个Channel上,在该Channel的整个生命周期中都是有这个绑定的 EventLoop 来服务的。所以有如下约定俗成的关系(非常重要):

    1. 一个EventLoopGroup包含一个或多个EventLoop
    2. 一个EventLoop在其生命周期内只能和一个Thread绑定
    3. 由EventLoop处理的I/O事件都由它绑定的Thread处理
    4. 一个Channel在其生命周期内,只能注册于一个EventLoop
    5. 一个EventLoop可能被分配处理多个Channel。也就是EventLoop与Channel是1:n的关系
    6. 一个Channel上的所有ChannelHandler的事件由绑定的EventLoop中的I/O线程处理
    7. 不要阻塞Channel的I/O线程,可能会影响该EventLoop中其他Channel事件处理

    source: Netty专栏-EventLoop和线程模型

    三、 ChannelFuture 接口

    Netty中所有的I/O操作都是异步的,该异步操作可能无法立即得到返回。Netty提供addListener()方法注册回调函数——ChannelFutureListener,当操作执行成功或者失败时,监听就会自动触发返回结果。

    1. 可以将ChannelFuture看作是将来要执行的操作的结果占位符,什么时候被执行,不知道。但肯定会被执行
    2. 属于同一个Channel的操作(回调函数)都被保证将按照注册的顺序执行。

    比如有直接阻塞获取的方式:

    /*绑定到端口,阻塞等待直到连接完成*/
    ChannelFuture f = b.bind().sync();
    

    异步监听的方式

    serverBootstrap.bind(port).addListener(future -> {
                if (future.isSuccess()) {
                    System.out.println(new Date() + ": 端口[" + port + "]绑定成功!");
                } else {
                    System.err.println("端口[" + port + "]绑定失败!");
                }
    

    source: 【死磕Netty】-----Netty的核心组件)

    相关文章

      网友评论

        本文标题:Netty关键组件Channel、EventLoop 、Chan

        本文链接:https://www.haomeiwen.com/subject/shfmjctx.html