grpc-go资料.md

概述

函数整理

客户端

NewClient / Dial

ClientConn

ClientStream

服务端

NewClient

1. ClientConn

这是 gRPC 客户端的核心数据结构之一。ClientConn 表示到 gRPC 服务器的连接,用于发起 RPC 调用。对于流式 RPC,ClientConn 管理底层的 HTTP/2 连接,它支持多路复用,允许在同一个连接上并行发送多个请求和响应。

2. Stream

这是双向流通信的基本抽象。在 gRPC 中,Stream 接口定义了发送和接收消息的基本操作。具体到 Go 实现,你可能会看到 ClientStreamServerStream 接口,它们分别用于客户端和服务器端的流操作。

  • ClientStream 提供方法如 SendMsgRecvMsg,这些方法用于发送和接收消息。
  • ServerStream 同样提供了发送和接收消息的方法,还包括了一些服务端特有的上下文管理功能。

3. http2Client

这个内部组件是 gRPC 客户端用来处理 HTTP/2 协议细节的实现。它负责管理底层的 HTTP/2 帧,包括流控制、错误处理、和帧的发送与接收。

4. transport

transport 包中定义了 gRPC 的网络传输层。这是一个关键的组件,因为它直接处理所有通过网络发送和接收的数据。在这个包中,你会找到实现如 Stream 接口的 http2Clienthttp2Server,它们封装了 HTTP/2 的流操作。

  • Transport 接口定义了通用的发送和接收操作,适用于客户端和服务端。
  • http2Transport 类则是这些接口的具体实现,特别关注 HTTP/2 的性能和特性。

5. codec

在 gRPC 中,codec 用于序列化和反序列化传输的消息。它在客户端和服务端之间的数据转换中起到了桥梁作用。默认情况下,gRPC 使用 Protocol Buffers,但也支持插入自定义编解码器。

6. Interceptor

拦截器在 gRPC 的流处理中扮演重要角色。它们允许开发者注入自定义逻辑,如日志记录、认证、监控等,而不需要修改实际的业务逻辑。对于流式 RPC,可以使用流拦截器来处理或修改进出的消息。

  • UnaryInterceptorStreamInterceptor 是两种类型的拦截器,分别用于单向和双向流的 RPC 调用。

Http2Client newHTTP2Client

1. 初始化和连接管理

  • 连接上下文的创建:为给定的地址创建一个带取消功能的上下文,用于管理连接的生命周期。
  • 错误处理:在连接建立过程中遇到错误时,能够及时取消上下文和清理资源。

2. 地址解析和拨号

  • 地址数据的处理:处理 resolver.Address 提供的信息,特别是其中的 Attributes,这些属性可以在连接过程中传递给拨号器和凭证握手器。
  • 拨号:使用提供的拨号器和代理设置建立网络连接。

3. 连接监控

  • 连接监控:启动一个协程来监控连接上下文的取消或超时,一旦上下文被取消,立即关闭网络连接。

4. 安全和身份验证

  • 客户端握手:如果提供了传输凭证(如 TLS),执行客户端握手,验证服务器身份并建立安全连接。
  • RPC 凭证:处理每个 RPC 请求可能需要的凭证。

5. HTTP/2 特定配置

  • 初始化 HTTP/2 客户端:创建 http2Client 实例,配置其内部数据结构如流控制、帧处理器等。
  • 流量控制:配置和验证 HTTP/2 的流量控制参数,如连接和流的窗口大小。
  • Keepalive 参数:设置 TCP 连接的 Keepalive 参数,确保连接的活性。

6. 帧处理和流量控制

  • 帧处理器:初始化用于处理 HTTP/2 帧的帧处理器(framer),配置读写缓冲区大小和头部大小限制。
  • 连接预设:向服务器发送 HTTP/2 连接预设,并设置初始 HTTP/2 设置。

