1、简述

gRPC是可以在任何环境中运行的现代开源高性能RPC框架。与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。

图1

2、主要使用场景

  • 在微服务风格架构中有效连接多种服务
  • 将移动设备,浏览器客户端连接到后端服务
  • 生效高效的客户端

3、核心功能

  • 十种常用语言的客户端库
  • 高效的连接和简单的服务定义框架
  • 双向流和基于http/2的传输
  • 可插拔身份验证,跟踪,负债均衡和运行状况检查

4、使用proto buffers

gRPC默认使用Protocol Buffers序列化协议,用于序列化结构化数据。当然也可以使用json。

5、服务定义

定义一个服务, 指定其可以被远程调用的方法及其参数和返回类型。gRPC 默认使用 protocol buffers 作为接口定义语言,来描述服务接口和有效载荷消息结构。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
service HelloService {
  rpc SayHello (HelloRequest) returns (HelloResponse);
}

message HelloRequest {
  required string greeting = 1;
}

message HelloResponse {
  required string reply = 1;
}

gRPC支持的四种服务方法:

5.1、单项RPC(Simple RPC

客户端发送一个请求给服务端,从服务端获取一个应答,就像一次简单的服务调用。

1
2
rpc SayHello(HelloRequest) returns (HelloResponse){
}

5.2、服务端流式RPC(Server-side streaming RPC

客户端发送一个请求给服务端,可获得一个数据流用来读取一系列消息。客户端从返回的数据流里一直读取直到没有更多消息为止。gRPC保证单个RPC调用中的消息顺序。

1
2
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse){
}

5.3、客户端流式RPC(Client-side streaming RPC)

客户端用提供的一个数据流写人并发送一系列消息给服务端。一旦客户端完成消息写入,就等服务端读取这些消息并返回应答。gRPC保证单个RPC调用中的消息顺序。

1
2
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse) {
}

5.4、双向流式RPC(Bidirectional streaming RPC)

双方都使用读写流发送一系列消息。这两个数据流是独立的,所以服务端和客户端可以按其期望的任意顺序读写,如:服务端可以在写响应之前等待接收所有客户端消息,或者可以先读消息再写消息,或者其他一些读写组合。每个流中的消息顺序都会保留。

1
2
rpc BidiHello(stream HelloRequest) returns (stream HelloResponse){
}

6、使用API接口

gRPC提供protocol buffer 编译插件,能够从一个定义服务的.proto文件生成客户端和服务端代码。通常gRPC用户可以在服务端实现这些API,并从客户端调用:

  • 在服务端,服务器实现服务声明的方法,并运行gRPC服务器处理客户端调用。gRPC底层架构会解码传入的请求,执行服务方法,编码服务应答。
  • 在客户端,客户端有一个存根实现了服务端相同的方法。客户端可以在本地存根调用这些方法,用合适的protocol buffer消息类型封装这些参数,gRPC来负债发送请求给服务端并返回服务端protocol buff响应。s