flame

路漫漫其修远兮 吾将上下而求索

0%

网络编程框架-Netty原理

前言

Netty是一款异步事件驱动网络应用程序框架,本文进行Netty原理的梳理。

前置文章:

Todo && DONE

DONE: server端启动 —> 把各个组件连贯起来

TODO: ChannelPipeline和ChannelHandler的基本结构和原理

TODO: EventLoop的基本结构和原理

TODO: Channel的基本结构和原理

TODO: 建立链接,接受消息,关闭链接 等流程的时序图

Server端启动流程的分析

样例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// Configure the server.
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
final EchoServerHandler serverHandler = new EchoServerHandler();
try {
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 100)
.handler(new LoggingHandler(LogLevel.INFO))
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline p = ch.pipeline();
p.addLast(new LoggingHandler(LogLevel.INFO));
p.addLast(serverHandler);
}
});

// Start the server.
ChannelFuture f = b.bind(PORT).sync();

// Wait until the server socket is closed.
f.channel().closeFuture().sync();
} finally {
// Shut down all event loops to terminate all threads.
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}

ServerBootstrap

时序图

server的启动时序图

步骤1: 创建ServerBootstrap实例。

步骤2: 设置并绑定Reactor线程池。

步骤3: 设置并绑定服务端Channel。

步骤4: 链路建立时创建并初始化ChannelPipeline。

步骤5: 初始化ChannelPipeline之后,添加并设置ChannelHandler。

步骤6: 绑定并启动监听端口。

步骤7: Selector轮询。由Reactor线程NioEventLoop负责调度和执行Selector轮询操作,选择准备就绪的Channel集合。

步骤8: 当轮询到准备就绪的Channel之后,就由Reactor线程NioEventLoop执行ChannelPipeline的相应方法。

步骤9: 执行Netty系统ChannelHandler和用户添加定制的ChannelHander。ChannelPipe根据网络事件的类型,调度并执行ChannelHandler。

启动过程的整体流程

启动过程中,EventLoopGroup、NioEventLoop、NioServerSocketChannel、ChannelPipeline各个组件交互,

通过源码分析出概貌,如下图所示(在浏览器新标签页打开图片放大查看)

server端的启动过程

ChannelPipeline的分析

NioEventLoop的分析

NioServerSocketChannel的分析