Sofa-jraft的Rpc调用服务端分析

news/2024/5/10 1:27:08/文章来源:https://blog.csdn.net/dw147258dw/article/details/129167152
  1. 在sofa-jraft中,关于RPC的服务端是RpcServer

在RpcServer中的init方法中:

初始化了连接事件监听器,这个里面就是一个map,然后可以添加事件监听的处理器,初始化userProcessors, codec 是一个编码和解码器的工厂,可以获取编码器和解码器,然后他调用了父类的构造器super(port);

父类AbstractRemotingServer则是初始化了ip,port, options容器,包含BitSet的globalSwitch 全局开关,配置容器,configContainer,实现了接口RemotingServer : 这个接口主要是可以注册处理器

到此,已经完成了初始化,就是初始化一些map,开关,编码解码器,等,而AbstractRemotingServer继承了AbstractLifeCycle:我们来看下这个lifeCycle:

就是通过Atomic变量来控制启动和关闭

那么来看下start()方法,这个方法是RemotingServer的,实现在AbstractRemotingServer中,调用了startup方法(覆盖LifeCycle的方法),所以这两个方法其实是一样的,然后是doInit方法,这个是抽象方法,由RpcServer实现:

首先是根据是否管理Connection参数来初始化连接管理器,无论是否管理连接,都会初始化Eventhandler ,这里面实现了一些连接事件,大多数事件是没有自定义处理,都是打印日志

initRpcRemoting() 这个是初始化RpcRemoting也就是远程调用,这个可以后面说

这里就是初始化Netty的bootstrap,包括设置tcp参数,接收队列发送队列大小等,并设置高水位和低水位

这里是设置触发模式,水平触发还是边缘触发,如果是epoll,则设置为水平触发,否则设置为边缘触发

这里科普一下水平触发和边缘触发:

首先我们的网络模型select / poll, epoll 会有一个读取的调用,他们的方法都不一样,比如epoll的epoll_read ,如果是水平触发,那么如果是有一大串数据过来之后,读取一次没有读取完,那么就又会有一次读就绪事件,如果每次发送的数据量比较大,那么这种读事件就会有很多,会浪费很多的系统资源(文件描述符,事件触发也会有消耗)

如果是边缘触发,那么数据没读完,不会有事件过来,也就是调用epoll_read不会有返回,这样就需要自己在一次触发的时候吧缓冲空间的数据读完。

那么水平触发的场景可以是短报文场景,边缘触发可以是大报文场景

水平触发优、缺点及应用场景:
优点:当进行socket通信的时候,保证了数据的完整输出,进行IO操作的时候,如果还有数据,就会一直的通知你。
缺点:由于只要还有数据,内核就会不停的从内核空间转到用户空间,所有占用了大量内核资源,试想一下当有大量数据到来的时候,每次读取一个字节,这样就会不停的进行切换。内核资源的浪费严重。效率来讲也是很低的。
LT要避免写的死循环问题,写缓冲区满的概率很低,只要缓冲区没满(空闲)就会不断发信号,所以写完数据后一定要记得取消写事件。
边沿触发优、缺点及应用场景:
优点:每次内核只会通知一次,大大减少了内核资源的浪费,提高效率。
缺点:不能保证数据的完整。不能及时的取出所有的数据。
应用场景:处理大数据。使用non-block模式的socket。
ET要避免"short read"的问题,比如用户收到100个字节,触发了一次边沿警告,读了50个字节,剩下50个字节没读。但是没有警告。

接下来是设置时间处理器,ServerIdleHandler是当服务端发生了Idle事件的时候关闭链接,RpcHandler初始化的时候将userProcessor传入了参数

收到消息的以后会进行消息分发,我们后面单独看ProtocolCode及消息的分发处理,而在最后如果有新的连接,怎会加入到connectionmanager中

回到Abstract的startup,最后则是进行启动,而这个启动doStart()是在RpcServer中,绑定端口,启动用户处理器等

接下来先分析编码器和解码器:

编码器:

首先会从channel中获取协议版本,然后通过协议管理器来获取编码器,

两个版本的编码器,在字节流的首个字节都写入了PROTOCOL_CODE,以及content和header的长度

解码器:

解码器的流程是,先解析出协议的版本,将协议code写入channel的attribute,然后重置读指针,获取版本对应的解码器进行解码,而解码的流程也比较简单,逐个获取各个数据,根据长度将数据填入对象中

再一个就是用户处理器:

收到消息的事件处理器是RpcHandler,通过协议获取到RpcCommandHandler,在handle中,通过

