Netty工作原理架构

作者: LandHu | 来源:发表于2019-04-13 15:12 被阅读75次

    初始化并启动Netty服务端过程如下:

    public static void main(String[] args) {
           // 创建mainReactor
           NioEventLoopGroup boosGroup = new NioEventLoopGroup();
           // 创建工作线程组
           NioEventLoopGroup workerGroup = new NioEventLoopGroup();
    
           final ServerBootstrap serverBootstrap = new ServerBootstrap();
           serverBootstrap 
                    // 组装NioEventLoopGroup 
                   .group(boosGroup, workerGroup)
                    // 设置channel类型为NIO类型
                   .channel(NioServerSocketChannel.class)
                   // 设置连接配置参数
                   .option(ChannelOption.SO_BACKLOG, 1024)
                   .childOption(ChannelOption.SO_KEEPALIVE, true)
                   .childOption(ChannelOption.TCP_NODELAY, true)
                   // 配置入站、出站事件handler
                   .childHandler(new ChannelInitializer<NioSocketChannel>() {
                       @Override
                       protected void initChannel(NioSocketChannel ch) {
                           // 配置入站、出站事件channel
                           ch.pipeline().addLast(...);
                           ch.pipeline().addLast(...);
                       }
       });
    
           // 绑定端口
           int port = 8080;
           serverBootstrap.bind(port).addListener(future -> {
               if (future.isSuccess()) {
                   System.out.println(new Date() + ": 端口[" + port + "]绑定成功!");
               } else {
                   System.err.println("端口[" + port + "]绑定失败!");
               }
           });
    }
    

    基本过程如下:

    1. 初始化创建2个NioEventLoopGroup,其中boosGroup用于Accetpt连接建立事件并分发请求,
      workerGroup用于处理I/O读写事件和业务逻辑
    2. 基于ServerBootstrap(服务端启动引导类),配置EventLoopGroup、Channel类型,连接参数、配置入站、出站事件handler
    3. 绑定端口,开始工作

    结合上面的介绍的Netty Reactor模型,介绍服务端Netty的工作架构图:

    image

    server端包含1个Boss NioEventLoopGroup和1个Worker NioEventLoopGroup,NioEventLoopGroup相当于1个事件循环组,这个组里包含多个事件循环NioEventLoop,每个NioEventLoop包含1个selector和1个事件循环线程。

    每个Boss NioEventLoop循环执行的任务包含3步:

    1. 轮询accept事件
    2. 处理accept I/O事件,与Client建立连接,生成NioSocketChannel,并将NioSocketChannel注册到某个Worker NioEventLoop的Selector上
    3. 处理任务队列中的任务,runAllTasks。任务队列中的任务包括用户调用eventloop.execute或schedule执行的任务,或者其它线程提交到该eventloop的任务。

    每个Worker NioEventLoop循环执行的任务包含3步:

    1. 轮询read、write事件;
    2. 处I/O事件,即read、write事件,在NioSocketChannel可读、可写事件发生时进行处理
    3. 处理任务队列中的任务,runAllTasks。

    其中任务队列中的task有3种典型使用场景
    1. 用户程序自定义的普通任务

    ctx.channel().eventLoop().execute(new Runnable() {
       @Override
       public void run() {
           //...
       }
    });
    

    2. 非当前reactor线程调用channel的各种方法

    例如在推送系统的业务线程里面,根据用户的标识,找到对应的channel引用,然后调用write类方法向该用户推送消息,就会进入到这种场景。最终的write会提交到任务队列中后被异步消费。

    3. 用户自定义定时任务

    ctx.channel().eventLoop().schedule(new Runnable() {
       @Override
       public void run() {
       }
    }, 60, TimeUnit.SECONDS);
    

    技术讨论 & 疑问建议 & 个人博客

    版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议,转载请注明出处!

    相关文章

      网友评论

        本文标题:Netty工作原理架构

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