netty核心组件以及实现原理
Netty核心组件
- 网络通信层:这一层有三个核心组件:Bootstrap、ServerBootStrap和Channel。Bootstrap负责客户端的启动,并用来链接远程Netty Server;ServerBootStrap负责服务端监听,用来监听指定端口;Channel相当于完成网络通信的载体。
- 事件调度层:这一层有两个核心组件:EventLoopGroup和EventLoop。EventLoopGroup本质上是一个线程池,主要负责接收I/O请求,并分配线程执行处理请求;EventLoop相当于线程池中的线程。
- 服务编排层:这一层有三个核心组件:ChannelPipeline、ChannelHandler和ChannelHandlerContext。ChannelPipeline是处理网络请求的核心结构,它由多个ChannelHandler组成,每个ChannelHandler负责处理特定的网络事件;ChannelHandler是处理网络事件的抽象,它可以通过ChannelHandlerContext上下文信息来完成对网络事件的处理;ChannelHandlerContext用于提供ChannelHandler与网络事件的交互能力,它可以添加或者删除ChannelHandler,也可以传递网络事件给上层的ChannelHandler或者底层的Channel。
这些核心组件共同构成了Netty的网络通信框架,通过对这些组件的组合和配置,可以实现对网络通信的灵活控制。
工作原理
Netty是一种基于NIO的Java网络编程框架,它提供了一种快速和简单的方法来开发网络应用程序。Netty的工作原理主要基于Reactor模式和职责链模式。
- Reactor模式:Netty采用了典型的Reactor模式来进行网络通信的处理。Reactor模式通常包括一个或多个事件处理器,这些事件处理器负责监听和分发事件。在Netty中,Reactor线程(通常是一个NioEventLoop)负责监听网络事件,例如连接请求、数据到达等。当这些事件发生时,Reactor线程会将事件分发给对应的ChannelPipeline中的ChannelHandler进行处理。
- 职责链模式:Netty中的ChannelPipeline是职责链模式的一个典型应用。每个ChannelPipeline都包含了一系列的ChannelHandler,这些ChannelHandler形成了一个处理网络事件的职责链。当事件到达Pipeline时,它会按照顺序传递给每个Handler进行处理。每个Handler可以执行特定的任务,例如解码协议消息、处理业务逻辑、编码消息等。
通过这种方式,Netty将网络事件的监听、分发和处理分离开来,使得代码结构清晰,易于维护和扩展。同时,Netty还提供了丰富的组件和功能,如Channel、EventLoop、ChannelFuture、ChannelPipeline和ChannelHandler等,这些组件使得开发者可以更加高效和便捷地开发网络应用程序。
数据处理路径
在Netty中,数据处理的主要路径如下:
- 数据接收:当有数据从网络到达时,NioEventLoop会通过NioSocketChannel接收数据,并将其存入ByteBuf中。
- 数据解码:在ChannelPipeline中,ByteToMessageDecoder或MessageToByteEncoder等ChannelHandler会对接收到的数据进行解码或编码。解码后的消息会传递给后续的ChannelHandler进行处理。
- 业务处理:在ChannelPipeline中,根据业务需求,可以自定义ChannelHandler进行业务处理。在ChannelHandler中,可以处理各种类型的消息,例如连接请求、断开连接、接收数据等。
- 数据编码:在业务处理完成后,如果需要将消息发送到网络,ChannelPipeline中的MessageToByteEncoder等ChannelHandler会对消息进行编码。
- 数据发送:最后,通过NioEventLoop将编码后的数据发送到网络。
这个过程主要基于Reactor模式和职责链模式,通过将网络事件的监听、分发和处理分离开来,使得代码结构清晰,易于维护和扩展。同时,Netty还提供了丰富的组件和功能,如Channel、EventLoop、ChannelFuture、ChannelPipeline和ChannelHandler等,这些组件使得开发者可以更加高效和便捷地开发网络应用程序。
相关文章:
netty核心组件以及实现原理
Netty核心组件 网络通信层:这一层有三个核心组件:Bootstrap、ServerBootStrap和Channel。Bootstrap负责客户端的启动,并用来链接远程Netty Server;ServerBootStrap负责服务端监听,用来监听指定端口;Channe…...
如何正确下载tomcat???
亲爱的小伙伴,千万别再去找下网站下载啦,这样詪容易携带病毒。 我们去官方网址下载。 Apache Tomcat - Welcome! 最后下载解压即可。。。...
mybatis-plus 根据指定字段 批量 删除/修改
mybatis-plus 提供了根据id批量更新和修改的方法,这个大家都不陌生 但是当表没有id的时候怎么办 方案一: 手写SQL方案二: 手动获取SqlSessionTemplate 就是把mybatis plus 干的事自己干了方案三 : 重写 executeBatch 方法结论: mybatis-plus 提供了根据id批量更新和修改的方法,…...
MQTT宝典
文章目录 1.介绍2.发布和订阅3.MQTT 数据包结构4.Demo5.EMQX 1.介绍 什么是MQTT协议 MQTT(消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协…...
【前端】CSS水平居中的6种方法
文章目录 flex绝对定位margin:auto绝对定位margin:负值定位transformtext-align: center;margin: 0 auto;思维导图 后文:【前端】CSS垂直居中的7种方法_karshey的博客-CSDN博客 左右两边间隔相等的居中 flex display: flex;justify-content: center; <div clas…...
nginx如何获取真实的ip
我这里使用是springboot项目,使用nginx做代理,但header里面的参数没有将ip带过来,所有需要配置nginx将ip带过来。 nginx.conf文件 server {listen 80;listen 443 ssl;server_name xxx.xxx.com;ssl_certificate /web/project/ai…...
kotlin + LiveData 测试
viewModel测试:https://developer.android.com/codelabs/basic-android-kotlin-compose-test-viewmodel#3 androidTestImplementation "org.jetbrains.kotlin:kotlin-test:1.9.0"androidTestImplementation org.jetbrains.kotlinx:kotlinx-coroutines-tes…...
【dnf5文档】新一代RedHat自动化包管理器
前言 HI,CSDN的码友们,距离上一次我发文章已经过去了半年的时间,现在我又来介绍自己新发现和探究的开源技术了。计算机的发展总是飞速的,当我在写这篇文章的时候,Fedora rawhide已经进入了40版本、默认采用的自动化包管理器为dnf…...
数据可视化工具的三大类报表制作流程分享
电脑(pc)、移动、大屏三大类型的BI数据可视化报表制作步骤基本相同,差别就在于尺寸调整和具体的报表布局。这对于采用点击、拖拉拽方式来制作报表的奥威BI数据可视化工具来说就显得特别简单。接下来,我们就一起看看不这三大类型的…...
lua使用心得
lua语言的一些注意事项 在控制结构的条件中除了false和nil为假,其他值都为真。所以Lua认为0和空串都是真。lua5.3之前的版本只支持浮点数,lua5.3才引入了对整数的支持,/仅支持浮点数除法,要实现C里的整除效果必须使用双斜杠//超过…...
Docker升级后,出现Error response from daemon: Unknown runtime specified docker-runc
现象:docker升级版本后,重启docker服务出现: [rootDocker scripts]# docker start registry Error response from daemon: Unknown runtime specified docker-runc Error: failed to start containers: registry解决办法: 改完之…...
[Poetize6] IncDec Sequence
题目描述 给定一个长度为 n 的数列 a_1,a_2,...,a_n,每次可以选择一个区间[l,r],使这个区间内的数都加 1 或者都减 1。 请问至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列有多…...
通过Microsoft Loopback Adapter实现虚拟机和物理机的通信
问题 问:不借助路由器或交换机的情况下,能不能实现主机和虚拟及之间两个软件的通信呢?要求主机和虚拟及均有独立的ip地址,从而进行指定源的组播通信。 答:可以。通过借助虚拟网络适配器,不需要路由器或交…...
算法leetcode|70. 爬楼梯(rust重拳出击)
文章目录 70. 爬楼梯:样例 1:样例 2:提示: 分析:题解:rust:go:c:python:java: 70. 爬楼梯: 假设你正在爬楼梯。需要 n 阶你才能到达楼…...
基于epoll的TCP服务器端(C++)
网络编程——C实现socket通信(TCP)高并发之epoll模式_tcp通信c 多客户端epoll_n大橘为重n的博客-CSDN博客 网络编程——C实现socket通信(TCP)高并发之select模式_n大橘为重n的博客-CSDN博客 server.cpp #include <stdio.h> #include <sys/types.h> #include <…...
实时安全分析监控加强网络安全
网络犯罪分子只需几分钟,有时甚至几秒钟即可泄露敏感数据。但是,IT 团队可能无法在数周内发现这些违规行为。通常,这些违规行为是由外部方或客户发现的,到那时为时已晚。随着网络漏洞的激增,对安全分析的需求空前高涨。…...
基于ipad协议的gewe框架进行微信群组管理(二)
友情链接 geweapi.com 点击访问即可。 获取群组详情 小提示: 该接口可以一次查询20个群组查询出来的信息是不带公告的 请求URL: http://域名地址/api/group/detail 请求方式: POST 请求头: Content-Type:applica…...
大数据-玩转数据-Flink网页埋点PV统计
一、说明 衡量网站流量一个最简单的指标,就是网站的页面浏览量(Page View,PV)。用户每次打开一个页面便记录1次PV,多次打开同一页面则浏览量累计。 一般来说,PV与来访者的数量成正比,但是PV并不…...
什么是伪类选择器?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 伪类选择器⭐ 一些常见的伪类选择器示例::hover:active:focus:nth-child(n):first-child 和 :last-child ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何…...
PLY模型格式详解【3D】
本文介绍PLY 多边形文件格式,这是一种用于存储被描述为多边形集合的图形对象。 PLY文件格式的目标是提供一种简单且易于实现但通用的格式足以适用于各种模型。 PLY有两种子格式:易于入门的 ASCII 表示形式和用于紧凑存储和快速保存和加载的二进制格式。 …...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
DiscuzX3.5发帖json api
参考文章:PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下,适配我自己的需求 有一个站点存在多个采集站,我想通过主站拿标题,采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...
