RPC

RPC(Remote Procedure Call)是一种进程间通信方式,让远程调用如同本地调用般简单。本文介绍了RPC的优势、流程,以及实现RPC的三个关键点:信息传递、数据序列化和网络通信。此外,还探讨了常见的RPC框架如dubbo、thrift和gRPC,并对比了RPC与REST的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



Provider: 暴露服务的服务提供方。 

Consumer: 调用远程服务的服务消费方。 
Registry: 服务注册与发现的注册中心。 
Monitor: 统计服务的调用次数和调用时间的监控中心。

调用流程 
0.服务容器负责启动,加载,运行服务提供者。 
1.服务提供者在启动时,向注册中心注册自己提供的服务。 
2.服务消费者在启动时,向注册中心订阅自己所需的服务。 
3.注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。 
4.服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。 
5.服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心




RPC是一种概念,用以让远程连接的多台服务器可以像调用本地方法一样互相调用。 RPC 的全称是 Remote Procedure Call 是一种进程间通信方式。 它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。 即程序员无论是调用本地的还是远程的,本质上编写的调用代码基本相同。由于计算能力需要横向扩展,需要在多台机器组成的集群上部署应用,而RPC的概念就是让不同机器间方法调用变得简单。


1 优势

  • 简单:RPC 概念的语义十分清晰和简单,这样建立分布式计算就更容易。

  • 高效:过程调用看起来十分简单而且高效。

  • 调用:用RPC概念能够解决不同机器上信息交互的问题。


2 流程

一台客户端服务器需要调用另外一台服务端服务器上的方法,客户端将需要调用的方法的信息序列化,通过网络流传输至另外一台服务器上,反序列化,执行操作并得到返回结果,再次通过网络将此返回对象序列化传输回到客户端服务器。

RPC的思路流程:

  1. 程序中需要远程调用的方法调用客户端句柄,传输所需参数

  2. 调用本地系统网络部分,发送信息

  3. 消息传输

  4. 服务器端接收到信息,将信息传给处理此操作的服务器端句柄

  5. 句柄调用相应方法,操作数据(可以采用监视器模式)

  6. 得到结果,返回结果给句柄

  7. 句柄调用服务器的本地网络,返回信息

  8. 信息返回

  9. 客户端本地网络将信息发送给客户端句柄

  10. 句柄将结果返回给方法


3 为什么需要RPC概念?

一旦踏入公司尤其是大型互联网公司就会发现,公司的系统都由成千上万大大小小的服务组成,各服务部署在不同的机器上,由不同的团队负责。这时就会遇到两个问题:怎么实现多个服务间的通信?RPC框架就是为了解决多服务间调用的复杂情况,尽量让远程的调用变得简洁透明,让团队能够专注于业务开发。


4 实现RPC的三个关键点

4.1. 信息传递

通俗地说RPC是两台计算机上不同进程间的通信,如何进行不同计算机不同进程的交流沟通,识别对方的IP,端口,方法名,参数等都是要经过处理的。 I/O调度模型:同步阻塞I/O(BIO)还是非阻塞I/O(NIO)。IO调度现在主流的就是netty。

4.2 数据序列化

通过网络流传输数据,数据必须要进行序列化和反序列化,这两种操作的具体实现很重要。序列化框架的选择:文本协议、二进制协议或压缩二进制协议。 高性能序列化目前性能最好的是ice,google 的 pb协议,FB的thrift协议等。

4.3 网络通信

google的gRPC直接使用http2作为网络通信的方法。一般来讲,各种RPC的实现框架都使用TCP协议作为网络通信的基本方法。


5 常见的RPC框架

dubbo、dubbox、motan、thrift、grpc


6 RPC与REST的区别

RPC是以动词为中心的, REST是以名词为中心的。此处动词指的是一些方法, 名词是指资源.这两种方法没有孰优孰劣。以动词为中心意味着,当你要需要加入新功能时,你必须要添加更多的动词, 这时候服务器端需要实现 相应的动词(方法), 客户端需要知道这个新的动词并进行调用. 而以名词为中心, 假使我请求的是 hostname/friends/, 无论这个URI对应的服务怎么变化,客户端是无需关注和更新的,而这种变化对客户端也是透明的. 至于其它的区别,如对实现语言的依赖, 耦合性等,这些都是上面提到的这个根本区别所衍生的。

