Spring架构篇--2.7.6 远程通信基础--Netty流程总结

news2024/11/16 13:50:44

前言:虽然netty 内部的流程比较复杂,但是对于用户来说还是非常友好的,我们只需要进行必要的参数设置,以及添加处理业务的handler 即可;本文对netty 进行阶段性的回顾。

1 首先看下netty 整体的一个工作流程图:改图包含了服务器端与客户端连接的建立,消息的收发;
在这里插入图片描述
2 然后对Netty 中比较关键步骤的回顾:

2.1 Netty 服务器的 bind 方法:
Netty 中除了NioEventLoopGroup 的创建和ServerBootstrap 的初始化工作之外,其余的工作都交由bind() 方法进行处理,所以bind 方法 可以说是了解 Netty 流程的重中之重;

2.2.1 initAndRegister() 方法: 改方法中包含了init 和register ;它们的主要工作如下:

  • 完成NioServerSocketChannel 对象的创建及其Pipeline 双向链表的初始化;非阻塞流的设置;
  • 在init() 方法中等待NioServerSocketChannel 初始化完成之后在Pipeline 增加处理客户端accept 事件的ServerBootstrapAcceptor handler;
  • 在register 方法中 从boos NioEventLoopGroup 获取一个 NioEventLoop 执行占位事件的注册;
  • 当管道可用的时候pipeline.fireChannelActive() 调用pipeline 的ChannelActive 方法,在AbstractNioChannel中doBeginRead() 然后关注accept 事件;

2.2.2 AbstractBootstrap.doBind0(regFuture, channel, localAddress, promise) 方法:它的工作如下:
进入NioServerSocketChannel 中的doBind 进行端口的绑定 ,使用原生的java ServerSocketChannel 完成端口的绑定;

在这里完成了channel 监听端口的绑定,channel 事件的注册,以及handler 的处理 ,为后续channel 的通信做了所有的准备工作;

3 Netty accept& read 处理:

Netty 中在完成了端口的绑定和accept 的监听后,后续的工作就是,客户端的连接,并且客户端与服务端的通信工作,其中比较重要的就是服务端对于accept,read ,write 事件的处理 ;

3.1 轮询事件处理:
accept 和 read 事件的处理都是通过NioEventLoop 中run 方法的 this.processSelectedKeys(); 进行的,当有io 事件发生时就会进入该方法;
3.1.1 netty服务端accept 事件处理:

  • 如果发生accept 事件会进入 NioNessageUnsafe.read 方法处理,在这里创建了新的创建SocketChannel 对象来处理io 事件,对其设置io 流的非阻塞,对fNioServerSocketChannel读写属性的配置,默认Pipeline设置;
  • 将新建的 SocketChannel 的对象作为消息放入到List readBuf 中进入循环通过调用链调用每个pipeline的fireChannelRead 方法并将消息当做参数进行传递;
  • 在ServerBootstrapAcceptor 中从worker 的NioEventLoopGroup 中选择一个NioEventLoop ,然后得到NioEventLoop 中的selector 将新建的SocketChannel 进行注册;
  • 注册完成通过AbstractChannel.this.pipeline.invokeHandlerAddedIfNeeded() 完成对新建的SocketChannel 将自己业务中的ChannelInitializer 的initChannel 方法,进行handler 的添加,最终在关注读事件;

3.1.2 服务端read 事件处理:

  • 如果发生read 事件会进入到NioByteUnsafe.read 方法进行处理,从channel 中得到数据;
  • 调用pipeline.fireChannelRead(byteBuf)方法依次调用服务端inbound的hadler 处理器中的channelRead0 方法进行业务调用;

3.1.3 Netty 的write 事件处理:
使用SocketChannel 的writeAndFlush 方法会从当前 SocketChannel 中 Pipeline,从tail 向前依次找出outbound的hadler 的write 方法进行调用;

4 参考:

4.1 浅谈Netty中ServerBootstrap服务端源码(含bind全流程);

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

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

相关文章

el-form表单全部/部分添加一样字段内容并表单校验(复制即可实现)

需求:表单有俩个按钮,一个是全部添加,一个是部分添加默认如下: 点击添加饮品爱好后如下,可以添加多个 点击添加全部,并且点击提交按钮后的表单校验,如下图: 全部代码如下,可自行复制…

Linux 6.3更新补丁修复XFS元数据损坏的问题

导读一些 XFS 用户曾反馈,在升级到最新的 Linux 6.3.3 point releases 之后,出现了元数据损坏的问题。 一些 XFS 用户曾反馈,在升级到最新的 Linux 6.3.3 point releases 之后,出现了元数据损坏的问题。对此,内核开发…

Electron 进程间通信的实现

electron Electron 进程间通信的实现 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article/details/131136140 【介绍】…

【LeetCode】HOT 100(9)

题单介绍: 精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。 目录 题单介绍&#…

一款开源、免费的微信管家系统,助你快速搭建微信应用

JeewxBoot是一款免费的JAVA微信管家平台,支持微信公众号、小程序、微信第三方平台、抽奖活动等。JeewxBoot已经实现了系统权限管理、公众号管理、抽奖活动等基础功能,便于二次开发,可以快速搭建微信应用! 技术架构:Sp…

