以 Java NIO 的角度理解 Netty

news2024/11/17 21:17:00

文章目录

  • 前言
  • Java NIO 工作原理
  • Selector 的创建
  • ServerSocketChannel 的创建
  • ServerSocketChannel 注册 Selector
  • 对事件的处理
  • 总结

前言

上篇文章《Netty 入门指南》主要涵盖了 Netty 的入门知识,包括 Netty 的发展历程、核心功能与组件,并且通过实例演示了如何使用 Netty 构建一个 HTTP 服务器。由于 Netty 的抽象程度较高,因此理解起来可能会更加复杂和具有挑战性,所以本文将通过 Java NIO 的处理流程与 Netty 的总体流程比较,并结合 Netty 的源码更加清晰地理解Netty。

Java NIO 工作原理

首先我们知道Netty是基于Java NIO的一个网络应用框架,是在其基础上进行封装和扩展(所以在深入了解Netty之前,建议先对Java NIO有一定的了解),所以二者对网络的连接、读取和写入的操作方式是相似的。
Java NIO 工作原理
Java NIO代码示例

如上图的Java NIO的处理流程,与Java NIO代码示例结合,可以看到,将 ServerSocketChannel 注册到 Selector 并监听各个事件后,Selector 在接受到事件请求后我们业务代码对其进行判断并对应处理,在使用Netty时我们似乎不需要写这些代码,甚至都没有看见SelectorServerSocketChannel这些字眼,那这些代码在Netty中怎么体现的,我们扒开裤子看个究竟:
在这里插入图片描述
以上文Netty构建的HTTP服务器示例为例,直接关注 ServerSocketChannelSelector 是什么时候创建的,事件是什么时候注册以及处理的。

Selector 的创建

其实看了上篇的Netty入门,可以知道 EventLoop 负责处理各种事件,所以可以盲猜一下,Selector 应该是在 NioEventLoopGroup 中创建的,look

在这里插入图片描述
NioEventLoopGroup 的构造方法中调用 JDK 的 SelectorProvider 创建了Selector,也就是 Java NIO 的代码。

ServerSocketChannel 的创建

关于 ServerSocketChannel 的创建,直接找绑定端口的方法,如下图
在这里插入图片描述

同样,在 Netty 的代码 NioServerSocketChannelnewChannel() 中也看到 Java NIO 的代码。

ServerSocketChannel 注册 Selector

下图中 ServerSocketChannel 在创建后为其分配了一个 EventLoop 并开启新的线程(这也是Netty 多线程异步的体现),最终在 doRegister() 调用了JDK 的接口注册了Selector 并监听了事件,看见 selectionKey 应该什么都清楚了吧。
在这里插入图片描述

对事件的处理

既然 ServerSocketChannel 注册了Selector 并监听了事件,那接下来就是当有事件来时 EventLoop 对其进行处理,直接看 NioEventLoop 中的代码,因为他是通过新的线程启动的,所以直接看 run()
在这里插入图片描述
processSelectedKeysPlain() 中的代码熟悉吧,是监听到了某个事件可以进行处理了,下面是对读事件的处理
在这里插入图片描述
图中 ChannelPipeline 采用了责任链模式是对事件的处理通道,方便扩展。所以 Netty 中的读取事件与 Java NIO 的关系如下图。

在这里插入图片描述

总结

所以在接触 Netty 的之前一定要先掌握 Java NIO,本文只是介绍了 Java NIO 在 Netty 中的体现、Netty 对 Java NIO 的封装,让大家更方便的理解 Netty,并不涉及 Netty 的高效、强大的设计之处,下文将会对此进行介绍。

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

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

相关文章

剑指 Offer 60. n个骰子的点数(动态规划)

文章目录 题目描述思路分析完整代码 题目描述 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。 你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那…

Status 技术的兴衰:从问世到淘汰的历程

标题 Status 技术的兴衰:从问世到淘汰的历程摘要引言Status 问世初期优势挑战 Status 高峰期优势挑战 Status 面临挑战挑战 新兴技术的涌现优势 淘汰的原因结论 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客👦🏻 《java 面试…

排污口水质的在线监测,实时掌握排口水质助力生态治理

水是生命之源,良好的水生态环境是社会发展的必然要求。然而随着工业化和城市化的发展,人类面临空气和水环境污染等严峻挑战,其中水环境问题尤为突出。排污成为城市和工业生产过程中不可避免的环保问题。 为加快解决生态环境突出问题&#xff…

搞科研需要具备哪些特质?

你认为科研人员需要具备哪些特质才能实现成为大科学家的梦想?回顾那些成功科学家的经历,发现他们身上总会一些共性,正是拥有这些共性,他们最后都在领域内取得了成功。那么,到底都具备哪些共性呢? 好奇心。小…

手把手教你如何挑选适合你的AI编程辅助工具

ChatGPT的普及引发了对AI应用场景的探索和实践的重大变革,垂直领域专业类大模型正正在不断深化落地,其中基于大模型专注于编码的AI工具的出现显著降低了开发的复杂性,提高了开发人员的开发效率,对初级开发人员尤其有帮助。 因此面…

面试官三连问:给我讲讲什么是索引覆盖?什么是索引下推 ? 什么是最左匹配原则 ?

