这是我参与8月更文挑战的第16天,活动详情查看:8月更文挑战
前言
上一篇文章我们对 Reactor 模型进行了详细的讲解,
没看的,可以去瞅瞅:Netty 源码分析系列(十)Reactor 模型
其他关于 Netty 源码分析的文章链接如下:
Netty 源码分析系列(七)字节缓冲区 ByteBuf(下)
Netty 源码分析系列(六)字节缓冲区 ByteBuf(上)
Netty 源码分析系列(五)ChannelPipeline源码分析
下面我们就来探究一下 Netty 模型,Netty 采用的就是 主从 Reactor 多线程模型。
Netty 模型
下图就是 Netty 的工作原理图:
执行流程如下:
- Netty 抽象出两组线程池
BossGroup
专门负责接收客户端的连接,WorkerGroup
专门负责网络的读写。 - BossGroup 和 WorkerGroup 类型都是
NioEventLoopGroup
。 - NioEventLoopGroup 相当于一个事件循环组,这个组中含有多个事件循环 ,每一个事件循环是
NioEventLoop
。 - NioEventLoop 表示一个不断循环的执行处理任务的线程, 每个NioEventLoop 都有一个
selector
,用于监听绑定在其上的 socket 的网络通讯。 - NioEventLoopGroup 可以有多个线程,即可以含有多个
NioEventLoop
。 - 每个Boss NioEventLoop 循环执行的步骤有3步 :
+ 1、轮询accept 事件 ;
+ 2、处理accept 事件 ,与 client 建立连接 ,生成 `NioScocketChannel`,并将其注册到某个 worker NIOEventLoop 上的 selector;
+ 3、处理任务队列的任务 , 即 runAllTasks。
- 每个 Worker NIOEventLoop 循环执行的步骤 :
+ 1、轮询`read`,`write` 事件 处理 I/O 事件, 即 `read , write` 事件;
+ 2、在对应`NioScocketChannel`处理;
+ 3、处理任务队列的任务 , 即 `runAllTasks`;
- 每个Worker NIOEventLoop 处理业务时,会使用
pipeline(管道)
,pipeline 中包含了channel
,即通过pipeline
可以获取到对应通道,管道中维护了很多的 处理器(ChannelHandler
)。
代码示例
引入Maven依赖
1 | java复制代码<dependency> |
服务端的管道处理器
1 | java复制代码public class NettyServerHandler extends ChannelInboundHandlerAdapter { |
服务端主程序
1 | java复制代码public class NettyServer { |
NioEventLoopGroup
是用来处理I/O
操作的多线程事件循环器。Netty 提供了许多不同的EventLoopGroup
的实现来处理不同的传输。
上面的服务端应用中,有两个NioEventLoopGroup
被使用。第一个叫作bossGroup
,用来接收进来的连接。第二个叫作workerGroup
,用来处理已经被接收的连接,一旦 bossGroup
接收连接,就会把连接的信息注册到workerGroup
上。
ServerBootstrap
是一个NIO服务的引导启动类。可以在这个服务中直接使用Channel
。
group
方法用于 设置EventLoopGroup
。- 通过
Channel
方法,可以指定新连接进来的Channel
类型为NioServerSocketChannel
类。 childHandler
用于指定ChannelHandler
,也就是前面实现的NettyServerHandler
。- 可以通过
option
设置指定的Channel
来实现NioServerSocketChannel
的配置参数。 childOption
主要设置SocketChannel
的子Channel
的选项。bind
用于绑定端口启动服务。
客户端管道处理器
1 | java复制代码public class NettyClientHandler extends ChannelInboundHandlerAdapter { |
客户端主程序
1 | java复制代码public class NettyClient { |
客户端只需要一个NioEventLoopGroup
就可以了。
测试运行
分别启动服务器 NettyServer
和客户端 NettyClient
程序
服务端控制台输出内容:
1 | ini复制代码.....服务器 is ready... |
客户端控制台输出内容:
1 | ini复制代码客户端 ok.. |
至此,一个简单的基于Netty开发的服务端和客户端就完成了。
总结
本篇文章主要讲解了 Netty 的工作原理及简单应用。下节我们来讲解 Netty 的编解码。
结尾
我是一个正在被打击还在努力前进的码农。如果文章对你有帮助,记得点赞、关注哟,谢谢!
本文转载自: 掘金