Netty服务端基本启动流程源码刨析

news2024/10/5 18:31:37

前言: 希望看这篇文章之前对Java Nio编程比较熟悉,并有用过Netty开发简单代码

服务端代码

先大致说一下NioEventLoopGroup组件的作用,可以把它看是作内部维护了一个NioEventLoop数组的对象,它的构造方法的参数用来指定维护数组的大小。NioEventLoop继承自Executor可以理解为一个NioEventLoop是一个单线程线程池。

ServerBootStrap作为一个封装Java Nio 的一个启动类接下来我们分析这个启动类

首先bootstrap.group(boss,eventExecutors)这段代码内部为SerBootStrap属性赋值,分别赋值给Group和childGroup。Group即boss线程组主要负责通过Java Nio建立连接 ,childGroup主要负责监听Group传递过来的Channel。

channel方法内部是根据类对象创建一个channelFactory工厂,用来通过反射创建NioServerSocketChannel,这里的Channel完全是Netty自己的类不是JavaNio自带的类

重点在bind方法内部

内部调用doBind方法,接下来注意initAndRegister方法

通过工厂方法创建channel,由于NioServerSocketChannel继承了AbstractChannel,先看父类构造方法都做了什么

unsafe类不是Java中的操作内存的Unsafe类,这里的unsafe类是用来读取和写入消息进行的封装,pipeline可以理解为是一个链表,每个节点是ChannelHandler和上下文信息封装而成

NioServerSockerChannel构造方法内还创建了Java Nio的ServerSocketChannel

这里代码图片就不粘贴了可以自己动手看,其内部就是把ServerSocketChannel赋值给NioServerSocketChannel的一个属性,如果后续代码中NioServerSocketChannel调用javaChannel()方法返回的就是这个属性即Java原生ServerSocketChannel。

Config内部等于保存了NioServerSocketChannel的引用,以及初始化了ByteBuf内存分配器

至此 channelFactory创建channel的方法结束

此时NioServerSocketChannel内部只是保留了对ServerSocketChannel的引用,并未对ServerSocketChannel注册事件等等

接下来注意Init方法

可以看到它主要做了一些参数信息的设置以及添加了一个HandlerContext,这里等于说是一个头节点和一个这个节点以及一个尾节点构成pipleline。这里留意一下execute方法,参数currentChildGroup就是开头的NioEventLoopGroup(child),这里的currentChildHandler是我们最开始片段的Handler,以及Options都是最开始专门为ChildHandler设置的

这里Init方法结束,接下来看initAndRegister方法中的Register方法

这里的config是上一步的config对象,这里的group是最开始创建的Boss线程组 NioEventLoopGroup,进入register方法内部

 public ChannelFuture register(Channel channel) {
        return next().register(channel);
    }

next()方法主要是从线程组中挑出一个NioEventLoop即只有一个线程的线程池,再次深入register方法

我们发现这里的promise封装了NioServerSocketChannel和从Group中挑出的线程池

接下来是重中之重涉及到线程的开启和切换

Unsafe的register方法

这里的inEventLoop其实是判断当前线程是否是NioEventLoop中的线程,NioEventLoop中的线程采用懒惰加载,第一次为null所以判断结果为false。

我们可以看到他向单线程线程池(NioEventLoop)任务队列中提交了一个普通任务

接着调用startThread方法,直接看其内部的doStartThread方法

看左下角当前线程是NioEventLoopGroup中的一个线程,并把此线程赋值给Thread属性(懒加载),接着进入SingleThreadEventExecutor.this.run()方法,这里的this.run指的是NioEventLoop的run方法

这里我要引入一张图片来解释run方法的功能

我们现在只处在BossGroup中,注意下面的圆圈这里就是这段代码的功能我们一句一句看

这里的selectStrategy.calculateStrategy(selectNowSupplier, hasTasks());方法是判断普通任务队列(非定时任务)是否有待完成的任务,这里显然是有的上面已经说了提交了一个任务register0,但是这里面的作用是如果有任务就调用selectNow方法,看返回的是否有事件发生。

因为NioEventLoop毕竟是线程池除了要监听channel事件还要处理普通任务和定时任务

如果没有普通任务返回的就是枚举类SELECT

