科普向 -- 什么是RPC

科普向 -- 什么是RPC

RPC,全称为远程过程调用(Remote Procedure Call),是一种计算机通信协议,允许程序在不同的地址空间(通常是不同的计算机)上执行代码。RPC使得程序可以像调用本地函数一样调用远程函数,屏蔽了底层的网络通信细节。

RPC的基本工作原理如下:

  1. 客户端调用:客户端程序调用一个本地的代理函数(也称为存根,stub),这个函数封装了对远程函数的调用。
  2. 序列化请求:代理函数将调用参数序列化(也称为编组,marshalling)成一个标准格式,通常是字节流。
  3. 发送请求:序列化后的请求通过网络传输到远程服务器。
  4. 服务器接收请求:服务器上的代理函数接收请求并进行反序列化(解组,unmarshalling),恢复出原始的调用参数。
  5. 执行远程函数:服务器执行实际的远程函数,并将结果返回给代理函数。
  6. 返回结果:代理函数将结果序列化,并通过网络传回客户端。
  7. 客户端接收结果:客户端的代理函数接收并反序列化结果,然后将结果返回给原始调用者。

RPC的主要优点包括:

  • 透明性:调用远程函数与调用本地函数的方式相同,程序员无需关注底层的网络通信细节。
  • 模块化:可以将不同功能模块分布在不同的服务器上,提高系统的可扩展性和可靠性。

常见的RPC框架和协议包括:

  • gRPC:由Google开发的高性能RPC框架,基于HTTP/2和Protocol Buffers。
  • XML-RPC:基于XML的RPC协议,使用HTTP作为传输协议。
  • JSON-RPC:基于JSON的RPC协议,简单易用。
  • Thrift:由Apache开发的跨语言RPC框架,支持多种序列化格式和传输协议。

通过RPC,分布式系统中的各个组件能够高效地进行通信和协作,从而实现复杂的业务逻辑。


RPC(远程过程调用)不仅可以用于不同计算机之间的通信,也可以在同一台计算机上实现。这种情况下,RPC仍然有其应用价值,主要体现在以下几个方面:

  1. 模块化设计:通过RPC,可以将应用程序的不同模块分离为独立的服务,即使它们运行在同一台计算机上。这种设计方式有助于代码的组织和维护。
  2. 语言无关性:RPC可以用于不同编程语言之间的调用。例如,一个用Python编写的模块可以通过RPC调用一个用C++编写的模块。
  3. 统一接口:即使在同一台计算机上,不同模块之间的通信也可以通过统一的接口进行,简化了开发和调试过程。
  4. 模拟分布式环境:在开发和测试阶段,可以先在本地实现和测试RPC调用,然后再部署到实际的分布式环境中。

在同一台计算机上实现RPC的具体方法与跨计算机实现RPC的基本原理相同。常见的实现方式包括:

  • 本地环回网络接口(localhost):即使在同一台计算机上,也可以通过环回地址(127.0.0.1)进行网络通信。
  • 共享内存:一些高性能的RPC实现可能会利用共享内存来传递数据,以减少网络通信的开销。
  • 管道(Pipes):在同一台计算机上,不同进程之间可以通过管道进行通信。

下面是一个使用Python和gRPC在同一台计算机上实现RPC的简单示例:

1. 定义.proto文件:

syntax = "proto3";

service ExampleService {
  rpc SayHello (HelloRequest) returns (HelloResponse);
}

message HelloRequest {
  string name = 1;
}

message HelloResponse {
  string message = 1;
}

2. 生成gRPC代码:

python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. example.proto

3. 实现服务器:

python 复制代码
import grpc
from concurrent import futures
import example_pb2
import example_pb2_grpc

class ExampleServiceServicer(example_pb2_grpc.ExampleServiceServicer):
    def SayHello(self, request, context):
        return example_pb2.HelloResponse(message=f"Hello, {request.name}!")

def serve():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    example_pb2_grpc.add_ExampleServiceServicer_to_server(ExampleServiceServicer(), server)
    server.add_insecure_port('[::]:50051')
    server.start()
    server.wait_for_termination()

if __name__ == '__main__':
    serve()

4. 实现客户端:

python 复制代码
import grpc
import example_pb2
import example_pb2_grpc

def run():
    with grpc.insecure_channel('localhost:50051') as channel:
        stub = example_pb2_grpc.ExampleServiceStub(channel)
        response = stub.SayHello(example_pb2.HelloRequest(name='World'))
        print("Client received: " + response.message)

if __name__ == '__main__':
    run()

通过这种方式,即使在同一台计算机上,客户端和服务器也可以通过RPC进行通信。

相关推荐
澜世1 分钟前
2024小迪安全基础入门第三课
网络·笔记·安全·网络安全
ZZZCY20032 小时前
华为ENSP--IP编址及静态路由配置
网络·华为
EasyCVR2 小时前
私有化部署视频平台EasyCVR宇视设备视频平台如何构建视频联网平台及升级视频转码业务?
大数据·网络·音视频·h.265
hgdlip3 小时前
主IP地址与从IP地址:深入解析与应用探讨
网络·网络协议·tcp/ip
珹洺3 小时前
C语言数据结构——详细讲解 双链表
c语言·开发语言·网络·数据结构·c++·算法·leetcode
科技象限3 小时前
电脑禁用U盘的四种简单方法(电脑怎么阻止u盘使用)
大数据·网络·电脑
东方隐侠安全团队-千里3 小时前
网安瞭望台第3期:俄黑客 TAG - 110组织与密码攻击手段分享
网络·chrome·web安全·网络安全
云计算DevOps-韩老师4 小时前
【网络云计算】2024第47周-每日【2024/11/21】周考-实操题-RAID6实操解析2
网络·云计算
lwprain4 小时前
安装支持ssl的harbor 2.1.4 docker 19.03.8 docker-compose 1.24.0
网络协议·ssl·harbor
软件技术员4 小时前
Let‘s Encrypt SSL证书:acmessl.cn申请免费3个月证书
服务器·网络协议·ssl