netty源码浅析--线程启动

        一直对Java高并发比较感兴趣,最近在学习netty特来记录。

        提到netty首先要了解一下什么是Reactor设计模式,在网上找了一下关于Reactor设计模式的介绍,链接在文档的最下方。

        在《Scalable IO in Java》中讲到了一种多线程下的Reactor模式。
这里写图片描述
在这种设计模式中,有一个前端mainReactor主要负责响应client的连接请求并建立连接,和一个后端subReactor。mainReactor接收client的请求之后会转接给subReactor。由subReactor负责具体的客户端请求的读写工作。这样有一个好处,subReactor可以做一些比较耗时的操作,可以减少CPU因等待IO而阻塞的时间。

        知道了什么是Reactor设计模式之后,我们来看看Reactor设计模式在netty中的应用.Netty里对应mainReactor的角色叫做“Boss”,而对应subReactor的角色叫做”Worker”。Boss负责分配请求,Worker负责执行。

        在看源码之前,要首先理解几个概念:
EventLoopGroup:一个EventLoopGroup就是一组EventLoop。主要负责管理EventLoop的申请和释放。
EventLoop:处理所有的IO操作。EventLoop继承了EventLoopGroup接口,可以被当做一个single的线程池看待。

源码分析从Netty版的Hello World的开始
这里写图片描述

代码片段的前两行就是创建bossGroup和workerGroup对象。是不是感觉有点似曾相识,还记得上文我们提到的mainReactor和subReactor嘛。bossGroup起到了mainReactor的作用,workerGroup起到了subReactor的作用。

NioEventLoopGroup类继承体系如下:
这里写图片描述
从图中发现,NioEventLoopGroup既然继承了Executor,是不是猜想NioEventLoopGroup是怎么优雅的使用多线程的。

NioEventLoopGroup构造函数:

这里写图片描述

这里无非是对构造函数的封装,而最终调用父类MultithreadEventLoopGroup的构造函数

这里写图片描述

这里会判断传进来的线程数是否是0。如果是0就使用默认的线程数。
默认取-Dio.netty.eventLoopThreads,如果该系统参数也没有指定,则为可用的CPU内核数 × 2。在不需要监听多端口的情况下,bossGroup只需要1个线程即可。MultithreadEventLoopGroup构造函数会显示调用MultithreadEventExecutorGroup的构造函数

这里写图片描述

为了便于理解,去掉了一些验证逻辑和出错处理逻辑。
1.如果没有指定excutor,会先指定executor。

2.接着创建children数组,现在可以知道EventLoopGroup和EventLoop[]之间的关系。

3.通过for循环实例children数组。

这里写图片描述

在SingleThreadEventExecutor构造函数中会初始化一个任务队列,netty线程一直是在死循环中去直接IO事件和非IO事件,除了IO事件,所有非IO事件都是先丢到这个任务队列中,然后在由work线程去执行。

这里写图片描述

openSeletor会先创建selector选择器,这里完全是JDK NIO的Selector的使用方法,不在累述。

接着DISABLE_KEYSET_OPTIMIZATION是判断是否需要对sun.nio.ch.SelectorImpl中的selectedKeys进行优化, 不做配置的话默认需要优化。

SelectorImpl中的selectedKeys和publicSelectedKeys是个HashSet, 新的数据结构是双数组A和B, 初始大小1024, 避免了HashSet的频繁自动扩容, processSelectedKeys时先使用数组A,再一次processSelectedKeys时调用flip的切换到数组B, 如此反复 。为什么要做这些优化我也不是很清楚。

参考资料:
Reactor设计模式介绍:
http://www.blogjava.net/DLevin/archive/2015/09/02/427045.html

多线程Reactor:
http://my.oschina.net/flashsword/blog/197963

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Netty-WebSocket-Spring-Boot-Starter是一个用于将Websocket集成到Spring Boot应用程序中的库。它使用Netty作为底层框架,提供了一种快速和可靠的方式来处理异步通信。 这个库提供了一种简单的方法来创建Websocket端点,只需要使用注释和POJO类即可。在这些端点上可以添加动态的事件处理程序,以处理连接、断开连接和消息事件等。 此外,Netty-WebSocket-Spring-Boot-Starter还包括了一些安全性的特性,如基于令牌的授权和XSS保护,可以帮助您保持您的Websocket应用程序安全。 总的来说,Netty-WebSocket-Spring-Boot-Starter提供了一种快速和易于使用的方式来构建Websocket应用程序,使得它成为应用程序开发人员的有用工具。 ### 回答2: netty-websocket-spring-boot-starter 是一个开源的 Java Web 开发工具包,主要基于 Netty 框架实现了 WebSocket 协议的支持,同时集成了 Spring Boot 框架,使得开发者可以更加方便地搭建 WebSocket 服务器。 该工具包提供了 WebSocketServer 配置类,通过在 Spring Boot 的启动配置类中调用 WebSocketServer 配置类,即可启动 WebSocket 服务器。同时,该工具包还提供了多种配置参数,如端口号、URI 路径、SSL 配置、认证配置等等,可以根据业务需求进行自定义配置。 此外,该工具包还提供了一些可扩展的接口和抽象类,如 WebSocketHandler、ChannelHandlerAdapter 等,可以通过继承和实现这些接口和抽象类来实现业务逻辑的处理和拓展。 总的来说,netty-websocket-spring-boot-starter 提供了一个高效、简单、易用的 WebSocket 服务器开发框架,可以减少开发者的开发成本和工作量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值