本文我们就开始对 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 |