long curDeadlineNanos = nextScheduledTaskDeadlineNanos();计算的是定时任务的最小时间,这里是为了下面调用Select.select(time)有限时间监听channel事件。正如之前所说:NioEventLoop毕竟是线程池除了要监听channel事件还要处理普通任务和定时任务

上面主要是解决定时任务的情况方法就是有限时间的等待,由于我们只提交了register0任务继续向下看,看它是如何处理普通任务和channel中发生事件的

这段代码要留意selectCnt++,ioRatio,processSelectedKeys(),ranTasks = runAllTasks(ioTime * (100 - ioRatio) / ioRatio)

首先 processSelectedKeys()是为了处理Channel中有注册事件发生,我们代码中目前还没有连接事件

所以就看runAllTask方法

其内部就是从队列中拿到之前提交的task任务

看!该执行我们之前提交的任务了

看此方法内部 doRegister方法

这里任务的提交以及register方法都是在NioServerSocketChannel的父类中完成

selectionKey = javaChannel().register(eventLoop().unwrappedSelector(), 0, this);

这段代码就是把Netty中的NioServerSocketChannel当作附件给添加到Java Nio中ServerSocketChannel,并把它注册到selector中

同时调用HandlerContext的initChannel方法,把任务提交向pipleLine中添加一个HandlerContext

到这里启动流程基本就这些,事件的处理selectCnt++,ioRatio,processSelectedKeys(),下篇文章继续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1549482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM(六)——内存模型与高效并发

内存模型与高效并发 一、java 内存模型 【java 内存模型】是 Java Memory Model(JMM) 简单的说,JMM 定义了一套在多线程读写共享数据时(成员变量、数组)时,对数据的可见性、有序 性、和原子性的规则和保障…

2024年【G2电站锅炉司炉】考试及G2电站锅炉司炉找解析

题库来源:安全生产模拟考试一点通公众号小程序 G2电站锅炉司炉考试考前必练!安全生产模拟考试一点通每个月更新G2电站锅炉司炉找解析题目及答案!多做几遍,其实通过G2电站锅炉司炉复审模拟考试很简单。 1、【多选题】下列为锅炉的…

【MATLAB源码-第170期】基于matlab的BP神经网络股票价格预测GUI界面附带详细文档说明。

操作环境: MATLAB 2022a 1、算法描述 基于BP神经网络的股票价格预测是一种利用人工神经网络中的反向传播(Backpropagation,简称BP)算法来预测股票市场价格变化的技术。这种方法通过模拟人脑的处理方式,尝试捕捉股票…

Echarts 基础柱状图,实现柱体设定颜色且带有图例

摘要:柱状图的最初要求很简单,4个柱体高低显示不同分类的值,逐渐增加的要求有:自定义特定分类颜色、增加图例展示、点击图例控制分类显示和隐藏。记录下遇到的问题和一些不熟悉的属性的使用。 大致的显示结果如上图,下…

CSMM软件过程能力成熟度模型

软件过程能力成熟度模型旨在通过提升组织的软件开发能力帮助顾客提升软件的业务价值。 本模型借鉴吸收了软件工程、项目管理、产品管理、组织治理、质量管理、卓越绩效管理、精益软件开发等领域的优秀实践,为组织提供改进和评估软件过程能力的一个成熟度模型。 总体…

55.跳跃问题

这个Java代码定义了一个名为Solution的类,并实现了一个名为canJump的方法。该方法用于判断一个给定整数数组(表示每个位置可以跳跃的最大长度)中,是否可以从数组的第一个位置跳到最后一个位置。 // 定义一个名为Solution的类 cla…

Docker搭建LNMP环境实战(04):安装VMwareTools共享文件夹

1、加载VMware Tools安装盘 在VMware客户端,点击主菜单: 图1 启动VMware Tools安装 再点击下面的菜单: 图2 打开设置界面 出现下面的界面,虚拟DVD加载的是linux.iso 图3 查看VMware Tools的DVD虚拟安装映像文件 将DVD加载到CentO…

【小黑送书—第十五期】>>一本书掌握数字化运维方法,构建数字化运维体系(文末送书)

