中间件复习之-RPC框架

什么是RPC框架?

RPC(Remote Procedure Call):远程过程调用。当多个应用部署在多个服务器上时,由于他们不在一个内存空间上,因此需要网络来进行通信,而RPC允许它像调用本地方法一样调用远程服务

RPC原理

服务消费方通过RPC客户端调用服务,服务接收方通过RPC服务端接收请求进行处理。
整体分四个模块:

  • 远程代理
  • 序列化
  • 网络传输
  • 反序列化
    在这里插入图片描述

RPC核心功能实现

RPC服务消费方

  • 连接管理
  • 负载均衡
  • 请求路由
  • 超时处理
  • 健康检查

连接管理

消费方需要保持与服务方的长链接,用于传输请求也用于返回结果。那该如何实现呢?
下面是连接管理在整个服务消费调用过程中的位置:
在这里插入图片描述

连接管理核心有以下3个需要思考的点:

  • 连接初始化的时机:灵活根据业务场景选择策略
    • 懒加载:服务刚启动的时候不初始化,等有请求调用时再初始化连接。建好后再次有请求就复用这个连接。(网关场景一般使用懒加载。因为网关业务是公司所有流量的入口,下游服务可能有n个服务*n个节点。一个网关服务启动后,如果要等全部连接建立完毕之后启动会很慢,并且如果有模块没什么流量还占用着连接会有资源的浪费。一般网关服务上线后先分配少点的流量然后再预热,预热完后开放。)
    • 预加载:模块启动后先不接流量,把所有的连接、socket全部建好了然后再提供服务。(一般普通应用服务都是这种模式)
  • 连接数的维护:多建几条连接防止单条连接失效。
  • 心跳/重连:多条连接有探活机制,保证有多条连接可用。

负载均衡

负载均衡功能是确保多个服务提供方节点流量均匀/合理,支持节点扩容与灰度发布。
负载均衡在消费方rpc调用的位置:
在这里插入图片描述
负载均衡的一些方式:轮询、随机、取模、带权重、一致性Hash

请求路由

当业务方想按照某些请求标签来确定是不是要走该节点时,可以使用请求路由。通过一系列规则过滤出可以选择的服务提供方节点列表,在应用隔离,读写分离,灰度发布中都发挥作用。
请求路由在消费方调用过程中的位置:
在这里插入图片描述
请求路由功能的设计:

  • 规则匹配:
    • 待比较的属性(IP/流量标签)
    • 运算符(等于、大于、不等于等等)
    • 属性匹配值(跟哪个值进行匹配)
    • 匹配完的结果(行为)
  • 数据结构设计:因为是一系列规则,所以可以是链表结构
    在这里插入图片描述
    如按照IP分流规则举例:attribute=IP,operator=IN,value=IP1,IP2,Servers:Node1,Node2

超时处理

消费端对于长时间没有返回的请求,需要作出异常处理,及时释放资源。
超时处理在RPC调用链路中的位置:
在这里插入图片描述
超时处理的核心逻辑:

  • 工作线程的阻塞位置

    • 等待服务端回包通知(接收到请求了,判断是否超时)如下图:
    • 在这里插入图片描述
    • 在这里插入图片描述
  • 超时逻辑

    • 工作线程等待回包通知
    • 如果数据在预期的时间内返回,则终止等待唤醒工作线程
    • 如果超时则抛出异常
  • 超时处理的核心数据结构

    • Map:SessionID(请求级唯一)-WindowData(内部包含Event)

RPC服务提供方

  • 队列/线程池
  • 超时丢弃
  • 优雅关闭
  • 过载保护

队列/线程池

服务提供方可以将不同类型的请求,放入各自的队列,每个队列分配独立的线程池,做到资源隔离。
队列/线程池在服务提供方处理逻辑中的位置:
在这里插入图片描述
队列数/线程数的选择可以按照实际压测后的情况去调整。

超时丢弃

超时丢弃主要是将已经超时(超时的定义主要是调用方配置的超时时间)的请求快速失败,缓解队列堆积,防止服务持续不可用。
超时丢弃在服务提供方处理逻辑中的位置:
在这里插入图片描述
超时丢弃的处理逻辑:
在这里插入图片描述
io任务入队,任务包含3个字段,第一个是超时时间,第二个是处理请求的handler处理器,第三个是入队时间。
下面是出队以及判定超时的逻辑:
在这里插入图片描述

