gRPC 应用指引

科技资讯 投稿 8500 0 评论

gRPC 应用指引

一、核心概念、架构及生命周期

1、服务定义

service HelloService {
  rpc SayHello (HelloRequest returns (HelloResponse;
}

message HelloRequest {
  string greeting = 1;
}

message HelloResponse {
  string reply = 1;
}

gRPC 可以定义四种类型服务:

    rpc SayHello(HelloRequest returns (HelloResponse;
    
  • 服务端流式请求:客户端发送一次请求,服务端流式返回一系列数据。

    rpc LotsOfReplies(HelloRequest returns (stream HelloResponse;
    
  • 客户端流式请求:客户端流式写入一系列请求,然后发送到服务端。客户端写完请求后,等待服务端接受并返回结果。

    rpc LotsOfGreetings(stream HelloRequest returns (HelloResponse;
    
  • 双向流式请求:客户端和服务端双向发送数据流,各自独立。可以随读随写,或者一次性读完再写。

    rpc BidiHello(stream HelloRequest returns (stream HelloResponse;
    

2、API 使用

首先在 .proto 文件中定义一个服务,然后使用 gRPC 提供的 pb 编译插件来生成客户端和服务端代码。

    服务端:实现定义的服务,响应客户端请求。gRPC 框架解码请求,执行服务方法,编码返回结果。
  • 客户端:本地 stub 包含实现的服务方法,客户端可以直接调用 stub 的相应方法,以 pb 消息类型包装请求参数发送到服务器,同时返回服务器返回的结果。

3、同步和异步

4、RPC 生命周期

a)Unary RPC

客户端发送一次请求,获取一次返回。

    客户端请求本地 stub 方法,服务端获取到通知,并伴随着客户端的请求数据,包括客户端 metadata、方法名及 deadline。服务端可以直接返回自身的 metadata(必须在业务结果返回前返回)或者等待客户端的请求消息(自定义)。
  • 服务端收到客户端请求消息,然后执行相应的方法,组装相应的数据结果,伴随着请求状态信息(状态码及可能状态消息)返回给客户端。
  • 如果状态为 OK,则客户端可以获取到结果进行处理,完成整个调用过程。

b)服务端流式 RPC

c)客户端流式 RPC

客户端发送的是一个请求数据流。

d)双向流式 RPC

5、Deadlines/Timeouts

gRPC 允许客户端声明超时(请求 DEADLINE_EXCEEDED 异常之前等待的时间)。服务端可以通过此来判定请求是否超时及剩余处理时间。

6、RPC 终止

7、RPC 请求取消

客户端和服务端都可以在任何时候取消 RPC 流程。

8、Metadata

key 大小写敏感,不能以 grpc- 做前缀(保留),二进制 value 的 key 以 -bin 结尾。

元数据使用,不同开发语言可能不同。

9、Channels

channel 提供相应的参数配置控制 gRPC 请求行为,例如交互数据压缩等。

二、最佳实践

rpc 请求初始化包括:客户端负载均衡,传输层 HTTP/2 请求创建及请求服务端相应的业务接口。

2、提供心跳机制以确保 HTTP/2 连接即使在系统业务不活跃时段仍能保持活跃,避免因 RPC 请求初始化导致的响应延迟。

4、每一个 gRPC channel 可以使用 0 个或多个 HTTP/2 链接,每个链接可以承载一定数量的的并发数据流。当链接上活跃的 RPC 请求达到上限,新进的请求会进入调用端等待队列。因此,对于高负载或持久的流式请求会因此产生性能问题。对于此,可以使用如下两种方式处理:

    对于此类业务请求使用额外的 chennel。
  • 使用 gRPC 连接池来均衡处理请求(需要特定的处理来避免重复使用同一个 channel) 

    使用非阻塞 stubs 来并行处理 RPC 请求。

  • 提供自定义连接池,根据实际的业务负载来配置相关参数。

编程笔记 » gRPC 应用指引

赞同 (39) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