什么是RPC?

本文详细解析了RPC(远程过程调用)的概念,包括其工作原理、与RMI的区别、与WebService的关系,以及RPC在服务化、模块重用和系统交互中的应用。同时,介绍了RPC的流程、需要处理的问题、协议和框架,帮助读者全面掌握RPC技术。

RPC是什么?

过程是什么?

    过程就是业务处理、计算任务,更直白理解,就是程序。(像调用本地方法一样调用远程的过程。)    

    RPC采用Client-Server结构,通过request-response消息模式实现。

 

    RPC 和 RMI有什么区别?

    RMI(remote method invocation)远程方法调用是 oop 领域中 RPC 的一种具体实现。jdk中有RMI实现,可详看。

    我们熟悉的webservice、restfull接口调用是RPC吗?

    都是RPC,仅消息的组织方式及消息协议不同。

 

    远程过程调用较本地调用有何不同?

    速度相对慢、可靠性减弱。

 

RPC的流程

 

  1. 客户端处理过程中调用Client stub(就像调用本地方法一样),传递参数;

  2. Client stub将参数编组为消息,然后通过系统调用向服务端发送消息;

  3. 客户端本地操作系统将消息从客户端机器发送到服务器机器;

  4. 服务端操作系统将接收到的数据包传递给Server stub;

  5. Server stub解组消息为参数;

  6. Server stub再调用服务的过程,过程执行结果以反方向的相同步骤响应给客户端。

RPC该流程中需要处理哪些问题?

  1. Client stub、SErver stub的开发; 

  2. 参数如何编组为消息,以及解组消息;

  3. 消息如何发送;

  4. 过程结果如何表示、异常情况如何处理;

  5. 如何实现安全访问控制。

 

RPC协议是什么?

    RPC调用过程中需要将参数编组为消息进行发送,接收方需要解组消息为参数,过程处理结果同样需要经编组、解组。消息由哪些部分构成及消息的表示形式就构成了消息协议。

    RPC调用过程中采用的消息协议成为RPC协议。

    RPC协议规定请求、响应消息的格式

    在TCP(网络传输控制协议)上可选用或自定义消息协议来完成RPC消息交互

    我们可以选用通用的标准协议(如:http、https),也可根据自身的需要定义自己的消息协议!

 

RPC框架是什么?

    封装好参数编组、消息解组、底层网络通信的RPC程序开发框架,带来的便捷是可以直接在其基础上只需专注过程代码编写。

 

    Java领域:

  • 传统的webservice框架:Apache CXF、Apache Axis2、java 自带的JAX-WS等等。webService框架大多基于标准的SOAP协议。

  • 新兴的微服务框架:Dubbo、springcloud、Apcehe Thrift 等等。

 

为什么要用 RPC

    服务化(系统中多个模块之间调用)

    可重用(共用模块抽出来被调用)

    系统间交互调用(多个厂商系统之间互相调用)

 

RPC核心概念术语

  • Client、Server、calls(调用)replies(响应)、service(服务),programs(程序),procedures(过程),version(版本),marshalling(编组)、unmarshalling(解组)

  • 一个网络服务有一个或多个远程程序集构成

  • 一个远程程序实现一个或多个远程过程

  • 过程、过程的参数、结果在程序协议说明书中定义说明

  • 为兼容程序协议变更、一个服务端可能支持多个版本的远程程序

<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 网络层优化
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值