【日常经验】RPC 调用的分类及示例

embedded/2024/11/14 7:45:30/

🏡作者主页:点击!

🤖Vue专栏:日常经验

⏰️创作时间:2024年11月6日09点23分

文章目录

  • RPC调用的分类及示例
    • 一、RPC调用的分类
      • (一)基于传统HTTP协议的RPC
      • (二)基于特定RPC框架的调用
    • 二、其他分类方式
      • (一)同步与异步RPC
      • (二)语言相关与语言无关RPC

RPC调用的分类及示例

一、RPC调用的分类

RPC(Remote Procedure Call)调用有多种实现方式,从不同的角度可以进行不同的分类。按照通信协议和框架的不同,可以大致分为以下几类:

(一)基于传统HTTP协议的RPC

  1. 原理
    • 这类RPC调用利用HTTP协议作为传输协议,将请求和响应封装在HTTP请求和响应消息中。通常会将方法调用的参数和返回值序列化为HTTP消息体中的数据,如JSON或XML格式。它的优势在于可以利用现有的HTTP基础设施,具有良好的跨平台性和通用性。
  2. 示例
    • HttpRequest.post()方式(简单模拟)
      • 假设我们有一个简单的用户管理系统,包括用户注册服务。客户端(比如一个网页前端)需要调用服务器端的注册服务来创建新用户。我们可以使用HttpRequest.post()(在不同的编程语言和环境中有类似的HTTP请求发送方法)来发送一个包含用户注册信息(如用户名、密码等)的请求到服务器。
      • 以下是一个简单的JavaScript示例,用于向服务器发送用户注册请求:
        const http = require('http');
        const postData = JSON.stringify({username: 'newuser',password: 'password123'
        });
        const options = {hostname: 'example.com',port: 8080,path: '/register',method: 'POST',headers: {'Content-Type': 'application/json','Content-Length': Buffer.byteLength(postData)}
        };
        const req = http.request(options, (res) => {let data = '';res.on('data', (chunk) => {data += chunk;});res.on('end', () => {console.log('注册结果:', data);});
        });
        req.write(postData);
        req.end();
        
      • 在这个例子中,客户端通过HttpRequest.post()(这里是http.request)向服务器的/register路径发送一个POST请求,包含了用户注册信息。服务器接收到请求后,会解析数据,执行注册逻辑,并返回注册结果。这种方式就像是在远程调用服务器端的“注册用户”函数。

