java上古大能 潜水
  • 1发帖数
  • 1主题数
  • 0关注数
  • 0粉丝
开启左侧

Netty 焦点源码解读——ServerBootstrap 篇

[复制链接]
java上古大能 发表于 2021-9-7 18:08:31 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
本文我们就开始对 ServerBootstrap 举行源码解读(4.1.51.Final-SNAPSHOT),为什么是 ServerBootstrap,记得在用 Netty 做第一个项目的时候,写的第一行 Code 就是 new ServerBootstrap(),ServerBootstrap 是 Netty Server 的启动类,所以从它开始相识 Netty 是最合适的。

ServerBootstrap

## TcpServer.javaprivate final EventLoopGroup bossGroup = new NioEventLoopGroup(BIZ_GROUP_SIZE);private final EventLoopGroup workerGroup = new NioEventLoopGroup(BIZ_THREAD_SIZE);public void init() throws Exception {    // Server 服务启动    ServerBootstrap bootstrap = new ServerBootstrap();    bootstrap.group(bossGroup, workerGroup);    bootstrap.channel(NioServerSocketChannel.class);    bootstrap.childHandler(new ServerChannelInitializer(serverConfig));    // 可选参数    bootstrap.childOption(ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK, 32 * 1024);    // 绑定接口,同步等待成功    ChannelFuture future = bootstrap.bind(port).sync();    ChannelFuture channelFuture = future.addListener(new ChannelFutureListener() {        public void operationComplete(ChannelFuture future) throws Exception {        }    });}
这是我在做 TCP 网关时写的 Netty Server 的代码片段(https://github.com/SongranZhang/tcp-gateway/blob/master/src/main/java/com/linkedkeeper/tcp/connector/tcp/server/TcpServer.java),可以看到,Netty Server 的初始化首先是通过 ServerBootstrap 的无参构造函数创建一个对象,接着是这个对象的一串链式调用 bootstrap.group().channel().childHandler().childOption(),而服务启动的真正触发点是这段 bootstrap.bind(port).sync(),下面我们就逐一来分析下这里的每个方法。

首先是 group() 方法。

## ServerBootstrap.javaprivate volatile EventLoopGroup childGroup;public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup) {    super.group(parentGroup);    if (this.childGroup != null) {        throw new IllegalStateException("childGroup set already");    }    this.childGroup = ObjectUtil.checkNotNull(childGroup, "childGroup");    return this;}
这里 workerGroup 赋值给了 ServerBootstrap 的 childGroup,bossGroup 赋值给了父类 AbstractBootstrap 的 group。

## AbstractBootstrap.javavolatile EventLoopGroup group;public B group(EventLoopGroup group) {    ObjectUtil.checkNotNull(group, "group");    if (this.group != null) {        throw new IllegalStateException("group set already");    }    this.group = group;    return self();}
接下来是 channel() 方法。

## AbstractBootstrap.javaprivate volatile ChannelFactory, Object> childOptions = new LinkedHashMap
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

猜你喜欢
在线客服邮箱
wxcy#wkgb.net

邮箱地址#换为@

Powered by 创意电子 ©2018-现在 专注资源实战分享源码下载站联盟商城