代码随想录|day13| 栈与队列part03 ● 239. 滑动窗口最大值● 347.前 K 个高频元素● 总结

239. 滑动窗口最大值--------知识点:单调队列 链接:代码随想录 自己写的,报错: class DandiaoQueue{//一个栈或者队列,基本要有进栈出栈两种操作,这里再加上pop出最大值一种操作//底层是deque public:deque…

网络工程师怎么入门?

首先,要成为一名牛逼的网络工程师,就得有扎实的技术功底。毕竟,技术是王道嘛!从最基础的TCP/IP、DNS开始学起,这是咱们的入门基石。当然,也别忘了学习一些常见的编程语言,比如Python、Java等等。…

java -jar 参数传递

前景: 我看spring boot启动时,当指定某个profile的时候,是直接使用 --spring.profiles.active 但是我之前传递参数是使用的是-DpathD:\\ 这样写的,所以我就好奇两种传递参数的区别 可以通过两种方式,下面说说他们的区别 当我们在idea里面指定的时候,就可以看出两者是不同的…

Spring架构篇--2.7.5 远程通信基础--Netty原理write 事件处理

前言:之前的分析中我们知道了服务端对于客户端accept 以及read 事件的处理,那么客户端/服务端 进行数据写入时 数据流又是怎么传递的,本文继续对 write 探究; 1 Netty 服务端 数据如何写出: 通常我们使用SocketChann…

软件自动化测试

测试的目的: 保证软件质量 第一章 JMock测试框架 1.1 简介 Mock测试是一种常见的测试方法,通常在执行测试的时候,测试代码往往需要与一些真实对象进行交互,又或者被测代码的执行需要依赖真实对象的功能。此时,我们可…

【网络】定制协议版本的网络计算器

文章目录 什么是协议结构化数据的传输序列化和反序列化如何进行序列化和反序列化-jsoncpp使用示例 实现网络版本的计算器协议定制序列化和反序列化函数封装Protocol.hpp 对套接字接口进行封装版本1:原始版本-无序列化和反序列化(多线程版本)Makefile服务端客户端 版本2:进行序列…

算法模板(7):计算几何(1)

计算几何 基础知识 y总总结知识点 1. 前置知识点(1) pi acos(-1);(2) 余弦定理 c^2 a^2 b^2 - 2abcos(t)2. 浮点数的比较 const double eps 1e-8; int sign(double x) // 符号函数 {if (fabs(x) < eps) return 0;if (x < 0) return -1;return 1; } int cmp(doubl…

【通用方法】返回近 dayNum 天日期数组封装方法

代码如下 // 返回近 dayNum 天日期数组 getRecentDay(dayNum) {let currentDate new Date();let dayNumDaysAgo new Date(currentDate.getTime() - dayNum * 24 * 60 * 60 * 1000);let recentDays [];for (let i 0; i < dayNum; i) {let date new Date(dayNumDaysAgo.g…

3U VPX XC7VX690T计算处理板

3U VPX 计算处理 板卡外观&#xff1a; 板载FPGA介绍&#xff1a;XC7VX690TT-2FFG1761i 同Xilinx公司的Kintex-7 FPGA系列比起来&#xff0c;Virtex-7系列有更高的性能。国内应用相当广泛。 Virtex-7 Family: Optimized for highest system performance and capacity with a 2X…

OpenCV如何确认是否使用了libjpg-turbo

项目中使用了图片解码的功能&#xff0c;目前使用的是OpenCV里头的libjpg&#xff0c;但是我们可以把 libjpg-turbo li编译到OpenCV中来提高解码效率&#xff0c;据官网说可以提高2-6的效率&#xff1a; 1、使用cv::getBuildInformation()可以看到构建参数。 2、本地构建完成之…

华为交换机观察口(observe-port)配置

镜像是指将经过指定端口&#xff08;源端口或者镜像端口&#xff09;的报文复制一份到另一个指定端口&#xff08;目的端口或者观察端口&#xff09;。 镜像可以在不影响设备对报文进行正常处理的情况下&#xff0c;将镜像端口的报文复制一份到观察端口。 端口镜像是指设备复制…

vscode连接远程服务器出现XHR faild

参考&#xff1a;https://zhuanlan.zhihu.com/p/426876766 1、出现XHR Faild&#xff0c;仔细查看是dowloading vscode-server to host错误&#xff0c;说明在下载vscode-server包出错&#xff0c;可以利用以下方法&#xff0c;手动下载: https://vscode.cdn.azure.cn/stable…

Debezium UI On ECS编译安装及开放Web访问

1. 访问debezium-ui的代码仓库&#xff0c;下载源码 GitHub - debezium/debezium-ui: A web UI for Debezium; Please log issues at https://issues.redhat.com/browse/DBZ. 2. 解压zip源码包&#xff1a; TEST[hadoopshdcvfsla1894 ~]$ cd /data/module TEST[hadoopshd…

Linux防火墙学习笔记6

制定iptables规则策略&#xff1a; 黑名单&#xff1a; 没有被拒绝的流量都可以通过&#xff0c;这种策略下管理员必须针对每一种新出现的攻击&#xff0c;制定新的规则&#xff0c;因此不推荐。 白名单&#xff1a; 没有被允许的流量都要被拒绝&#xff0c;这种策略比较保…