概念
远程过程调用(Remote Procedure Call,RPC)是一种软件通信协议,它允许一个程序在网络中的另一台计算机上请求服务,而无需了解网络的细节。RPC可用于像本地系统一样调用远程系统上的其他进程。过程调用有时也被称为函数调用或子程序调用。RPC采用客户端-服务器模型。请求服务的程序是客户端,提供服务的程序是服务器。
接口定义语言(Interface Definition Language,IDL)通常用于描述远程过程调用软件中的应用程序编程接口(API)。在这种情况下,IDL提供了在链接的两端可能使用不同操作系统和计算机语言的机器之间的桥梁。
原理
一次RPC的完整过程
IDL(Interface description language)文件
IDL通过一种中立的方式来描述接口。使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信。
生成代码
通过编译器工具把IDL文件转换成语言对应的静态库。
编解码
从内存中表示到字节序列的转换称为编码,反之为解码,也常叫做序列化和反序列化。
通信协议
规范了数据在网络中的传输内容和格式。除必须的请求/响应数据外,通常还会包含额外的元数据。
网络传输
通常基于成熟的网络库走TCP/UDP传输。
常见的RPC框架
Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用 Dubbo 提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo 被设计为高度可扩展,用户可以方便的实现流量拦截、选址的各种定制逻辑。
gRPC是一个现代化的开源高性能远程过程调用(RPC)框架,可以在任何环境中运行。它能够高效地连接数据中心内部和跨数据中心的服务,并支持负载均衡、跟踪、健康检查和身份验证等可插拔的功能。同时,它还适用于分布式计算的最后一段,可以将设备、移动应用程序和浏览器与后端服务进行连接。
Apache Thrift软件框架用于可扩展的跨语言服务开发,它结合了一个软件堆栈和代码生成引擎,可以构建在C++、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、Cocoa、JavaScript、Node.js、Smalltalk、OCaml和Delphi等多种语言之间高效无缝运行的服务。