### 三级标题:RPC 基本概念 远程过程调用(Remote Procedure Call,简称 RPC)是一种在分布式系统中广泛使用的通信机制,允许一个程序像调用本地函数一样调用另一个网络节点上的程序[^5]。RPC 的核心思想是隐藏底层的网络通信细节,使得开发者可以专注于业务逻辑的设计与实现。 在 RPC 模型中,通常包含客户端(Client)、服务端(Server)、以及中间的网络通信组件。客户端通过调用本地代理(Stub)来发起请求,该请求被序列化并通过网络传输到服务端。服务端接收到请求后进行反序列化,并执行对应的服务逻辑,最终将结果返回给客户端[^2]。 ### 三级标题:RPC 使用场景 RPC 主要应用于以下几种典型场景: 1. **微服务架构**:在现代的微服务系统中,各个服务之间需要频繁地进行通信。RPC 提供了一种高效、透明的跨服务调用方式,能够显著提升系统的整体性能和可维护性。 2. **高性能计算**:当系统需要处理大量的并发请求时,使用高效的 RPC 协议(如 gRPC 或 Dubbo)可以有效降低网络延迟并提高吞吐量。 3. **异构系统集成**:许多 RPC 框架支持多种编程语言和平台,这使得不同技术栈构建的服务可以在统一的接口下协同工作。 4. **分布式事务管理**:在复杂的分布式系统中,多个服务可能需要共同完成一个事务。RPC 可以作为这些服务之间的协调工具,确保数据的一致性和完整性。 ### 三级标题:RPC 框架实现 #### 1. 核心组件 一个完整的 RPC 框架通常包括以下几个关键组件: - **协议层**:定义了消息的格式和交互规则。常见的协议有 HTTP/REST、gRPC 和 Dubbo 协议等。 - **序列化机制**:负责将数据结构转换为字节流以便在网络上传输,常用的序列化方式包括 JSON、Protocol Buffers、Thrift 和 Hessian 等。 - **网络通信**:基于 TCP/IP 或 HTTP/2 实现可靠的数据传输。 - **服务注册与发现**:用于动态管理和查找可用的服务实例。 - **负载均衡与容错机制**:确保请求能够在多个服务实例之间合理分配,并在出现故障时提供自动恢复能力。 #### 2. 实现示例 以下是一个简化版的 RPC 调用流程的 Python 示例代码: ```python import socket import json # 定义服务端 class RpcServer: def __init__(self, host='localhost', port=8080): self.host = host self.port = port self.services = {} def register_service(self, name, func): self.services[name] = func def start(self): with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((self.host, self.port)) s.listen() print("Server is listening...") while True: conn, addr = s.accept() with conn: data = conn.recv(1024) if not data: break request = json.loads(data.decode()) service_name = request['service'] args = request['args'] result = self.services[service_name](*args) conn.sendall(json.dumps(result).encode()) # 定义客户端 class RpcClient: def __init__(self, host='localhost', port=8080): self.host = host self.port = port def call(self, service_name, *args): with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((self.host, self.port)) request = json.dumps({'service': service_name, 'args': args}) s.sendall(request.encode()) data = s.recv(1024) return json.loads(data.decode()) # 示例服务 def add(a, b): return a + b # 启动服务器并注册服务 server = RpcServer() server.register_service('add', add) # server.start() # 注释掉以避免阻塞主线程 # 客户端调用 client = RpcClient() result = client.call('add', 2, 3) print(f"Result: {result}") ``` #### 3. 高级特性与优化 为了提升 RPC 框架的性能和可靠性,通常会引入以下高级功能: - **异步调用**:支持非阻塞式的调用方式,提升系统的响应速度和资源利用率。 - **缓存机制**:对于重复的请求,可以通过缓存减少对后端服务的压力。 - **安全机制**:采用 SSL/TLS 加密通信,防止数据被窃取或篡改。 - **监控与日志**:记录详细的调用日志,便于故障排查和性能分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值