优雅关闭

优雅关闭主要是进程退出前确保接收到的请求全部处理完成
在这里插入图片描述
优雅关闭的实现:通过2种方式通知调用方

  • 返回数据中带关闭信息
  • 发送关闭协议通知调用方
优雅关闭的服务端实现
  • 监听关闭信号 kill -12
  • 改变服务状态
  • 通知客户端
监听关闭信号 kill -12

服务启动时候,使用Signal注册监听
在这里插入图片描述

改变服务状态

修改服务上下文的状态
在这里插入图片描述

通知客户端本服务端已关闭

在这里插入图片描述

优雅关闭的客户端实现
  • 根据节点返回内容改变节点状态

  • 在这里插入图片描述

  • 节点探活

  • 在这里插入图片描述

过载保护

服务提供方为保证正常运行,主动丢弃超出处理能力外的请求。
过载保护在调用链路下的位置:
在这里插入图片描述
过载保护的实现原理:IO线程任务入队时判断是否设置了队列长度限制,若有限制,则和队列中实际任务数做比较,若超出则丢弃。
在这里插入图片描述

RPC高级功能

  • 服务熔断
  • 服务降级
  • 限流
  • 动态权重

服务熔断

当某服务出现不可用或响应超时的情况时,为了防止整个系统出现雪崩,暂时停止对该服务的调用。
在这里插入图片描述

服务降级

对业务降级,跳过异常调用,返回关键数据,确保服务可用。(一般是熔断时结合降级,返回default数据,使业务不中断)
在这里插入图片描述

动态权重

为刚启动节点分配较低权重,逐步提高权重。
在这里插入图片描述

限流

通过限制调用放流量,以达到对服务提供方的保护。

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

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

相关文章

AWS上面部署一台jenkins

问题 客户预算有限,需要在aws云上面搞一台EC2手动安装jenkins发版。 步骤 创建密钥对 在EC2服务里面创建密钥对,具体如下图: 设置密钥对,如下图: 保存好这个私钥文件,以便后续用这个私钥文件ssh登录j…

RisingWave 在品高股份 Bingo IAM 中的应用

背景介绍 公司背景 品高股份,是国内专业的云计算及行业信息化服务提供商。公司成立于 2003 年,总部位于广州,下设多家子公司和分公司,目前员工总数近 900 人,其中 80 %以上是专业技术人员。 品高股份在 2008 年便开…

25.11 MySQL 视图

1. 常见的数据库对象 对象描述表(TABLE)存储数据的逻辑单元, 以行和列的形式存在, 列就是字段, 行就是记录.数据字典系统表, 存放数据库相关信息的表. 数据通常由数据库系统维护, 程序员通常不可修改, 只可查看.约束(CONSTRAINT)执行数据校验的规则, 用于保证数据完整性的规则…

JMeter+Grafana+influxdb 配置出现transaction无数据情况解决办法

JMeterGrafanainfluxdb 配置出现transaction无数据情况解决办法 一、问题描述二、解决方法 一、问题描述 如下图所示出现application有数据但是transaction无数据情况 二、解决方法 需要做如下设置 打开变量设置如下图打开两个选项 然后再进行后端监听器的设置 如下图所…

AR/VR技术对制造业劳动力危机的影响

借助 AR/VR 的力量缩小现代制造业的技能差距 数字化转型仍然是企业的首要任务,其许多方面都需要人工干预。然而,推动此类举措所需的技术工人日益短缺。这就造成了我们所说的“制造业劳动力危机”。 制造业应当如何: 制造业用工危机正在影响…

基于单片机的汽车自动预警刹车系统汇编

**单片机设计介绍,基于单片机的汽车自动预警刹车系统汇编 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的汽车自动预警刹车系统汇编概要主要描述了通过单片机技术实现汽车自动预警和刹车控制的系统设计和…

Tinymce富文本编辑器二次开发电子病历时解决的bug

