Netty Bootstrap(图解)
疯狂创客圈 Java 分布式聊天室【 亿级流量】实战系列之18 【 博客园 总入口 】
源码工程源码IDEA工程获取链接:Java 聊天室 实战 源码
写在前面 大家好,我是作者尼恩。
今天是百万级流量 Netty 聊天器 打造的系列文章的第18篇,这是一个基础篇,介绍Bootstrap。
力争以图文并茂的形式,做到非常的易懂。
图解几个重要概念下面的几个概念,非常重要。
之前没有认真介绍,下面图解说明一下。
父子 channel 在 Netty 中, Channel 是一个 Socket 连接的抽象, 它为用户提供了关于底层 Socket 状态(是否是连接还是断开) 以及对 Socket 的读写等操作。
每当 Netty 建立了一个连接后, 都会有一个对应的 Channel 实例。
并且,有父子channel 的概念。 服务器连接监听的channel ,也叫 parent channel。 对应于每一个 Socket 连接的channel,也叫 child channel。
EventLoop 线程与线程组在看本文之前,如果不明白 reactor 线程和reactor模式,请 查看 疯狂创客圈的专门文章:Reactor模式 。
在Netty 中,每一个 channel 绑定了一个thread 线程。
一个 thread 线程,封装到一个 EventLoop , 多个EventLoop ,组成一个线程组 EventLoopGroup。
反过来说,EventLoop 这个相当于一个处理线程,是Netty接收请求和处理IO请求的线程。 EventLoopGroup 可以理解为将多个EventLoop进行分组管理的一个类,是EventLoop的一个组。
他们的对应关系,大致如下:
通道与Reactor线程组 这里主要是涉及的是服务器端。
服务器端,一般有设置两个线程组,监听连接的 parent channel 工作在一个独立的线程组,这里名称为boss线程组(有点像负责招人的包工头)。
连接成功后,负责客户端连接读写的 child channel 工作在另一个线程组,这里名称为 worker 线程组,专门负责搬数据(有点儿像搬砖)。
除了 TCP 协议以外, Netty 还支持很多其他的连接协议, 并且每种协议还有 NIO(异步 IO) 和 OIO(Old-IO, 即传统的阻塞 IO) 版本的区别。
不同协议不同的阻塞类型的连接都有不同的 Channel 类型与之对应,下面是一些常用的 Channel 类型:NioSocketChannel, 代表异步的客户端 TCP Socket 连接.
NioServerSocketChannel, 异步的服务器端 TCP Socket 连接.
NioDatagramChannel, 异步的 UDP 连接
NioSctpChannel, 异步的客户端 Sctp 连接.
NioSctpServerChannel, 异步的 Sctp 服务器端连接.
OioSocketChannel, 同步的客户端 TCP Socket 连接.
OioServerSocketChannel, 同步的服务器端 TCP Socket 连接.
OioDatagramChannel, 同步的 UDP 连接
OioSctpChannel, 同步的 Sctp 服务器端连接.
OioSctpServerChannel, 同步的客户端 TCP Socket 连接.
启动器初步介绍Bootstrap 是 Netty 提供的一个便利的工厂类,可以通过它来完成 Netty 的客户端或服务器端的 Netty 初始化。
当然,Netty 的官方解释说,可以不用这个启动器。
但是,一点点去手动创建channel 并且完成一些的设置和启动,会非常麻烦。还是使用这个便利的工具类,会比较好。
有两个启动器,分别应用在服务器和客户端。
如下图:
两个启动器大致的配置,都是相同的。
下面以服务器serverBootstrap 启动类为主要的介绍对象。
图解 Bootstrap执行流程 首先,创建了一个引导器 ServerBootstrap 实例,这个专门用于引导服务端的启动工作,直接new 创建即可。(客户端的引导器差不多,不过是创建Bootstrap 实例)
// 启动引导器 private static ServerBootstrap b = new ServerBootstrap(); 启动一个Bootstrap,大致有8步,如下图: