Netty源代码阅读

来源:互联网 发布:制造业数据分析 2016 编辑:程序博客网 时间:2024/05/22 13:26

JavaNio 模型

    JavaNIO分NIO1.0和2.0,主要区别是同步非阻塞还是异步非阻塞,差别不大,主要是读写是由谁来完成的问题,业务模型基本类似

   注册Key,监听端口,无限循环查询是否有读写事件(此处可阻塞),获取连接或者读取事件后进行处理(可在本线程内或者另起线程内进行处理)


Netty中对该功能的封装

  可以这么理解,Netty对JavaNio进行了进一步的封装,用户不再关心接口监听,客户端连接等,通过接口ChannelHandler来约定用户感兴趣的事件

同时通过线程组分别处理端口连接监听和业务逻辑处理部分,处理逻辑更加清晰。设计到主要的类如下


EventLoopGroup 通用线程池,Nio主要对应 NioEventLoopGroup

                             其中处理客户连接主要在这里,这里会通过MultithreadEventExecutorGroup 中的 children 对象创建一组(默认为cpu核数*2)个大小的线程池,具体的线程对象    为NioEventLoop

NioEventLoop   业务处理线程

                             具体干活的线程就是他了,线程在初始化的时候打开连接,运行时,不断监听对应的SocketChannel对象,如有事件到来(读,写),则触发不同的处理逻辑

连接事件则触发NioServerSocketChannel,数据读取事件则触发 ServerSocketChannel,均为 doReadMessages方法


ServerBootstrap 服务端启动器

                             这里主要注册事件线程,业务处理ChannelHandler,这里有个非常有意思的地方,注册时大部分是一个ChannelInitializer类,只实现一个方法 initChannel,注册相应的事件处理Handler


Netty处理流程

                  ServerBootstrap 初始化之后,在调用bind方法后,开始执行初始化操作,创建NioServerSocketChannel对象,执行bind操作,当bind操作成功后,将 ServerBootstrap.ServerBootstrapAcceptor注册到事件处理管道中,之后开始监听端口,ServerBootstrap.ServerBootstrapAcceptor存在主要是缓存我们提供的ChannelHandler对象,如果有客户但连接过来时,为Selector.accept()方法获取的SocketChannel对象提供处理线程和处理Hanlder

原创粉丝点击