gRPC默认的请求的超时时间是很长的,当你没有设置请求超时时间时,所有在运行的请求都占用大量资源且可能运行很长的时间,导致服务资源损耗过高,使得后来的请求响应过慢,甚至会引起整个进程崩溃。

Deadlines 允许gRPC客户端设置自己等待多长时间来完成rpc操作,直到出现这个错误 DEADLINE_EXCEEDED。
但是在正常情况下,这个DEADLINE_EXCEEDED默认设置是一个很大的数值。
一些语言的API用deadline,一些用 timeout。

建立连接

主要就2函数Dail和DialContext。

  1. // Dial creates a client connection to the given target.
  2. func Dial(target string, opts ...DialOption) (*ClientConn, error) {
  3. return DialContext(context.Background(), target, opts...)
  4. }
  5. func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *ClientConn, err error){...}

看Dial实际上也是调用DialContext来实现的。
如果你想在建立连接的时候使用超时控制,就使用DialContext传入一个Timeout的context。就像下面的例子

  1. ctx1, cel := context.WithTimeout(context.Background(), time.Second*3)
  2. defer cel()
  3. conn, err := grpc.DialContext(ctx1, address, grpc.WithBlock(), grpc.WithInsecure())

Deadlines使用步骤

使用Dail
1.设置deadlines

  1. var deadlineMs = flag.Int("deadline_ms", 20*1000, "Default deadline in milliseconds.")
  2. clientDeadline := time.Now().Add(time.Duration(*deadlineMs) * time.Millisecond)
  3. ctx, cancel := context.WithDeadline(ctx, clientDeadline)
  4. defer cancel()

2.检查deadlines

  1. if ctx.Err() == context.Canceled {
  2. return status.New(codes.Canceled, "Client cancelled, abandoning.")
  3. }