netty运行原理
所属分类 netty
浏览量 1302
1 初始化创建2个NioEventLoopGroup
boosGroup用于Accept连接并分发请求,
workerGroup用于处理I/O读写事件和业务逻辑
2 基于ServerBootstrap(服务端启动引导类),
配置EventLoopGroup、Channel类型,连接参数、配置入站、出站事件handler
3 绑定端口,开始工作
NioEventLoopGroup 事件循环组 类似线程池
包含多个事件循环NioEventLoop,每个NioEventLoop包含1个selector和1个事件循环线程
每个Boss NioEventLoop循环执行的任务
1 轮询accept事件
2 处理accept I/O事件,与Client建立连接,生成NioSocketChannel,并将NioSocketChannel注册到某个Worker NioEventLoop的Selector上
3 处理任务队列中的任务,runAllTasks。
任务队列中的任务包括用户调用eventloop.execute或schedule执行的任务,或者其它线程提交到该eventloop的任务。
每个Worker NioEventLoop循环执行的任务
1 轮询read、write事件;
2 处I/O事件,即read、write事件,在NioSocketChannel可读、可写事件发生时进行处理
3 处理任务队列中的任务,runAllTasks。
任务队列中的task有3种典型使用场景
1 用户程序自定义的普通任务
ctx.channel().eventLoop().execute(new Runnable() {
@Override
public void run() {
//...
}
});
2 非当前reactor线程调用channel的各种方法
例如在推送系统的业务线程里面,根据用户的标识,找到对应的channel引用,然后调用write类方法向该用户推送消息,就会进入到这种场景。
最终的write会提交到任务队列后被异步消费。
3 用户自定义定时任务
ctx.channel().eventLoop().schedule(new Runnable() {
@Override
public void run() {
// ...
}
}, 60, TimeUnit.SECONDS);
上一篇
下一篇
性能压测工具
netty线程模型和零拷贝机制
netty组件
netty4日志
UnsupportedClassVersionError处理
ServerBootstrap handler()和childHandler()的区别