Netty核心组件

Netty 核心组件结构

overview.jpg

Bootstrap/ServerBootstrap

Bootstrap

启动一个Channel对于一个客户端。
bind()使用在面向无连接的协议,例如UDP。而对于TCP连接,使用connect()方法。

ServerBootstrap

启动一个ServerChannel, 监听端口

区别

图一.jpg
图二.jpg
ServerBootstrap 绑定一个端口为了获取连接,而Bootstrap需要客户端应用连接到远程的端点。
Bootstrap 只需要一个EventLoopGroup,但是ServerBootstrap要求2个(但是可以相同),为什么呢?
服务端需要区分2组Channel ,第一组包含一个ServerChannel用于服务端监听端口,第二组包含剩余的用于处理客户端的连接,从上面的图二也可以看出。

源码片段

Bootstrap#group()group()调用父类AbstractBootstrap#group(EventLoopGroup)

  public B group(EventLoopGroup group) {
          if (group == null) {
              throw new NullPointerException("group");
          }
          if (this.group != null) {
              throw new IllegalStateException("group set already");
          }
          this.group = group;
          return (B) this;
  }

ServerBootstrap

   @Override
      public ServerBootstrap group(EventLoopGroup group) {
          return group(group, group);
      }

      /**
       * Set the {@link EventLoopGroup} for the parent (acceptor) and the child (client). These
       * {@link EventLoopGroup}'s are used to handle all the events and IO for {@link ServerChannel} and
       * {@link Channel}'s.
       */
      public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup) {
          super.group(parentGroup);
          if (childGroup == null) {
              throw new NullPointerException("childGroup");
          }
          if (this.childGroup != null) {
              throw new IllegalStateException("childGroup set already");
          }
          this.childGroup = childGroup;
          return this;
      }

EventLoopGroup/EventLoop

  • 一个EventLoopGroup包含一个或多个EventLoop
  • 一个EventLoop的生命周期绑定了一个线程
  • EventLoop处理的所有I/O事件都在其专用线程上处理。
  • 一个Channel使用一个EventLoop来注册它的生命周期。
    图三.jpg
    这里的设计,I/O会在指定的Channel相同的线程上执行,从而避免了同步。

ChannelPipeline

ChannelPipeline 提供了容器对于一串ChannelHandler 和定义了于沿着链路入站和出站事件流的API。当一个Channel的创建,将会分配一个ChannelPipeline
图四.jpg

Channel

Channel对应着一个Socket,Netty 的Channel对JDK Socket进行了封装。

ChannelFuture

在Netty上所有的操作都是异步,由于操作可能不会立刻返回,我们需要一段时间返回结果的方法。ChannelFuture 类似一个占位符,对于未来执行的操作的结果。

ChannelInitializer

ChannelInitializer 自定义键ChannlHandler 添加到ChannelPipeline中,也可以移除。

ChannelHandler

主要是用于逻辑处理,在入站和出站的时候,通过网络事件触发的方法执行,更多的是数据转换和异常处理。

添加新评论