1.什么是索引覆盖 索引覆盖是指在一个查询语句中,某个索引已经 "覆盖了" 需要被查询出来的列,此时就不需要进行回表查询了,这就叫做索引覆盖!!(索引覆盖它是非聚簇索引中的一个特殊情况&#xff…

3.2.0 版本预告!远程日志解决 Worker 故障获取不到日志的问题

Apache DolphinScheduler 3.2.0 版本已经呼之欲出,8 月 中下旬,这个大版本就要和用户见面了。为了让大家提前了解到此版本更新的主要内容,我们已经制作了几期视频和内容做了大致介绍,包括《重磅预告!Apache DolphinSch…

快递再多也不怕!你的顺丰快递用上5G“神器”

互联网时代,剁手党疯狂“买买买”之后,快递件量再创新高。《2023年6月中国快递发展指数报告》显示,2023二季度单月快递业务量稳定在百亿件以上。其中,由于“618”电商促销活动与父亲节叠加,6月16日至20日单日揽收量均超…

js ajax 国内快速 映像

ajax 快速 映像 https://www.bootcdn.cn/ axios入门和axios基本请求方式 https://blog.csdn.net/m0_68997646/article/details/127438174 使用 jsDelivr CDN: <script src"https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>因为我们国…

ThinkPHP6.0+ 使用Redis 原始用法

composer 安装 predis/predis 依赖&#xff0c;或者安装php_redis.dll的扩展。 我这里选择的是predis/predis 依赖。 composer require predis/predis 进入config/cache.php 配置添加redis缓存支持 示例&#xff1a; <?php// -----------------------------------------…

【文件上传】大文件分片上传、断点续传、秒传前后端实现

1、大文件上传面临的问题&#xff1a; 在传统的文件上传中&#xff0c;由于文件过大&#xff0c;导致网络传输时间长&#xff0c;这过程中会遇到网络不稳定或者不小心关闭的浏览器&#xff08;电脑&#xff09;的情况&#xff0c;从而导致文件上传中断。中断之后&#xff0c;又…

第三届OceanBase数据库大赛启动,升级为国家级竞赛

近日&#xff0c;第三届OceanBase数据库大赛启动报名。本届大赛进一步升级为全国大学生计算机系统能力大赛&#xff0c;由系统能力培养研究专家组发起&#xff0c;全国高等学校计算机教育研究会、系统能力培养研究项目发起高校主办&#xff0c;OceanBase承办&#xff0c;旨在培…

API接口开发系列,各电商(商品详情数据,商品sku数据,商品属性数据,商品优惠券数据)

API接口开发是指开发和构建应用程序之间交流的接口。主要包括设计、实现和维护接口&#xff0c;以便不同应用程序之间可以进行数据交换和相互调用功能。通过API接口开发&#xff0c;可以实现不同系统、平台或服务之间的数据交互和功能集成。 API接口开发的步骤一般包括以下几个…

程序员当累了,带爱人出去广西北海旅游下吧

先说说消费吧&#xff0c;我们一共花了8000多块钱。 两个人坐的往返机票&#xff0c;3600块钱。 上涠洲岛的船票加门票890块钱 住宿费一共4天850&#xff0c; 北海 两天350&#xff0c;涠洲岛住两天400。 路费住宿5500(200滴滴打车费) 其他消费2500 好吧&#xff0c;现在开始我…

【Apollo】Apollo 8.0系统下载指南

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

二叉树题目:二叉树的坡度

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;二叉树的坡度 出处&#xff1a;563. 二叉树的坡度 难度 3 级 题目描述 要求 给你一个二叉树的根结点 root \texttt{root} root&#xff0c;返回树…

新能源电动车交流充电桩主板技术参数

你是否知道交流充电桩主板的技术参数呢?今天我们就来了解一下。 首先&#xff0c;交流充电桩主板一般采用10V-60V电压&#xff0c;支持多种电压输入&#xff0c;比如220V、380V、400V等&#xff0c;可以满足不同用户的需求。其次&#xff0c;频率一般为50/60Hz&#xff0c;但也…

uniapp编写微信小程序遇到的坑总结

1、阻止事件冒泡 使用uniapp开发微信小程序的时候&#xff0c;发现使用click.stop来阻止事件冒泡没有作用&#xff0c;点击了之后发现仍然会触发父组件或者祖先组件的事件。 在网上查阅&#xff0c;发现使用tap.stop才能阻止事件冒泡。 2、二维码生成 在网上找了很多&…

【进程与线程】最好懂的讲解

目录 1.CPU的管理 2.进程 2.1.概述 2.2.数据结构 2.3.进程状态 2.4.进程与内存 2.5.PCB队列 3.线程 3.1.概述 3.2.实现 1.CPU的管理 进程和线程是操作系统里面的概念&#xff0c;这个概念其实是对CPU的管理策略。整个操作系统都可以看作计算机硬件的管理软件&#x…

git本地选项配置

一&#xff0c;简介 在git工具安装完成之后&#xff0c;需要设置一下常用的配置&#xff0c;如邮箱&#xff0c;缩写&#xff0c;以及git commit模板等等。本文就来详细介绍些各个配置如何操作&#xff0c;供参考。 二&#xff0c;配置步骤 2.1 查看当前git的配置 git conf…