| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [View Raw Code] [Original HTTPS Page] |
Netty
1. netty 是什么
2. Reactor 模式
2.1. 单线程Reactor
2.2. 多线程Reactor
2.3. 主从多线程Reactor
3. Netty的核心组件
3.1. Channel
3.2. EventLoop
3.3. ChannelHandler 和 ChannelPipeline
3.4. Bootstrap 和 ServerBootstrap 引导类
4. 什么是 TCP 粘包/拆包
5. 其他
TODO
Reactor模式基于事件驱动,特别适合处理海量的I/O事件
Reactor线程模型分为单线程模型、多线程模型以及主从多线程模型。
单线程 Reactor 的优点是对系统资源消耗特别小,但是,没办法支撑大量请求的应用场景并且处理请求的时间可能非常慢
Channel 为 Netty 网络操作(读写等操作)抽象类,EventLoop 负责处理注册到其上的Channel 处理 I/O 操作,两者配合参与 I/O 操作。
Channel 接口是 Netty 对网络操作抽象类,它除了包括基本的 I/O 操作,如 bind()、connect()、read()、write() 等。 比较常用的Channel接口实现类是NioServerSocketChannel(服务端)和NioSocketChannel(客户端),这两个 Channel 可以和 BIO 编程模型中的ServerSocket以及Socket两个概念对应上。
EventLoop 定义了 Netty 的核心抽象,用于处理连接的生命周期中所发生的事件。负责监听网络事件并调用事件处理器进行相关 I/O 操作的处理。
EventLoopGroup 包含多个 EventLoop(每一个 EventLoop 通常内部包含一个线程),EventLoop 处理的 I/O 事件都将在它专有的 Thread 上被处理,即 Thread 和 EventLoop 属于 1 : 1 的关系,从而保证线程安全。
客户端连接处理流程:
ChannelHandler 是消息的具体处理器。他负责处理读写操作、客户端连接等事情。
ChannelPipeline 为 ChannelHandler 的链,提供了一个容器并定义了用于沿着链传播入站和出站事件流的 API 。当 Channel 被创建时,它会被自动地分配到它专属的 ChannelPipeline。
b.group(eventLoopGroup)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
ch.pipeline().addLast(new NettyKryoDecoder(kryoSerializer, RpcResponse.class));
ch.pipeline().addLast(new NettyKryoEncoder(kryoSerializer, RpcRequest.class));
ch.pipeline().addLast(new KryoClientHandler());
}
});
ServerBootstrap服务端启动: 1.首先你创建了两个 NioEventLoopGroup 对象实例:bossGroup 和 workerGroup。
Bootstrap客户端启动: 1.创建一个 Bootstrap、NioEventLoopGroup 对象实例 2.通过 .group() 方法给引导类 Bootstrap 配置一个线程组 3.通过channel()方法给引导类 Bootstrap指定了 IO 模型为NIO 4.通过 .childHandler()给引导类创建一个ChannelInitializer ,然后指定了客户端消息的业务处理逻辑 ClientHandler 对象 5.调用 Bootstrap 类的 connect()方法进行连接,这个方法需要指定两个参数:IP、端口
粘包与拆包:基于 TCP 发送数据的时候,出现了多个字符串“粘”在了一起或者一个字符串被“拆”开的问题。
Netty 自带的解码器
Netty 长连接、心跳机制
Netty 的零拷贝
| Back | FazBrowse Home | New Git URL |