(二)基于特定RPC框架的调用

  1. 原理
    • 这些框架专门为RPC调用设计,提供了更高级的功能,如服务发现、负载均衡、高效的序列化和反序列化机制等。它们通常有自己的协议和通信方式,以优化分布式系统中的服务间通信。
  2. 示例
    • Dubbo
      • Dubbo是一个高性能的Java RPC框架。它用于构建分布式服务架构,在大型企业级应用中广泛使用。
      • 例如,在一个电商系统中,有商品服务和订单服务。商品服务提供了getProductDetails(productId)方法用于获取商品详情,订单服务需要调用这个方法来填充订单中的商品信息。
      • 首先,需要定义Dubbo服务接口:
        public interface ProductService {Product getProductDetails(String productId);
        }
        
      • 然后,商品服务实现这个接口,并将服务暴露给Dubbo框架:
        @Service
        public class ProductServiceImpl implements ProductService {@Overridepublic Product getProductDetails(String productId) {// 从数据库或缓存中获取商品详情Product product = productDao.get(productId);return product;}
        }
        
      • 在订单服务中,可以通过Dubbo的服务引用机制来调用商品服务:
        @Component
        public class OrderService {@Referenceprivate ProductService productService;public void createOrder(Order order) {// 获取订单中的商品IDString productId = order.getProductId();// 通过Dubbo调用商品服务获取商品详情Product product = productService.getProductDetails(productId);// 填充订单中的商品详情order.setProductDetails(product);// 其他订单创建逻辑}
        }
        
      • 在这个例子中,Dubbo框架负责处理服务发现(找到商品服务的实际位置)、网络通信、数据序列化和反序列化等复杂的过程。订单服务只需要像调用本地方法一样调用productService.getProductDetails(productId),就可以获取到商品详情,实现了高效的RPC调用。

二、其他分类方式

除了上述基于通信协议和框架的分类,RPC调用还可以按照以下方式分类:

(一)同步与异步RPC

  1. 同步RPC
    • 原理:客户端发起请求后,会一直等待服务器的响应,在收到响应之前,客户端线程会被阻塞。这种方式简单直接,适用于对实时性要求较高,且客户端能够承受等待时间的场景。
    • 示例:在上面提到的基于HTTP的用户注册示例中,如果是同步方式,客户端在发送注册请求后,会一直等待服务器返回注册成功或失败的结果,期间不会执行其他操作。
  2. 异步RPC
    • 原理:客户端发起请求后,不会等待服务器的响应,而是继续执行其他任务。当服务器响应返回时,客户端通过回调函数或者其他方式来处理响应。这种方式可以提高客户端的并发性能,适用于对响应时间不那么敏感,且需要同时处理多个请求的场景。
    • 示例:在一些大数据处理系统中,客户端可能会异步调用多个数据处理服务。例如,一个数据分析系统需要从多个数据源获取数据进行分析。它可以异步地调用不同的数据提供服务,发送数据获取请求后,继续进行其他初始化或者预处理工作。当各个数据提供服务返回数据时,通过预先定义的回调函数来处理数据,进行后续的分析。

(二)语言相关与语言无关RPC

  1. 语言相关RPC
    • 原理:这种RPC调用通常是基于特定编程语言的特性或机制构建的。例如,Java的RMI(Remote Method Invocation)是一种语言相关的RPC,它利用Java的对象序列化和远程方法调用机制,允许Java程序之间进行远程通信。它依赖于Java的运行时环境和特定的语言特性,如Java接口和对象引用。
    • 示例:在一个纯Java的企业级应用中,使用RMI可以方便地在不同的Java虚拟机(JVM)之间进行方法调用。假设一个系统中有一个远程的报表生成服务,通过RMI,本地的客户端可以调用远程报表服务的generateReport(reportType)方法来生成不同类型的报表。
  2. 语言无关RPC
    • 原理:这种RPC调用不依赖于特定的编程语言,它通过通用的协议和数据格式来实现不同语言编写的服务之间的通信。例如,gRPC是一种语言无关的RPC框架,它使用Protocol Buffers作为接口定义语言和数据序列化格式。
    • 示例:假设有一个用Python编写的图像识别服务和一个用Java编写的用户界面服务。用户界面服务需要调用图像识别服务来识别用户上传的图像。通过gRPC,它们可以使用共同定义的接口和Protocol Buffers消息格式进行通信。Python服务实现图像识别的逻辑,Java服务可以像调用本地方法一样调用Python服务提供的图像识别方法,实现跨语言的RPC调用。

http://www.ppmy.cn/embedded/136840.html

相关文章

在vscode中如何利用git 查看某一个文件的提交记录

在 Visual Studio Code (VSCode) 中,你可以使用内置的 Git 集成来查看某个文件的提交历史。以下是具体步骤: 使用 VSCode 内置 Git 功能 打开项目: 打开你的项目文件夹,确保该项目已经是一个 Git 仓库(即项目根目录下…

Redux的简介及其在React中的应用

Redux Redux 是React最常用的集中状态管理工具,类似于Vue中的Pinia(Vuex),可以独立于框架运行。 作用:通过集中管理的方式管理应用的状态。 使用步骤: 定义一个 reducer 函数 (根据当前想要做…

PostgreSQL 性能优化全方位指南:深度提升数据库效率

PostgreSQL 性能优化全方位指南:深度提升数据库效率 别忘了请点个赞收藏关注支持一下博主喵!!! 在现代互联网应用中,数据库性能优化是系统优化中至关重要的一环,尤其对于数据密集型和高并发的应用而言&am…

融云:社交泛娱乐出海机会尚存,跨境电商异军突起

近年来,直播、语聊房、游戏社区,这些中国网友熟悉的网络社交形式,正在海外市场爆发出新的生命力。无论是被炒到几百人民币一个的 Clubhouse 邀请码,还是先后登顶中东下载榜的 Yalla、JACO,这些快速掀起体验浪潮的社交娱…

React Native使用axios会不会有问题

React Native 编译成原生应用后,是会进行原生应用的编译,生成 iOS 或 Android 的应用包。但 Axios 作为一个 JavaScript 库,它的工作机制与传统的浏览器环境有所不同,因此需要进一步澄清。 Axios 在 React Native 中的工作原理&a…

《深度学习》bert自然语言处理框架

目录 一,关于bert框架 1、什么是bert 2、模型结构 自注意力机制: 3、预训练任务 4、双向性 5、微调(Fine-tuning) 6、表现与影响 二、Transformer 1、传统RNN网络计算时存在的问题 1)串联 2)并行…

vform2 表单数据回显问题

vform2 表单数据回显 问题解决办法 问题 ruoyi-flowable-plus 流程绑定的表单需要回显暂存的数据,使用JSON.stringify(this.$refs.vFormRef.getFormData(false))存储数据后,如果表单中含有上传组件并且存储时上传组件没有上传,使用this.$ref…

基于微信小程序的实习管理系统(附源码,文档)

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…