netty 源码分析(一)

架构设计

文章目录

    • 架构设计
      • 1.核心组件
        • 1.1 Channel
        • 1.2 EventLoopGroup
        • 1.3 ChannelHandler
        • 1.4 ChannelHandlerContext
        • 1.5 ChannelPipeLine
        • 1.6 AbstractBootstrap
      • 2. 核心组件架构
        • 2.1服务端启动
        • 2.2 服务端处理其它事件流程

1.核心组件

1.1 Channel

netty 通道顶层接口
netty 源码分析(一)_第1张图片

  1. AbstractChannel
    顶层抽象类,内部主要维护面信息
   private final Channel parent;
    private final ChannelId id;
    private final Unsafe unsafe;
    private final DefaultChannelPipeline pipeline;
    private final VoidChannelPromise unsafeVoidPromise = new VoidChannelPromise(this, false);
    private final CloseFuture closeFuture = new CloseFuture(this);
   
    private volatile SocketAddress localAddress;
    private volatile SocketAddress remoteAddress;
    //该channel所绑定的事件循环器
    private volatile EventLoop eventLoop;
    //是否已注册到eventloop
    private volatile boolean registered;
    private boolean closeInitiated;

虽然有众多实现,但下面两为较为核心实现,后面重点分析该两实现
3. NioSocketChannel 表示Nio客户端 Socket连接,内部封装了底层的nio socket
netty 源码分析(一)_第2张图片
3. NioServerSocketChannel 表示Nio服务端 Socket ,主要用于接收客户端入处理,内部封装底层的nio ServerSocket
netty 源码分析(一)_第3张图片
4. ReflectiveChannelFactory channel创建工厂,客户端或服务端channel都由该工厂通过反射来创建,通道在创建的过程中,就为其创建一个ChannelPipeLine,用于后继管理ChannelHandler

1.2 EventLoopGroup

事件循环组接口
netty 源码分析(一)_第4张图片
netty 源码分析(一)_第5张图片
上面标记了常用的核心实现

  1. NioEventLoop 从上面继承关系可知该类绑定单个线程
    netty 源码分析(一)_第6张图片
  2. NioEventLoopGroup 从源码可得知一组NioEnventLoop,是一对多的关系
    netty 源码分析(一)_第7张图片

1.3 ChannelHandler

通道处理器,设计用于出入站事件流处理,例如,接入事件,读事件,写事件,编解码等

  1. ChannelInboundHandler 继承于ChannelHandler,入站事件处理顶层接口,客户端channle的注册(eventloop),读取channel消息
  2. ChannelOutboundHandler 继承于ChannelHandler,出 站事件处理顶层接口,服务端绑地址端口,客户端连接服务端等操作
  3. ChannelDuplexHandler 集成了出入事件的处理,用于简化应用程序,应用业务处更通常继续这个类去实现

1.4 ChannelHandlerContext

netty 源码分析(一)_第8张图片
netty 源码分析(一)_第9张图片

  1. AbstractChannelHandlerContext 从该抽象中,可知channelHandlerContext 实质是一个双向链表结构,有两个继承者分别为
  2. DefaultChannelHandlerContext 内部维护了一个ChannelHandler
  3. HeadContext 并没有维护一个ChannelHandler,而是实现了ChannelOutboundHandler,ChannelInboundHandler 接口,其自身就是一个handler,可见其会处理一部分出入站事
  4. TailContext 也没有维护一个ChannelHandler,而是实现了ChannelInboundHandler接口,其自身就是一个handler,可见其专业处理部分入站事件

1.5 ChannelPipeLine

专用于出入事件handler链管理,事件处理链路流向管理,每新建一个channel将为其他创建一个新PipeLine,并将相应的handler

netty 源码分析(一)_第10张图片

  1. DefaultChannelPipeline ChannelPipeLine 接口默认实现,创建实例时,默认创建HeadContext,TailContext实例
    netty 源码分析(一)_第11张图片

1.6 AbstractBootstrap

抽象启动引导类,具有实现有客户端和服务端
netty 源码分析(一)_第12张图片

  1. Bootstrap 客户端启动类
    作用主要服务启动客端socket连接服务端,通常绑定一个EventLoopGroup处理各种出入端事件

  2. ServerBootstrap 服务端启动类
    作用主要服务启动服务端Socket,并开启接受客户端接入,通常绑定两个EventLoopGroup,一个作用于客户端socket接入事件,一个用于处理客户端其它事件,如read或write等事

  3. ServerBootstrapAcceptor 客户端接入处理器
    服务端(ServerBootstrap)初始化是被添加到SeverSocketChannel所在的PipeLine后面

     public void channelRead(ChannelHandlerContext ctx, Object msg) {
           //收到NioSocketChannel接入
            final Channel child = (Channel) msg;
            child.pipeline().addLast(childHandler);
            setChannelOptions(child, childOptions, logger);
            for (Entry, Object> e: childAttrs) {
                child.attr((AttributeKey) e.getKey()).set(e.getValue());
            }

            try {
                //给刚接入的channel绑定一个eventloop
                childGroup.register(child).addListener(new ChannelFutureListener() {
                    @Override
                    public void operationComplete(ChannelFuture future) throws Exception {
                        if (!future.isSuccess()) {
                            forceClose(child, future.cause());
                        }
                    }
                });
            } catch (Throwable t) {
                forceClose(child, t);
            }
        }
 
  

2. 核心组件架构

2.1服务端启动

netty 源码分析(一)_第13张图片

2.2 服务端处理其它事件流程

netty 源码分析(一)_第14张图片

你可能感兴趣的:(java-web,netty,框架源码详解)