RPC 简介

RPCRemote Procedure Call,远程过程调用)是一种通过网络请求执行远程服务器上的代码的技术,使得开发者可以调用远程系统中的函数,就像调用本地函数一样。它隐藏了底层网络通信的细节,简化了分布式系统的开发。


RPC 的工作原理

  1. 客户端调用本地代理(Stub)

    • 客户端调用一个本地函数。
    • 本地代理负责将函数调用转换为网络请求。
  2. 序列化请求

    • 调用的参数和函数信息被打包(序列化)成网络数据包。
  3. 发送请求

    • 数据包通过网络传输到服务器。
  4. 服务器处理

    • 服务器的代理(Stub)接收到请求,反序列化为本地调用。
    • 调用相应的函数并返回结果。
  5. 返回结果

    • 返回值通过相同的流程(序列化、传输、反序列化)回到客户端。

常见的 RPC 框架

1. gRPC
  • 开发者:Google。
  • 特点
    • 使用 Protocol Buffers(protobuf)作为数据交换格式。
    • 支持多种编程语言(如 Python、Java、Go)。
    • 高效的二进制序列化格式。
  • 应用场景
    • 微服务架构、实时通信。
2. Thrift
  • 开发者:Apache。
  • 特点
    • 支持多语言代码生成。
    • 提供灵活的传输和序列化协议。
  • 应用场景
    • 跨语言通信。
3. JSON-RPC / XML-RPC
  • 特点
    • 轻量级,使用 JSON 或 XML 格式传输数据。
  • 应用场景
    • 简单的远程调用场景。
4. Dubbo
  • 开发者:阿里巴巴。
  • 特点
    • 专注于 Java 服务之间的 RPC 调用。
    • 支持服务发现和治理。
  • 应用场景
    • 分布式系统。

RPC 的优势

  1. 透明性:调用远程函数与本地函数无异,屏蔽底层网络细节。
  2. 高效性:支持二进制协议(如 gRPC)以提高性能。
  3. 跨语言支持:许多 RPC 框架支持多种编程语言。

RPC 的挑战

  1. 网络问题:调用可能因网络问题而失败。
  2. 调试复杂性:排查远程调用失败的原因可能较复杂。
  3. 序列化/反序列化开销:需要额外的计算和带宽。

RPC 与其他技术的对比

  • 与 REST
    • RPC 更注重函数调用,REST 是以资源为中心。
    • RPC 通常使用二进制协议,REST 使用 JSON 或 XML。
  • 与消息队列
    • RPC 是同步调用,消息队列一般是异步通信。

示例(使用 gRPC 的简单例子)

定义服务(.proto 文件):
proto 复制代码
syntax = "proto3";

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}
生成代码并实现服务(Python 示例):
python 复制代码
import grpc
from concurrent import futures
import greeter_pb2
import greeter_pb2_grpc

class GreeterService(greeter_pb2_grpc.GreeterServicer):
    def SayHello(self, request, context):
        return greeter_pb2.HelloReply(message=f"Hello, {request.name}!")

server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
greeter_pb2_grpc.add_GreeterServicer_to_server(GreeterService(), server)
server.add_insecure_port('[::]:50051')
server.start()
server.wait_for_termination()
客户端调用:
python 复制代码
import grpc
import greeter_pb2
import greeter_pb2_grpc

channel = grpc.insecure_channel('localhost:50051')
stub = greeter_pb2_grpc.GreeterStub(channel)
response = stub.SayHello(greeter_pb2.HelloRequest(name="World"))
print(response.message)

RPC 是现代分布式系统的重要基础设施之一,适用于需要高效、透明调用的场景。

相关推荐
宁风NF2 小时前
JavaScript:网络请求与前端通信
开发语言·前端·javascript·网络·学习·ecmascript
孪生质数-3 小时前
AI Agent 工程实践(一):大模型 API 接入示范
网络·人工智能·ai·chatgpt·github·claude·claudecode
雾里0不看花3 小时前
【App Service Linux】在Linux App Service中安装 tcpdump 并抓取网络包
linux·网络·tcpdump
深圳市爱派派智能科技有限公司4 小时前
“高通 QCS8550 嵌入式主板 EC-A8550JD4:48 TOPS 算力上板“
网络·嵌入式·边缘计算·高通·qcs8550·天启智能·ec-a8550jd4
妍妍爱学习4 小时前
技术破界 数智共生:华为星河AI网络商业峰会5月18日深圳启幕
网络·ai·生态·数智化·峰会
funnycoffee1235 小时前
Cisco ip access-list序号重排方法
linux·网络·tcp/ip
nvd115 小时前
GCP 4层 外部网络负载均衡器深度解析
运维·网络·负载均衡
AI人工智能+电脑小能手6 小时前
【大白话说Java面试题 第210题】【10_网络协议篇】第1题:说说 TCP/IP 网络五层模型
java·网络协议·tcp/ip·计算机网络·网络五层模型
不在逃避q6 小时前
使用.NET实现自带思考的Tool 并且提供mcp streamable http服务
网络协议·http·.net
蓝斯4976 小时前
C# 调用邮箱应用发送带附件的邮件
网络·c#·github