字化转型已经成为大势所趋,各行各业正朝着数字化方向转型,利用数字化转型方法论和前沿科学技术实现降本、提质、增效,从而提升竞争力。 数字化转型是一项长期工作,包含的要素非常丰富,如数字化转型顶层设计、组织架构…

linux下关闭swap文件系统

临时关闭(马上生效) 永久关闭(重启计算机才能生效) vim /etc/fstab

搜维尔科技【应急推演】虚拟仿真技术的发展为煤炭矿井的安全生产找到新的出口

煤炭矿井的安全生产一直是我国关注的重大事项,保证煤炭矿井的安全生产,减少人员伤亡等不可逆的损失成为重中之重。虚拟仿真技术的发展为煤炭矿井的安全生产找到了新的出口。依托虚拟仿真技术,对煤炭矿井进行实时的生产监测,对矿井…

【项目管理——时间管理】【自用笔记】

1 项目时间管理(进度管理)概述 过程:(2—6)为规划过程组,7为监控过程组 题目定义:项目时间管理又称为进度管理,是指确保项目按时完成所需的过程。目标:时间管理的主要目标…

【python地图添加指北针和比例尺】

文章目录 1、前言2、代码2.1、指北针2.2、比例尺 3、结果 1、前言 地理信息绘制中添加指北针和比例尺,使得图像更专业。 2、代码 2.1、指北针 def add_north(ax, labelsize18, loc_x0.95, loc_y0.99, width0.06, height0.09, pad0.14):"""画一个…

记录些LLM相关的知识

MMR MMR(Maximum Marginal Relevance)最大边际相关性是一种用于信息检索和推荐系统的算法,它的目的是在推荐项目时平衡相关性和多样性。MMR算法旨在找出与用户查询最相关的同时又足够多样化的项目集合。 在信息检索领域,MMR算法通…

【Pt】马灯贴图绘制过程 02-制作锈迹

目录 一、边缘磨损效果 二、刮痕效果 三、边缘磨损与刮痕的混合 四、锈迹效果 本篇效果: 一、边缘磨损效果 将智能材质“Iron Forge Old” 拖入图层 打开“Iron Forge Old” 文件夹,选中“Sharpen”(锐化),增大“…

Cesium自定义Shader实现流动尾线

目录 项目地址实现效果核心代码 项目地址 https://github.com/zhengjie9510/webgis-demo 实现效果 核心代码 class SpriteLineMaterialProperty {constructor(options) {this._definitionChanged new Cesium.Event();this._speed undefinedthis._color undefinedthis.spe…

考研数学|《660题》这样刷最有效!

考研数学660题作为许多考研学子在备考过程中重要的复习资料之一,自然也有很多同学会有660该怎么刷的问题。为了更有效率地使用这些题目,希望以下策略能帮到大家, 首先,你需要根据自己的实际情况,制定一个合理的学习计…

Leetcode70. 爬楼梯(动态规划)

Leetcode原题 Leetcode70. 爬楼梯 标签 记忆化搜索 | 数学 | 动态规划 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?示例 1:输入:n 2 输出:2 解…

2024/03/27(C++·day3)

一、思维导图 二、完成下面类 代码 #include <cstring> #include <iostream>using namespace std;class myString { private:char *str; // 记录C风格的字符串int size; // 记录字符串的实际长度public:// 无参构造函数myString() : size(10){str new char[si…

AI智能分析网关V4如何使用GB28181注册到EasyCVR平台?具体步骤是什么?

旭帆科技的智能分析网关V4内含近40种智能分析算法&#xff0c;包括人体、车辆、消防、环境卫生、异常检测等等&#xff0c;在消防安全、生产安全、行为检测等场景应用十分广泛。如常见的智慧工地、智慧校园、智慧景区、智慧城管等等&#xff0c;还支持抓拍、记录、告警、语音对…

Nginx配置静态代理/静态资源映射时root与alias的区别,带前缀映射用alias

场景 Nginx搭建静态资源映射实现远程访问服务器上的图片资源&#xff1a; Nginx搭建静态资源映射实现远程访问服务器上的图片资源_nginx 当作图片资源访问 博客-CSDN博客 以上在配置静态资源映射时使用的如下配置 location / {root D:/pic_old/;try_files $uri $uri/ /ind…