Netty(六)——Server创建流程之解

        前边的篇章已经把Netty的使用:包括Server创建、Client创建、粘包/拆包问题处理、编码解码支持、http协议开发、WebSocket协议编写等。接下来,我们来看看源码学习一下流程,原理。(个人认为,源码学习是一个了解牛人设计思想、学习高人编码方式、扩宽自己解决问题之道的很好途径)

       服务端创建,前边写了那么多的例子,慢慢大家就会发现,其实是有套路的(也就是有规律(道理)的),可以随便拿前边的一个服务端创建的例子进行跟踪分析,先看下时序图,我们按流程梳理下:

Netty(六)——Server创建流程之解_第1张图片

       一,创建ServerBootstrap实例:ServerBootstrap是Netty服务端的启动辅助类,它提供了一系列的方法用于设置服务端启动相关参数,这里用到了Faced设计模式(降低和过多底层API打交道);另外ServerBootstrap在创建时,是无参的,只需要后边设置对应的参数即可,这边其实是用到了Builder设计模式(只需要关心多个简单的对象构建,不需要关心对象创建的内部细节)。类名:ServerBootstrap

        二,设置并绑定Reactor线程池:b.group(bossGroup,workerGroup),Netty的Reactor线程池是EventLoopGroup,EventLoop的数组。EventLoop的职责是处理所有注册到本线程多路复用器Selector上的channel,Selector的轮询操作由绑定的EventLoop线程run方法启动。EventLoop的职责不仅仅是处理网络I/O事件,还包括用户自定义的task等,都在一个线程内进行完成。类名:NioEventLoop

        三,设定并绑定服务端Channel,b.channel(NioServerSocketChannel.class),Netty通过工厂类,利用反射创建NioServerSocketChannel对象。类名:AbstractBootstrap、ReflectiveChannelFactory

        四,链路建立时创建并初始化ChannelPipeple。ChannelPipeple本质是一个负责处理网络事件的职责链,负责管理和执行ChannelHadnler,网络事件以流的形式在ChannelPipeline中流转,根据执行策略调度ChannelHandler执行。典型的网络事件有:1,链路注册;2,链路激活;3,链路断开;4,接收到请求消息;5,请求消息接收并处理完毕;6,发送应答消息;7,链路发生异常处理;8,发生用户自定义事件等。类名:ChannelInitializer

       五,设置ChannelPipeple,添加ChannelHandler:ch.pipeline().addLast("http-decoder",newHttpRequestDecoder());。ChannelHandler是Netty提供给用户定制和扩展的关键接口,我们可以通过ChannleHandler完成大多数的功能定制。例如:消息编解码、心跳、安全认真、TSL/SSL认证、流量控制等。同时Netty也提供了大量的系统ChannelHandler供用户使用,例如:1,系统编解码框架——ByteToMessageCodec;2,通用基于长度和半包解码器——LengthFieldBasedFrameDecoder;3,码流日志打印Handler——LoggingHandler;4,SSL安全认证Handler——SslHandler;5,链路空闲检测Handler——IdleStateHandler;5,流量整形Handler——ChannelTrafficShapingHandler;6,Base64编解码——Base64Decoder和Base64Encoder等。类名:ChannelPipeple,里边有我们先要的各种设置方法。

       六,绑定启动监听端口(ChannelFuturefuture=b.bind("localhost",port).sync();),在类中:AbstractBootstrap。

       七,Selector轮询,由Reactor线程NioEventLoop负责调度和执行Selector轮询操作。类NioEventLoop中的private void select(boolean oldWakenUp) throws IOException{}。

       八,当轮询到准备就绪的Channel之后,就由Reactor线程NioEventLoop执行ChannelPipeline的相应方法,最终调度并执行ChannelHandler。类:ChannelPipeline

       九,执行Netty系统ChannelHandler和用户添加开发的ChannelHandler,ChannelPipeline根据网络事件类型,调度并执行。AbstractChannelHandlerContext中的fireChannelRead()。

 

      好,上边说的是Server创建并提供服务的整个流程,接下来,我们来看下,客户端接入的过程:

      当有新的客户端连接接入时,多路服务器检测到新的准备就绪的Channel时,NioEventLoop执行processSelectedKeys方法中的processSelectedKeysOptimized(selectedKeys.flip());进入到processSelectedKeysOptimized方法中,由于Channel的Attachment是NioServerSocketChannel,所以执行processSelectedKey(k,(AbstractNioChannel)a)方法,由于是监听的连接操作,执行unsafe.read(),read()方法的实现由两个,分别为NioByteUnsafe和NioMessageUnsafe,对于NioServerSocketChannel,它使用的NioMessageUnsafe,可以看下代码,里边的int localRead=doReadMessages(readBuf),进入了NioServerSocketChannel的doReadMessage(List buf),里边Socket  Channelch=javaChannel().accept();创建NioSocketChannel并接受,然后再触发ChannelPipeline的ChannelRead方法,在ChannelPipeline中传递,并执行操作。

 

       好,上边就是Netty创建Server的流程,通过阅读源码,了解设计的思想,例如Reactor模式,各种设计模式、充分利用面向对象的各种关系、如何封装、如何解耦、如何达到高内聚低耦合等等。学习道路任重道远哈……

你可能感兴趣的:(学习,Java,netty,Netty系列学习,netty,server,nio)