Netty笔记(八)之Bootstrap

netty版本

  1. netty版本:io.netty:netty-all:4.1.33.Final

Bootstrap

  1. 引导(Bootstrap)一个应用程序是对它进行配置,并使它运行起来的过程。Netty处理引导的方式使你的应用程序和网络层相隔离,无论它是客户端还是服务器。

  2. Boostrap类层次结构,两种应用程序类型之间通用的引导步骤由AstractBootstrap处理,而特定于客户端或者服务器的引导步骤则分别由 BootstrapServerBootstrap处理。

  3. AstractBootstrap为什么是Cloneable的?因为有时可能需要创建多个具有类似配置或者完全相同配置的Channel。为了支持这种模式而又不需要为每个Channel都创建并配置一个新的引导类实例。调用引导类的clone()方法只会创建引导类实例的EventLoopGroup的一个浅拷贝,所以EventLoopGroup将在所有克隆的Channel实例之间共享。这是可以接受的,因为通常这些克隆的Channel的生命周期都很短暂,一个典型的场景是:创建一个Channel以进行一次 HTTP 请求

  4. AbstractBootstrap类签名中,子类型B是其父类型的一个类型参数,因此可以返回到运行时实例的引用以支持方法的链式调用

       public abstract class AbstractBootstrap<B extends AbstractBootstrap<B, C>, C extends Channel> implements Cloneable
       //客户端
       public class Bootstrap extends AbstractBootstrap<Bootstrap, Channel> 
       //服务端
       public class ServerBootstrap extends AbstractBootstrap<ServerBootstrap, ServerChannel>
    
    
  5. 一般情况下,Boostrap有1个EventLoopGroup,ServerBootstrap有2个EventLoopGroup(当然也可以使用1个,只不过此时共用一个EventLoopGroup)。服务器需要两组不同的Channel。 第一组将只包含一个ServerChannel,代表服务器自身的已绑定到某个本地端口的正在监听的Socket。而第二组将包含所有已创建的用来处理传入客户端连接(对于每个服务器已经接受的连接都有一个)的Channel

  6. Netty服务端拥有使用两种不同的组的原因是因为在一个应用程序接收大量连接的情况中,单个的EventLoopGroup 可能会成为一个瓶颈,如果EventLoop忙于处理已经接收到的连接,因此不能够即时地接收新的连接。最终的结果可能是某些连接超时。通过有两个 EventLoopGroup,所有的连接可以被接收,即使在非常高的负载中,因为 EventLoop(底层的线程)接收连接不会和这些处理已经接收的连接共享。

  7. 一个EventLoopGroup(服务端两个相同的EventLoopGroup处理图
    Netty允许相同的 EventLoopGroup 用于处理IO和接收连接。实际上,这个对于许多应用程序工作良好)

  8. 两个EventLoopGroup

Bootstrap

  1. Bootstrap类被用于客户端或者使用了无连接协议的应用程序中(也适用于DatagramChannel)。方法

    方法描述
    Bootstrap group(EventLoopGroup)设置用于处理 Channel 所有事件的 EventLoopGroup
    Bootstrap channel( Class<? extends C>)
    Bootstrap channelFactory( ChannelFactory<? extends C>)channel()方法指定了 Channel 的实现类。如果该实现 类没提供默认的构造函数,可以通过调用 channelFactory()方法来指定一个工厂类,它将会被 bind()方法调用
    Bootstrap localAddress ( SocketAddress)指定Channel应该绑定到的本地地址。如果没有指定,则将由操作系统创建一个随机的地址。或者,也可以通过bind()或者connect()方法指定 localAddress
    Bootstrap option( ChannelOption option, T value)设置 ChannelOption,其将被应用到每个新创建的 Channel 的 ChannelConfig。这些选项将会通过bind()或者connect()方法设置到 Channel,不管哪个先被调用 。这个方法在 Channel 己经被创建后再调用将不会有任何的效果。支持的 ChannelOption取决于 使用的 Channel 类型。
    Bootstrap attr( Attribute key, T value)指定新创建的 Channel 的属性值。这些属性值是通过bind()或者 connect()方法设置到 Channel 的 , 具体取决于谁最先被调用。这个方法在 Channel 被创建后将不会有任何的效果。
    Bootstrap handler(ChannelHandler)设置将被添加到 ChannelPipeline 以接收事件通知的ChannelHandler
    Bootstrap clone()创建一个当前Bootstrap的克隆,其具有和原始的 Bootstrap 相同的设置信息
    Bootstrap remoteAddress( SocketAddres s)设置远程地址。或者,也可以通过 connect()方法来指定它
    ChannelFuture connect()连接到远程节点并返回 一个 ChannelFuture,其将会在连接操作完成后接收到通知
    ChannelFuture bind()绑定 Channel 并返回一个 ChannelFuture,其将会在绑定操作完成后接收到通知,在那之后必须调用 Channel.connect()方法来建立连接

ServerBootstrap

  1. 方法

    方法描述
    group设置 ServerBootstrap 要用的 EventLoopGroup。这个 EventLoopGroup 将用于 ServerChannel 和被接受的子 Channel 的 I/O处理
    channel设置将要被实例化的 ServerChannel 类
    channelFactory如果不能通过默认的构造函数创建 Channel,那么可以提供一个 ChannelFactory
    localAddress指定 ServerChannel应该绑定到的本地地址。如果没有指定,则将由操作系 统使用一个随机地址。或者,可以通过 bind()方法来指定该 localAddress
    option指定要应用到新创建的 ServerChannel 的 ChannelConfig 的 ChannelOption。这些选项将会通过bind()设置到 Channel。在 bind ()方法被调用之后,设置或者改变 ChannelOption 都不会有任何的效果。所支持的 ChannelOption 取决于所使用的 Channel 类型
    childOption指定当子 Channel 被接受时,应用到子Channel的 ChannelConfig 的 ChannelOption。所支持的 ChannelOption 取决于所使用的 Channel 的类型
    attr指定 ServerChannel 上的属性,届性将会通过 bind()方法设置给 Channel。 在调用 bind()方法之后改变它们将不会有任何的效果
    childAttr将属性设置给已经被接受的子 Channel。接下来的调用将不会有任何的效果
    handler设置被添加到 ServerChannel 的 ChannelPipeline 中的 ChannelHandler
    childHandler设置将被添加到己被接受的子Channel的ChannelPipeline中的 ChannelHandler。 handler()方法和 childHandler()方法之间的区别是:前者所添加的 ChannelHandler 由接受子Channel的 ServerChannel 处理,而 childHandler()方法所添加的 ChannelHandler 将由己被接受的子 Channel 处理,其代表一个绑定到远程节点的Socket
    clone克隆一个设置和原始的 ServerBootstrap 相同的 ServerBootstrap
    bind绑定 ServerChannel 并且返回一个 ChannelFuture,其将会在绑定操作 完成后收到通知(带着成功或者失败的结果)
  2. ServerBootstrap 在 bind()方法被调用时创建了一个ServerChannel , 并且该 ServerChannel管理了多个子ChannelServerChannel的实现负责创建子Channel,这些子Channel代表了已被接受的连接。

  3. 如果服务端需要请求第三方系统的Server服务器,此时可以创建一个Bootstrap实例,但是EventLoop不需要针对每个Channel都创建一个,因为这会产生额外的线程,服务端子Channel与客户端Channel之间交换数据时会有上下文切换的开销。可以直接利用服务端的EventLoop,避免额外的线程创建

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值