7. 事件和统计处理

  • 事件和统计:注册连接到 channelz(用于监视和调试 gRPC 连接)并启动统计处理程序,标记连接和处理连接事件。

8. 错误和流程控制

  • 错误处理:任何在连接建立或配置过程中出现的错误都将导致连接关闭并返回错误。
  • 消息接收循环:启动一个协程来读取服务器发送的消息,处理服务器预设响应或任何首先出现的错误。

9. 连接流程的终结

  • 写入客户端预设:确保成功写入客户端预设到服务器。
  • 设置初始化:发送必要的 HTTP/2 设置帧,如窗口大小和头部大小限制。
  • 流量控制窗口更新:如果需要,更新连接级别的流控制窗口。

NewServer ServerOption

1. Keepalive Time

设置 keepaliveTime 为 10 秒意味着,如果在这段时间内没有任何数据传输,客户端将发送一个 keepalive 探测。这个时间间隔不是特别短,也不是特别长,适中的设置有助于在保持连接活跃与减少不必要的网络流量之间取得平衡。

2. Keepalive Timeout

keepaliveTimeout 设置为 1 秒,这意味着客户端在发送 keepalive 探测后,如果在 1 秒内没有收到响应,则认为连接已失效。这个超时时间相对较短,可能不太适合网络延迟较大的环境,因为它可能导致误判网络延迟为连接问题。

3. Keepalive MinTime

keepaliveMinTime 设置为 8 秒(0.8 * keepaliveTime),这是服务器强制客户端在发送新的 keepalive 探测前必须等待的最小时间间隔。这个设置的目的是防止客户端过于频繁地发送探测,从而影响服务器性能。这种策略适用于防止服务器资源被客户端的频繁 keepalive 消息耗尽。

4. PermitWithoutStream

在服务器和客户端的 keepalive 配置中,都将 PermitWithoutStream 设置为 true,这允许即使在没有活动流的情况下也可以发送 keepalive 消息。这种配置对于长连接服务很有用,尤其是当连接上不频繁有数据传输,但双方仍需要知道连接的活跃状态时。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
const (
MaxConcurrentNum = 4 * 1024
ConnectTimeout = 10
RWBufSize = 1024 * 1024
BufPoolSize = 1024 * 1024
InitialWindowSize = 256 * 1024
InitialConnWindowSize = 1024 * 1024
KeepaliveHeartbeatInterval = 5
KeepaliveHeartbeatIntervalTimeout = KeepaliveHeartbeatInterval
KeepaliveMinTime = 4
)



kp1 := grpc.KeepaliveParams(keepalive.ServerParameters{
Time: KeepaliveHeartbeatInterval,
Timeout: KeepaliveHeartbeatIntervalTimeout,
})
kp2 := grpc.KeepaliveEnforcementPolicy(keepalive.EnforcementPolicy{
MinTime: KeepaliveMinTime,
PermitWithoutStream: true,
})

opts := []grpc.ServerOption{
grpc.MaxRecvMsgSize(1024 * 1024 * 1024), // 设置最大接收消息大小
grpc.MaxSendMsgSize(1024 * 1024 * 1024), // 设置最大发送消息大小
grpc.StreamInterceptor(streamInterceptor),
grpc.Creds(s.options.Creds),
grpc.MaxConcurrentStreams(MaxConcurrentNum),
grpc.ConnectionTimeout(ConnectTimeout),
grpc.WriteBufferSize(RWBufSize),
grpc.ReadBufferSize(RWBufSize),
grpc.InitialWindowSize(InitialWindowSize),
grpc.InitialConnWindowSize(InitialConnWindowSize),
grpc.SharedWriteBuffer(true),
kp1,
kp2,
}
grpcServer := grpc.NewServer(opts...)

grpc-go资料.md
https://abrance.github.io/2024/04/12/mdstorage/domain/network/协议/grpc-go资料/
Author
xiaoy
Posted on
April 12, 2024
Licensed under