来获取processor,在解码器中已经解析出了commandType,

而processorManager是RpcCommandHandler初始化的时候构造的,并注入了几个默认的processor

而在RPC_REQUESTprocessor中,

首先通过request的类型获取用户processor中的处理器来处理

而后就是增加一些选择器以及线程池选择,这里看下userprocessor到底有哪些

其实这里的userprocessor中有很多都是内部类,每一种消息类型都有对应的处理器,举个例子

选举投票有预选举,预选举跟选举的区别是不增长任期,并且设置preVote为true,避免网络发生隔离后重新加入集群,增加任期选举时因为任期无线增大的情况

这里封装的Request是RequestVoteRequest,rpcService.preVote 会在消息发送后执行done的Run方法

在构造RaftGroupService的时候,也可以是在通过RaftRpcServerFactory来创建RpcServer的时候:

会提前注入很多相关的处理器

而在回调的时候会调用processor的handleRequest方法,我们来看RequestVoteRequestProcessor:

handleRequest 在父类的父类RpcRequestProcessor中,调用子类的processRequest,接着再调用子类RequestVoteRequestProcessor的processRequest0方法,这里面则是具体的处理逻辑方法

我们的消息格式都是RpcRequestCommand,通过这个来进行编码和解码,而里面的requestClass,是在构造Command的时候注入的:

这是客户端发送消息时的最后转换处理,

解码后根据requestclass对应processor的interest

这样逻辑就能对应上了

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2022-2023年营销报告(B站平台) | 5大行业势态、流量大盘全景洞察

一直以来,手持高活跃、高粘性用户群体的B站是行业用来观察年轻人消费习惯的重要平台。以至于用户群体的不断壮大带动了B站的商业价值。如今B站的商业舞台越来越大,不断地向外界招手,欢迎更多品牌积极加入到这个千万年轻人聚集的内容社区。为了…

基于Hibernate对数据库表的单表查询

基于Hibernate对数据库表的单表查询 1.依赖 1.1jar包 1.2配置文件。persistence.xml <?xml version"1.0" encoding"UTF-8"?> <persistence version"2.1"xmlns"http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi"…

亲身试验 Outlook防关联方法分享

Outlook在海外的用途是很广泛的&#xff0c;不仅可以用于收发邮件&#xff0c;还可以作为各类第三方网站的登录凭证。所以Microsoft对于Outlook的监管还是比较严格的&#xff0c;跨境卖家大量注册Outlook账号使用的话很容易被检测出关联然后被封号。龙哥针对Outlook防关联的问题…

【Kubernetes 入门实战课】Day02——初识容器

系列文章目录 【Kubernetes 入门实战课】Day01——搭建kubernetes实验环境(一) 文章目录系列文章目录前言一、Docker的诞生二、Docker的形态1、Docker Desktop2、Docker Engine二、Docker的安装1、服务器连接外网安装2、服务器不通外网三、Docker的使用三、Docker的架构总结前…

阿里云物联网平台设备模拟器

在使用阿里云物联网平台过程中&#xff0c;如果开始调试没有实际的物理设备&#xff0c;可以考虑在阿里云物联网平台使用官方自带的模拟器进行调试。不过也可以通过叶帆科技开发的阿里云物联网平台设备模拟器AliIoTSimulator进行调试&#xff0c;AliIoTSimulator可以独立运行&a…

stm32 VM8978 音乐播放

一、WAV文件 1、WAV文件简介 2、WAV文件的解析 二、WM8978 1、WM8978介绍 2、WM8978特点 3、WM8978接口 4、WM8978框架 5、 WM8978 寄存器 三、IIS详解 1、IIS介绍 2、 IIS 的特点 3、IIS框架 4、 音频协议 5、 IIS Philips 标准 6、 IIS 时钟 四、音乐播放硬件…

ChatGPT三个关键技术

情景学习&#xff08;In-context learning&#xff09; 对于一些LLM没有见过的新任务&#xff0c;只需要设计一些任务的语言描述&#xff0c;并给出几个任务实例&#xff0c;作为模型的输入&#xff0c;即可让模型从给定的情景中学习新任务并给出满意的回答结果。这种训练方式能…

双检测人脸防伪识别方法(活体检测+人脸识别+关键点检测+人像分割)

双检测人脸防伪识别=人脸检测+活体检测+人脸识别 1.人脸关键点+语义分割 使用mediapipe进行视频人脸关键点检测和人像分割: import time import cv2 import mediapipe as mp import numpy as npmp_drawing = mp.solutions.drawing_utils mp_drawing_styles = mp.solution…