前言 本文是在Tinymce富文本编辑器添加自定义toolbar,二级菜单,自定义表单,签名的基础之上进行一些bug记录,功能添加,以及模版的应用和打印 项目描述 建立电子病历模版—录入(电子病历模版和电子病历打印…

微信小程序使用icon图标

原因: 微信小程序使用fontawesome库使用icon图标,网上有很多教程,按照网上说法制作,引入到微信小程序中,但是验证成功,只能使用部分图标,结果不尽如人意。后面使用阿里巴巴开源iconfont来使用ic…

【.NET全栈】ZedGraph图表库的介绍和应用

文章目录 一、ZedGraph介绍ZedGraph的特点ZedGraph的缺点使用注意事项 二、ZedGraph官网三、ZedGraph的应用四、ZedGraph的高端应用五、、总结 一、ZedGraph介绍 ZedGraph 是一个用于绘制图表和图形的开源.NET图表库。它提供了丰富的功能和灵活性,可以用于创建各种…

R语言数据挖掘:随机森林(1)

数据集heart_learning.csv与heart_test.csv是关于心脏病的数据集,heart_learning.csv是训练数据集,heart_test.csv是测试数据集。要求:target和target2为因变量,其他诸变量为自变量。用决策树模型对target和target2做预测&#xf…

使用Java拓展本地开源大模型的网络搜索问答能力

背景 开源大模型通常不具备最新语料的问答能力。因此需要外部插件的拓展,目前主流的langChain框架已经集成了网络搜索的能力。但是作为一个倔强的Java程序员,还是想要用Java去实现。 注册SerpAPI Serpapi 提供了多种搜索引擎的搜索API接口。 访问 Ser…

Unity性能优化篇(十四) 其他优化细节以及UPR优化分析器

代码优化: 1. 使用AssetBundle作为资源加载方案。 而且经常一起使用的资源可以打在同一个AssetBundle包中。尽量避免同一个资源被打包进多个AB包中。压缩方式尽量使用LZ4,少用或不要用LZMA的压缩方式。如果确定后续开发不会升级Unity版本,则可…

微服务相关之Nacos

微服务相关之Nacos 一、基础概念1.什么是 Nacos2.Nacos 的关键特性包括3.Nacos 核心组件4.Nacos 业务大图 二、架构设计1.基本架构及概念 三、Nacos注册中心1.注册中心演变及其设计思想2.Nacos注册中心架构3.服务注册表结构 一、基础概念 1.什么是 Nacos Nacos /nɑ:kəʊs/ …

vlookup跨表使用

VLOOKUP(查找值,数据表,列序数,匹配条件)。打开两表格,输入查找值和表格数据格式一致,查找表格或数据范围是连续的。 跨表VLOOKUP使用步骤: 插函数单元格,输“VLOOKUP()…

AI学习-线性回归推导

线性回归 1.简单线性回归2.多元线性回归3.相关概念熟悉4.损失函数推导5.MSE损失函数 1.简单线性回归 ​ 线性回归:有监督机器学习下一种算法思想。用于预测一个或多个连续型目标变量y与数值型自变量x之间的关系,自变量x可以是连续、离散,但是目标变量y必…

【图】最小生成数—Kruskal算法

目录 1. 什么是最小生成树? 2. Kruskal算法 1. 什么是最小生成树? 最小生成树(Minimum Spanning Tree,简称 MST)是指在一个连通的无向图中,找到一个包含所有顶点的树,并且边的权值之和最小。…

简单的安全密码生成器PwGen

什么是 PwGen ? PwGen 是一个简单的 Docker Web 应用程序,旨在生成具有可自定义选项的安全密码或密码短语。用户可以选择生成具有特定标准的随机密码或由随机单词组成的密码。其他功能包括在密码中包含大写字母、数字和特殊字符的选项,或者将…

边缘计算盒子与云计算:谁更适合您的业务需求?

边缘计算盒子和云计算,这两个概念听起来可能有点复杂,但其实它们就是两种不同的数据处理方式。那谁更适合您的业务需求呢?咱们来详细说说。 边缘计算盒子,就像是个小型的数据处理中心,放在离你业务现场比较近的地方。它…

解决Flutter应用在苹果商店上架中常见的问题与挑战

引言 Flutter是一款由Google推出的跨平台移动应用开发框架,其强大的性能和流畅的用户体验使其备受开发者青睐。然而,开发一款应用只是第一步,将其成功上架到苹果商店才是实现商业目标的关键一步。本文将详细介绍如何使用Flutter将应用程序上…

【Unity每日一记】(Canvas的相机渲染模式) 如何将模型显示在UI之前

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…