什么是RPC? RPC是什么?

什么是RPC? RPC是什么?
远程过程调用协议

古人语:独学而无友,则孤陋而寡闻。今效仿先贤,欲结交IT界之通道,帮助梳理开发通用的方法,供后来IT男学习,以成事温家之用。QQ:852383695

RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底>层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络>通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发>送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为>止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户>端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
有多种 RPC模式和执行。最初由 Sun 公司提出。IETF ONC 宪章重新修订了 Sun 版本,使得 ONC RPC 协议成为 >IETF 标准协议。现在使用最普遍的模式和执行是开放式软件基础的分布式计算环境(DCE)。

作者:lvgo
来源:优快云
原文:https://blog.youkuaiyun.com/sinat_34344123/article/details/79078654
版权声明:本文为博主原创文章,转载请附上博文链接!

<think>我们正在处理一个关于RPC(远程过程调用)的问题,用户希望了解RPC的基本概念、常见框架,以及哪些框架可以部署或移植到OpenWRT系统上。 首先,我们需要明确RPC的定义:RPC是一种计算机通信协议,允许程序调用另一个地址空间(通常是远程机器上)的过程或函数,而程序员无需显式编码这个远程调用的细节。简单来说,就是像调用本地函数一样调用远程函数。 常见的RPC框架包括: 1. gRPC(Google Remote Procedure Call):由Google开发,基于HTTP/2和Protocol Buffers,支持多种语言。 2. Apache Thrift:由Facebook开发,后由Apache维护,支持多种语言和多种消息格式。 3. JSON-RPC:基于JSON的轻量级RPC协议,通常用于Web服务。 4. XML-RPC:使用XML编码和HTTP协议。 5. Dubbo:阿里巴巴开源的Java RPC框架,主要用于分布式服务框架。 6. CORBA:一种跨语言的RPC标准,但相对复杂。 接下来,考虑OpenWRT系统的特点:它是一个嵌入式Linux系统,资源有限(如内存、存储空间较小),因此我们需要选择轻量级的RPC框架。 根据引用[2]中提到的,OpenWRT中已经集成了easycwmp(用于TR069协议),这说明了OpenWRT的软件包管理支持。我们可以通过OpenWRT的包管理器opkg来安装一些软件包。 因此,我们需要寻找支持C/C++语言(因为OpenWRT上C/C++运行效率高,且资源占用少)或者轻量级脚本语言(如Lua)的RPC框架,并且最好已经在OpenWRT上有移植或者可以轻松交叉编译的。 以下是一些可能适合OpenWRT的RPC框架: 1. gRPC:虽然功能强大,但它的库比较大,可能不适合资源受限的OpenWRT设备。不过,如果设备资源足够,可以尝试使用gRPC的C++版本(但需要编译支持,且OpenWRT官方可能没有提供现成的包)。 2. Apache Thrift:支持C/C++,相对轻量,且OpenWRT官方仓库中可能包含thrift的包。我们可以检查OpenWRT的packages仓库。 3. JSON-RPC:由于其轻量级和简单性,非常适合嵌入式设备。我们可以使用C/C++实现的JSON-RPC库,例如: - libjson-rpc-cpp: 一个C++的JSON-RPC框架,支持http和tcp,但需要依赖boost和jsoncpp,在OpenWRT上可能占用较大空间。 - 其他轻量级的JSON-RPC实现,例如用C语言编写的库(如libjson-rpc)或者用Lua编写的轻量实现(如果OpenWRT上已经安装了Lua)。 4. xmlrpc-c:XML-RPC的C实现,但XML解析可能会占用较多资源,不如JSON轻量。 5. Cap'n Proto RPC:由Cap'n Proto序列化框架提供的RPC系统,设计上注重性能和低开销,但OpenWRT上可能没有现成包。 根据OpenWRT的软件包仓库(https://openwrt.org/packages/start),我们可以搜索相关包: - 搜索thrift:在OpenWRT 21.02.3中,有thrift包(thrift和thrift-c_glib),但可能不是最新版本。 - 搜索jsonrpc:有libjson-rpc-cpp包,但需要依赖libjsoncpp和libmicrohttpd等,可能占用空间较大。 - 搜索capnp:有capnproto包,但可能不包含RPC部分(Cap'n Proto的RPC是独立的,需要确认包是否包含)。 另外,我们还可以考虑一些专为嵌入式系统设计的RPC框架: - msgpack-rpc: 基于MessagePack的二进制RPC协议,轻量高效。有C++实现(msgpack-rpc-cpp),但OpenWRT仓库中可能没有现成包,需要自己移植。 - nanorpc: 一个非常轻量级的RPC框架,但可能功能有限。 由于OpenWRT支持多种编程语言,我们也可以考虑使用Python或Lua编写的RPC框架,前提是设备上已经安装了相应的解释器。例如: - Python: 可以使用xmlrpc.client(标准库)或第三方库如Pyro4(但Pyro4可能较重)。 - Lua: 有LuaRPC(https://github.com/jsnyder/luarpc)等。 但是,考虑到嵌入式设备的资源限制,通常C/C++实现的框架更受青睐。 结论: 1. 对于资源非常有限的设备,推荐使用基于JSON-RPC的轻量级C实现,或者使用MessagePack-RPC(二进制,更高效)。 2. 如果设备资源相对充足,且需要多语言支持,可以考虑Thrift,因为OpenWRT官方仓库中有Thrift包。 具体选择哪个框架,还需要根据实际需求(如是否需要跨语言、性能要求、资源占用要求等)来决定。 根据引用[2]中提到的,easycwmp在OpenWRT中已经集成,它使用了脚本和C语言两种实现。我们可以借鉴其设计思路,例如使用C语言实现核心RPC通信,以节省资源。 因此,我们推荐以下框架: - Apache Thrift(如果设备资源允许) - 轻量级JSON-RPC(C实现)或MessagePack-RPC(C实现) 下面,我们提供一些在OpenWRT上部署RPC框架的方法: 1. 使用OpenWRT的包管理器安装(如果存在): opkg update opkg install thrift # 安装Thrift # 或者 opkg install libjson-rpc-cpp # 安装JSON-RPC C++库 2. 如果官方仓库没有,可以尝试从源码交叉编译。例如,编译msgpack-rpc-cpp: - 下载源码 - 使用OpenWRT SDK进行交叉编译 最后,我们生成相关问题。 注意:由于引用内容中并没有直接提到RPC框架,我们主要基于对OpenWRT和RPC框架的了解来回答。但引用[2]提到了OpenWRT支持easycwmp,这证明了OpenWRT的扩展性。</think>### 什么是远程过程调用(RPC)? 远程过程调用(**RPC**)是一种计算机通信协议,允许程序调用另一个地址空间(通常是远程服务器)的过程或函数,而无需显式处理网络通信细节。其核心思想是**像调用本地函数一样调用远程服务**,隐藏底层网络传输的复杂性。基本流程如下: 1. 客户端调用本地存根(Stub) 2. 存根将参数序列化为网络传输格式 3. 通过网络发送到服务端 4. 服务端反序列化参数并执行函数 5. 结果按相同路径返回给客户端 关键特性包括: - **透明性**:开发者无需关注网络传输细节 - **跨语言支持**:通过接口定义语言(IDL)实现多语言互操作 - **高效通信**:通常基于二进制协议(如Protocol Buffers) --- ### 常见 RPC 框架 | 框架 | 开发方 | 核心特性 | 适用场景 | |--------------|--------------|-----------------------------------|------------------------------| | **gRPC** | Google | 基于 HTTP/2 + Protobuf,多语言支持 | 高性能微服务、云原生 | | **Apache Thrift** | Facebook | 支持多种序列化 + RPC,跨语言 | 多语言异构系统 | | **JSON-RPC** | 社区标准 | 轻量级、基于 JSON/HTTP | Web 服务、简单嵌入式交互 | | **XML-RPC** | 早期标准 | 基于 XML/HTTP | 遗留系统集成 | | **Dubbo** | Alibaba | Java 生态,服务治理能力强 | 大型分布式 Java 系统 | --- ### 可部署/移植到 OpenWRT 的 RPC 框架 OpenWRT 作为嵌入式 Linux 系统,资源受限(CPU/内存/存储),需选择**轻量级、低依赖**的框架: 1. **JSON-RPC** - **优势**: - 协议简单,仅需 JSON 解析库(如 [Jansson](https://github.com/akheron/jansson)) - 支持 HTTP 或原始 TCP 传输 - 已有 C 语言实现(如 [libjson-rpc-c](https://github.com/naymspace/json-rpc-c)) - **OpenWRT 适配**: ```bash # 安装依赖 opkg install libjansson libmicrohttpd # 交叉编译示例(需 OpenWRT SDK) ./configure --host=arm-openwrt-linux --prefix=/usr ``` 2. **Apache Thrift (C 版本)** - **优势**: - 支持 C/C++,资源占用可控 - 代码生成工具生成轻量级服务端/客户端 - **移植步骤**: ```bash # 1. 下载 Thrift 源码编译(主机端) ./configure --enable-libs=no # 仅生成代码工具 make && make install # 2. 交叉编译 Thrift C 库(OpenWRT SDK) git clone https://github.com/apache/thrift cd thrift/lib/c ./bootstrap.sh ./configure --host=arm-openwrt-linux --prefix=/usr make && make install ``` 3. **gRPC (C++ 精简版)** - **挑战**: - 默认依赖较多(Protobuf、HTTP/2、OpenSSL) - 需裁剪:禁用非必要功能(如异步操作) - **优化方案**: ```bash # 编译选项(减少依赖) cmake -DgRPC_BUILD_CSHARP_EXT=OFF \ -DgRPC_BUILD_GRPC_CPP_PLUGIN=OFF \ -DgRPC_SSL_PROVIDER=none # 禁用 SSL ``` 4. **自定义轻量 RPC** - 参考 OpenWRT 现有组件(如 [easycwmp](https://github.com/easycwmp/easycwmp) 的 C 语言实现[^2]): - 使用纯 C 实现序列化/网络通信 - 基于 libevent 等高效事件库(OpenWRT 已集成[^4]) --- ### 部署建议 | 框架 | 存储占用 | CPU 开销 | 开发难度 | 推荐指数 | |------------|----------|----------|----------|----------| | JSON-RPC | ★☆☆☆☆ | ★★☆☆☆ | ★☆☆☆☆ | ⭐⭐⭐⭐ | | Thrift (C) | ★★☆☆☆ | ★★★☆☆ | ★★★☆☆ | ⭐⭐⭐ | | gRPC | ★★★★☆ | ★★★★☆ | ★★★★☆ | ⭐⭐ | | 自定义实现 | ★☆☆☆☆ | ★★☆☆☆ | ★★★★★ | ⭐⭐⭐ | > ✅ **首选推荐**:**JSON-RPC**(简单易用)或 **Thrift C 版本**(平衡功能与性能),避免 gRPC 等重型框架。 --- ### 相关问题 1. 如何在资源受限的嵌入式系统中优化 RPC 框架的性能? 2. JSON-RPC 与 Thrift 在 OpenWRT 上的实际性能对比如何? 3. 如何为 OpenWRT 设备设计安全的 RPC 认证机制? [^1]: 工程架构应与软件架构匹配,将设计思想贯彻到底 [^2]: easycwmp 的纯 C 实现适合资源受限设备,性能显著优于脚本方案 [^4]: OpenWRT 支持 libevent 等高效事件库,可用于 RPC 网络层优化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值