java上古大能 发表于 2021-9-7 18:08:31

Netty 焦点源码解读——ServerBootstrap 篇

本文我们就开始对 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
页: [1]
查看完整版本: Netty 焦点源码解读——ServerBootstrap 篇