gRPC
是通信协议基于 HTTP/2
,支持多语言的 RPC
框架,使用 Protobuf
作为它的接口设计语言(IDL
),可以通过 protoc
工具生成 Golang
语言的结构体。
RPC:Remote Procedure Call
的缩写,译为远程过程调用(也可译为远程方法调用或远程调用),它是计算机通信协议。该协议可以实现调用远程服务就像调用本地服务一样简单,无需关心跨网络,跨平台,跨语言等问题。
gRPC
消息序列化方式通常使用 Protobuf
,它是二进制格式,体积小,网络传输快,占用带宽流量少,调用性能更高。
gRPC 的特点
IDL
gRPC
使用 ProtoBuf
来定义服务,ProtoBuf
是由 Google
开发的一种数据序列化协议(类似于 XML
、JSON
)。ProtoBuf
能够将数据进行序列化,并广泛应用在数据存储、通信协议等方面。
多语言支持
gRPC
支持多种语言,并能够基于语言自动生成客户端和服务端功能库。目前已提供了 C
版本 grpc
、Java
版本 grpc-java
和 Go
版本 grpc-go
,其中,grpc
支持 C
、C++
、Node.js
、Python
、Ruby
、Objective-C
、PHP
和 C#
等语言,grpc-java
已经支持 Android
开发。
HTTP2
gRPC基于HTTP2标准设计,带来了更多强大功能,如双向流、头部压缩、多复用请求等。这些功能带来重大益处,如节省带宽、降低TCP链接次数、节省CPU使用和延长电池寿命等。同时,gRPC还能够提高了云端服务和Web应用的性能。gRPC既能够在客户端应用,也能够在服务器端应用,从而以透明的方式实现客户端和服务器端的通信和简化通信系统的构建。
使用 gRPC 定义服务端
gRPC 默认使用 Protobuf 作为接口设计语言,在 .proto
文件中使用 service 关键字定义服务,使用 rpc 和 returns 关键字定义指定请求参数和返回结果的方法。
gRPC 提供了 Protobuf 编译器插件 protoc-gen-grpc
,用于编译 .proto
文件,生成服务端和客户端代码,我们只需在服务端编写实现 Api 的代码,然后在客户端调用 Api。
syntax = "proto3"; import "google/protobuf/any.proto"; package hello; option go_package = "proto/gen/go"; message HelloReq { string name = 1; } message HelloResp { int32 code = 1; string greet = 2; google.protobuf.Any details = 3; } service HelloService { rpc Greet(HelloReq) returns (HelloResp); }
使用 gRPC 的客户端
通过 protoc 命令编译 .proto
文件,自动生成服务端和客户端代码。
在服务端,手动编写生成的服务端方法的业务逻辑代码,然后运行 gRPC 服务,接收并处理客户端请求,gRPC 服务自动解码请求参数,然后执行服务的方法,并将返回结果自动进行编码。
在客户端,实现和服务相同的方法,然后客户端可以本地调用这些方法,将请求参数封装在 Protobuf 的消息类型中,gRPC 将请求发送给服务器,并返回服务器的 Protobuf 序列化方式的响应消息。
参考文章: