当前位置: 首页 > article >正文

RPC核心实现原理

目录

一、基本原理

二、详细步骤

三、额外考虑因素


RPC(Remote Procedure Call,远程过程调用)是一种计算机通信协议,也是一种用于实现分布式系统中不同节点之间进行通信和调用的技术。其实现原理主要可以分为以下几个步骤:

简单介绍就是:

步骤1:服务提供方启动时将服务注册到注册中心。

步骤2:服务消费方启动时从注册中心订阅自己需要服务的地址。

步骤3:注册中心把已经注册的服务提供者地址,返回给消费方。

步骤4:消费方根据路由规则与负载均衡策略,选择一个提供者地址进行调用。

步骤5:调用双方与监控平台建立定时发送机制,用来统计调用次数与耗时等相关数据。

一、基本原理

RPC允许程序在不同的计算机上通过网络进行函数调用,使得分布式系统中的节点可以像调用本地函数一样调用远程函数,提供了一种简单、高效的分布式通信方式。RPC的基本原理是:客户端(Client)通过调用本地的客户端代理(Proxy/Stub)来调用远程服务器(Server)上的服务。客户端代理将调用请求序列化成网络协议中的消息,并通过网络发送给服务器端。服务器端接收到消息后,解析消息,执行相应的服务,并将执行结果序列化成消息返回给客户端。客户端代理再将结果反序列化并返回给客户端,就像调用本地函数一样。

二、详细步骤

  1. 客户端代理:客户端通过调用本地的客户端代理来触发远程函数的调用。客户端代理负责将函数参数进行封装,这通常涉及到将参数序列化为适合网络传输的格式(如JSON、XML、Protobuf等)。
  2. 传输:封装后的请求通过网络传输给服务端。传输是RPC中非常重要的一环,它负责将封装后的请求从客户端传输到服务端,并将服务端的响应传输回客户端。传输可以基于不同的协议和传输层实现,如TCP、UDP、HTTP等。其中,HTTP协议因其跨平台、跨语言的特点,以及较好的可扩展性和安全性,被广泛应用于RPC的实现中。
  3. 服务端代理:在服务端,接收到客户端发送的请求后,服务端代理(Skeleton/Server Stub)负责将请求解析并调用本地的函数进行处理。服务端代理将处理结果封装成响应,这同样涉及到序列化,以便通过网络发送回客户端。
  4. 执行:服务端执行被调用的函数,并将结果返回给服务端代理。
  5. 响应:服务端代理将处理结果封装成响应后,通过传输层发送回客户端。客户端代理接收到服务端的响应后,负责将响应解析(即反序列化)并返回给调用方。

三、额外考虑因素

除了上述的基本原理和步骤外,RPC的实现还需要考虑一些额外的问题:

  1. 数据编码和解码:即将函数参数和返回值进行序列化和反序列化,这是为了在不同的语言和平台之间实现数据的互通。
  2. 服务注册与发现:客户端需要知道服务端的地址才能发起请求。这可以通过中心化的服务注册中心来实现,客户端可以从注册中心获取到可用的服务地址。
  3. 负载均衡:在分布式系统中,可能会有多个服务端实例提供相同的服务。为了优化性能和资源利用,需要引入负载均衡机制,将请求均匀地分发到不同的服务实例上。
  4. 容错机制:由于网络通信的不确定性,RPC调用可能会失败。因此,需要引入重试、超时、熔断等机制来处理这些失败情况,保证系统的可靠性和稳定性。

综上所述,RPC的实现原理是一个复杂而精细的过程,它涉及到网络通信、数据序列化与反序列化、服务注册与发现、负载均衡以及容错机制等多个方面。通过这些机制和技术手段的共同作用,RPC实现了分布式系统中不同节点之间的高效、可靠的函数调用。

 参考:

手写RPC框架第三章《RPC中间件》 | 小傅哥 bugstack 虫洞栈

itstack-demo-rpc: RPC是一种远程调用的通信协议,例如dubbo、thrift等,我们在互联网高并发应用开发时候都会使用到类似的服务。本专题主要通过三个章节简单的实现rpc基础功能,来深入学习rpc是如何交互通信的;手写类似dubbo的rpc框架第一章《自定义配置xml》 手写类似dubbo的rpc框架第二章《netty通信》 手写类似dubbo的rpc框架第三章《rpc框架》在这些章节中我们会学习到以下知识点; 1、自定义xml的配置和解析 2、netty 3、JDKProxy 4、客户端通过注册中心,发布和获取链接者 5、服务的通过JDKProxy,进行调用方法

https://gitcode.net/KnowledgePlanet/SpringBootStarter?page=1

一文详解RPC框架核心原理与手写实战


http://www.kler.cn/a/380956.html

相关文章:

  • Go:接口和反射
  • Springboot——对接支付宝实现扫码支付
  • map和set和pair
  • Kafka 之批量消息发送消费
  • 我谈正态分布——正态偏态
  • MySQL超大分页怎么优化处理?limit 1000000,10 和 limit 10区别?覆盖索引、面试题
  • 华为eNSP:配置DHCP Snooping
  • 梁山派入门指南3——串口使用详解,包括串口发送数据、重定向、中断接收不定长数据、DMA+串口接收不定长数据,以及对应的bsp文件和使用示例
  • 冒泡排序、选择排序、计数排序、插入排序、快速排序、堆排序、归并排序JAVA实现
  • 小新学习k8s第四天之发布管理
  • Pr 视频效果:透视
  • 【Nginx】前端项目开启 Gzip 压缩大幅提高页面加载速度
  • Ant Design Vue 的 a-table 行选择分页时bug处理
  • 官方redis安装
  • React Hooks 为什么不能在 if 语句中使用???
  • 根据提交的二维数据得到mysql建表和插入数据实用工具
  • 全渠道供应链打造中企业定制开发2+1链动模式S2B2C商城小程序的策略与影响
  • 【Python环境配置-Step1】PyCharm 2024最新官网下载、安装教程
  • PyTorch实践-CNN-验证码识别
  • 高可用架构-业务高可用
  • Android Studio:connect time out
  • Redis-基本了解
  • 数学期望和联合概率密度
  • 20241105编译Rockchip原厂的Android13并给荣品PRO-RK3566开发板刷机
  • 软设师知识点-计算机网络
  • CODESYS 输出日志 Log