Netty进阶学习之原理解析

Netty的核心组件

1、Bootstrap、ServerBootstrap

Bootstrap和ServerBootstrap是Netty提供的一个创建客户端和服务端的一个启动器,主要作用是配置整个Netty程序,串联各个组件。

 EventLoopGroup bossGroup = new NioEventLoopGroup(1);
 EventLoopGroup workGroup = new NioEventLoopGroup();
 ServerBootstrap serveBootstrap = new ServerBootstrap();
 serverBootstrap.group(bossGroup, workGroup)//设置两个线程组
           .channel(NioServerSocketChannel.class)//NioServerSocketChannel服务器通道
           .option(ChannelOption.SO_BACKLOG, 128)//线程队列得到的连接个数
           .childOption(ChannelOption.SO_KEEPALIVE, true)//设置保持活动连接状态
           .childHandler(new ChannelInitializer<SocketChannel>() {
     
               //创建通道测试对象
               @Override
               protected void initChannel(SocketChannel socketChannel) throws Exception {
     
                   socketChannel.pipeline().addLast(new NettyServerHandler());
               }
           });

ServerBootstrap创建启动器的步骤以及常用的方法为:

public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup)

该方法用于服务端设置两个EventLoopGroup;
bossGroup:用于监听客户端连接,负责与客户端创建连接,并把连接注册到WorkerGroup的Selector中

public B channel(Class<? extends C> channelClass);

该方法用来设置一个服务器端的通道实现,建立连接后,根据这个设置创建对应的Channel实例。
常用的通道类型有:
NioServerSocketChannel:异步非阻塞的服务器端TCP Socket连接。
NioSocketChannel:异步非阻塞的客户端TCP Socket连接。

public <T> B option(ChannelOption<T> option, T value)

设置服务端用于接收进来的连接,也就是BossGroup

public <T> ServerBootstrap childOption(ChannelOption<T> childOption, T value)

是提供给父管道接收到的连接,也就是workerGroup线程。

 public ServerBootstrap childHandler(ChannelHandler childHandler)

该方法用于设置业务处理类(自定义的handler),该方法需要初始化通道,实例化一个ChannelInitializer,这时候需要重写
initChannel()方法,进行装配流水线。自定义的handler就是具体的处理请求的处理器。

public ChannelFuture bind(int inetPort)

用于绑定端口,默认是异步启动,加上sync()方法则是同步。

 ChannelFuture closeFuture()

最终关闭听到释放资源。

Future、ChannelFuture

Netty中的所有IO操作都是异步的,不能立刻得到消息是否被正确处理。但是过一会等它执行完成或者直接注册一个监听,具体的实现就是通过Future和ChannelFuture,他们可以注册一个监听,当执行成功或者失败时监听会自动触发注册的监听事件。
常见的方法:
Channel channel(),返回当前正在进行IO操作的通道。
ChannelFuture sync(),等待异步操作执行完毕。

Channel

  1. Netty网络通信的组件,能够用于执行网络IO操作。
  2. 通过Channel可以获得当前网络连接的通道的状态。
  3. 可以获得网络连接的配置参数(比如:缓冲区的大小)
  4. Channel提供异步的网络I/O操作,(比如:建立连接,读写,绑定端口)
  5. 不同协议、不同的阻塞类型的连接都有不同的Channel类型与之对应,常见的类型有:
    NioServerSocketChannel:异步非阻塞的服务器端TCP Socket连接。
    NioSocketChannel:异步非阻塞的客户端TCP Socket连接。

Selector

Netty中的Selector和NIO中的Selector是一样的,就是用于监听事件,管理注册到Selector中的channel,实现多路复用。

  1. Netty 基于Selector对象实现I/O多路复用,通过Selector 一个线程可以监听多个连接Channel事件。
  2. 当向一个Selector中注册Channel 后,Selector内部机制可以不断的查询这些注册的Channel是否有已经就绪的I/O事件,这样程序就可以很简单的使用一个线程高效地管理多个Channel。

Pipeline和ChannelPipeline

在介绍Channel时,我们可以知道咋Channel中装配ChannelHandler流水线处理器,一个channel可以有多个处理器,并且是有顺序的。pipeline相当于处理器的容器。初始化时,把ChannelHandler按顺序装在pipeline中,按顺序执行ChannelHandler。
有个Channel中只有一个ChannelPipeline。在Channel创建时创建。

  1. ChannelPipeline是一个handler的集合,负责处理和拦截Channel的入站和出站事件。
  2. ChannelPipeline实现了一种高级形式的拦截过滤器模式,使用户可以完全控制事件的处理方式,以及Channel中各个ChannelHandler如何相互交互。
  3. 在Netty中每个Channel都有一个ChannelPipeline与之对应:
    Netty进阶学习之原理解析_第1张图片
    一个Channel包含了一个ChannelPipeline,而ChannelPipeline中又维护一个由ChannelHandlerContext组成的双向链表,并且每一个ChannelHandlerContext中又关联着一个ChannelHandler
    出站和入站事件在一个双向链表中,入站事件会从链表head往后传递到最后一个入站的handler,出站事件会从链表tail往前传递到最后一个出站的handler,两种类型的handler互补干扰。

ChannelHandlerContext

ChannelHandlerContext可以用来获取channel、pipeline等对象,进行读写操作

  1. 保存了Channel相关的所有上下文信息,痛死关联一个ChannelHandler对象
  2. ChannelHandlerContext中包含了一个具体的事件处理器ChannelHandler,同时ChannelHandlerContext也绑定channel、pipeline等对象信息,方便对ChannelHandler进行调用。

EventLoopGroup和其实现类NioEventLoopGroup

  1. EventLoopGroup是一组EventLoop的抽象,Netty为了更好的利用多核CPU资源,一般多个EventLoop同时工作,每个EventLoop维护一个Selector实例。
  2. EventLoopGroup提供next接口,可以从组里按一定规则获取其中一个EventLoop来处理任务。在Netty服务器端编程,我们一般都需要提供两个EventLoopGroup
  3. 通常一个服务端口即一个ServerSocketChannel对应一个Selector和一个EventLoop线程。BossEventLoop负责接收客户端的连接将SocketChannel交给WorkerEventLoopGroup来进行IO处理。

Unpooled类

Netty提供一个专门用来操作缓冲区(Netty的数据容器)的工具类

Netty进阶学习之原理解析_第2张图片
可以关注公众号,获取大厂面试攻略,看有趣段子,大家一起学习,一起成长。

你可能感兴趣的:(netty)