跳到主要内容

什么是 RPC

RPC(Remote Procedure Call)远程过程调用,是分布式系统中不同节点间流行的通信方式。在互联网时代,RPC 已经和 IPC(Inter-Process Communication)一样成为一个不可或缺的基础构件。RPC 是一种用于在计算机网络中调用远程服务的方法,它可以在两个不同的计算机之间进行通信,并执行远程过程

RPC 和 RESTful 的区别

  • RPC 是一种通信方式,RESTful 是一种风格
  • RESTful 一般是对于资源的操作,它是名词(资源地址),然后添加一些动作对这些资源进行操作。而 RPC 是基于函数,它是动词
  • RPC 一般基于 TCP 协议(当然 gRPC 是基于 HTTP2),但它也是比 HTTP 协议更加有效率和更多特性。RESTful 一般都是基于 HTTP 协议
  • 传输方面
    • gRPC 用的是 protobufIDL 语言,会编码为二进制协议的数据,自定义的 TCP 协议或者使用 HTTP2 协议,报文体积更小,所以传输效率更高
    • RESTful 一般基于 http 协议,报文体积大,RESTful 一般是用 json 的数据格式,json 格式的编解码更耗时
  • 使用场景
    • RPC 适用于需要远程调用的场景,比如:分布式系统、微服务、云原生应用等场景
    • RESTful 适用于需要基于 HTTP 的通信场景,比如:Web 应用、移动应用、物联网应用等场景

什么是 gRPC

gRPC 是一个高性能、开源和通用的远程过程调用 RPC 框架,最初由 Google 开发,并于 2015 年开源。它基于 HTTP/2 协议,支持多种编程语言,并使用 Protocol Buffers, protobuf 作为接口定义语言 IDL 和消息交换格式。gRPC 使客户端和服务器之间进行高效的通信,适用于微服务架构、分布式系统和云原生应用等场景

备注

IDL(Interface description language)是指接口描述语言,是用来描述软件组件接口的一种计算机语言,是跨平台开发的基础。IDL 通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信交流;比如,一个组件用 C++ 写成,另一个组件用 Go 写成

gRPC 中,客户端应用程序可以直接调用部署在不同机器上的服务端应用程序中的方法,就好像它是本地对象一样,使用 gRPC 可以更容易地创建分布式应用程序和服务。与许多 RPC 系统一样,gRPC 基于定义服务的思想,指定可以通过参数和返回类型远程调用的方法。在服务端侧,服务端实现接口,运行 gRPC 服务,处理客户端调用。在客户端侧,客户端拥有存根(Stub,在某些语言中称为客户端),它提供与服务端相同的方法

grpc

通信流程:

  • 客户端 gRPC Stub 调用 A 方法,发起 RPC 调用
  • 对请求信息使用 Protobuf 进行对象序列化压缩IDL
  • 服务端 gRPC Server 接收到请求后,解码请求体,进行业务逻辑处理并返回
  • 对响应结果使用 Protobuf 进行对象序列化压缩IDL
  • 客户端接受到服务端响应,解码请求体。回调被调用的 A 方法,唤醒正在等待响应(阻塞)的客户端调用并返回响应结果

gRPC 客户端和服务端可以在各种环境中运行和相互通信:从 Google 内部的服务器到你自己的桌面,并且可以使用 gRPC 支持的任何语言编写。因此,比如,可以轻松地用 Java 创建 gRPC 服务端,使用 GoPythonRuby 创建客户端。此外,最新的 Google API 将包含 gRPC 版本的接口,使你轻松地将 Google 功能构建到应用程序中

gRPC 特点

  • 简单的服务定义:使用 Protocol Buffers(强大的二进制序列化工具集和语言)定义服务
  • 快速开始和伸缩:使用单行代码安装运行时和开发环境,还可以使用框架扩展到每秒数百万个 RPC
  • 适用于多种语言和平台:自动地为服务生成各种语言和平台的客户端和服务端存根,gRPC 是与语言无关,平台无关的。定义好了一个 protobuf 协议,就可以用 protoc 生成不同语言的协议框架
  • 双向流和集成认证:gRPC 客户端和服务端可以双向通信,双向流和完全集成的基于 HTTP/2 传输的可插拔认证

gRPC 环境安装

安装 protoc

protocProtocol Buffers 的编译器,可以将 .proto 文件编译为特定语言的源代码文件。例如xxx.pb.go,可以从 Protocol Buffers Releases 下载对应平台的 protoc 二进制文件进行安装,安装后添加到 PATH 环境变量中

macOS 上可以使用 brew 进行安装

~ brew install protobuf

安装完成后,验证安装

~ protoc --version
libprotoc 32.1

安装 Go 的 protoc 插件

安装 protoc-gen-go-grpcprotoc-gen-go,因为 protoc 没有内置 go 生成器,想实现 .proto ——> .go 的转换的话,还需要安装 protobufgolang 编译器插件,用于生成 go 文件,具体来说

protoc-gen-go 会根据.proto文件生成一个后缀为.pb.go的文件,包含所有.proto文件中定义的类型及其序列化方法

protoc-gen-go-grpc 会生成一个后缀为_grpc.pb.go的文件,其中包含

  • 一种接口类型(或存根) ,供客户端调用的服务方法
  • 服务器要实现的接口类型
~ go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
~ protoc-gen-go --version
protoc-gen-go v1.36.10
~ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
~ protoc-gen-go-grpc --version
protoc-gen-go-grpc 1.5.1

上述安装完成后,就可以正常开发 gRPC 服务, 并使用 protoc 生成 go 代码了

提示

更多可以查看官方文档以全面了解