量化交易-单因子分析-alphalens

1. 数据准备 1.1 计算因子IC重要函数 def get_clean_factor_and_forward_returns(factor,prices,groupbyNone,binning_by_groupFalse,quantiles5,binsNone,periods(1, 5, 10),filter_zscore20,groupby_labelsNone,max_loss0.35,zero_awareFalse,cumulative_returnsTrue)facto…

【C语言】-程序编译的环境和预处理详解-让你轻松理解程序是怎么运行的!!

作者&#xff1a;小树苗渴望变成参天大树 作者宣言&#xff1a;认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; 程序的编译前言一、 程序的翻译环境和执行环境二、 详解翻译环境2.1编译环境2.1.1预编…

民锋国际期货:2023,既艰难又充满希望,既纷乱又有无数机会。

不管是官方还是民间&#xff0c;各种信号都表明&#xff0c;2023年是一个拼经济的年份。 通货膨胀带来的需求量的增加&#xff0c;与中国经济高速发展带来的供给量增加&#xff0c;二者共同构成了我们的物价。 做一个长期主义者&#xff0c;做一个坚定看好中国未来的人&#…

MapBox动态气泡图渲染教程

先来看效果: 视频效果: 屏幕录制2023-02-22 15.34.57 首先我们来介绍一下思路。对于mapbox和openlayers这样的框架来讲,气泡图中的气泡本质上就是一个div,就是将一个dom元素追加到canvas上的固定位置而已。 在mapbox中有marker的概念,官网也有示例: Attach a popup to …

二叉树——路径总和

路径总和 链接 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 叶子节点…

数据库及缓存之MySQL(一)

思维导图 常见知识点 1.mysql存储引擎&#xff1a; 2.innodb与myisam区别&#xff1a; 3.表设计字段选择&#xff1a; 4.mysql的varchar(M)最多存储数据&#xff1a; 5.事务基本特性&#xff1a; 6.事务并发引发问题&#xff1a; 7.mysql索引&#xff1a; 8.三星索引&#xf…

升职加薪必备,2023年程序员不能不知道的AI辅助编码工具

已经有很多人把chatGPT当做必备的Bug修复工具了&#xff0c;对于用AI写代码&#xff0c;有人感到失落&#xff0c;害怕被取代&#xff0c;而另一些人则认为人工智能将加快编写更好代码的过程。 尽管 AI 编写的代码并非完美无缺&#xff0c;但我相信&#xff0c;最终AI将取代人…

车机开发—【CarService启动流程】

汽车架构&#xff1a;车载HAL是汽车与车辆网络服务之间的接口定义&#xff08;同时保护传入的数据&#xff09;&#xff1a; 车载HAL与Android Automotive架构&#xff1a; Car App&#xff1a;包括OEM和第三方开发的AppCar API&#xff1a;内有包含CarSensorManager在内的AP…

Hadoop集群模式安装(Cluster mode)

1、Hadoop源码编译 安装包、源码包下载地址 Index of /dist/hadoop/common/hadoop-3.3.0为什么要重新编译Hadoop源码? 匹配不同操作系统本地库环境&#xff0c;Hadoop某些操作比如压缩、IO需要调用系统本地库&#xff08;*.so|*.dll&#xff09; 修改源码、重构源码 如何…

H12-831题库(有详细的解析)

1.&#xff08;单选&#xff09;某工程师利用2台路由器进行IPv6业务测试,通过运行BGP4模拟总部与分支的互联互通。如图所示,某工程师抓包查看R1发出的update报文。关于该报文信息的描述,以下哪个说法是正确的? A.该报文描述的路由的下一跳地址为:2001:db8::2345:1::1 B.该报文…

自动增长配置不合理导致的性能抖动

背景客户收到了SQL专家云告警邮件&#xff0c;在凌晨2点到3点之间带有资源等待的会话数暴增&#xff0c;请我们协助分析。现象登录SQL专家云&#xff0c;进入活动会话的趋势分析页面&#xff0c;下钻到2点钟一个小时内的数据&#xff0c;看到每分钟的等待数都在100左右&#xf…

关于upstream的八种回调方法

1 creat_request调用背景&#xff1a;用于创建自己模板与第三方服务器的第一次连接步骤1&#xff09; 在Nginx主循环&#xff08;ngx_worker_process_cycle方法&#xff09; 中&#xff0c;会定期地调用事件模块&#xff0c; 以检查是否有网络事件发生。2&#xff09; 事件模块…