怎么在golang中使用GRPC设置客户超时时间

  介绍

这篇文章给大家介绍怎么在golang中使用GRPC设置客户超时时间,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

什么是golang

golang是谷歌开发的一种静态强类型,编译型,并发型,并具有垃圾回收功能的编程语言,其语法与C语言相近,但并不包括如枚举,异常处理,继承,泛型、断言,虚函数等功能。

超时

建立连接

主要就2函数和拨打DialContext。

//,Dial  creates  a  client  connection 用,given 目标。   字符串,func 刻度盘(target  opts …DialOption), (* ClientConn,,错误),{   ,,,return  DialContext (context.Background(),目标,选择…)   } func  DialContext (ctx  context.Context, target 字符串,opts …DialOption), (conn  * ClientConn, err 错误){…}

DialContext太长了不帖了。看刻度盘实际上也是调用DialContext来实现的。如果你想在建立连接的时候使用超时控制。就使用

DialContext传入一个超时的情况下,就像下面的例子

ctx1,, cel :=, context.WithTimeout (context.Background (),, time.Second * 3)   defer 玻璃纸()   康涅狄格州,err :=, grpc.DialContext (ctx1、,地址,grpc.WithBlock (),, grpc.WithInsecure ())

另外调用拨号建立连接默认只是返回一个ClientConn的指针,相当于新了一个ClientConn把指针返回给你。并不是一定要建立真实的h3连接。至于真实的连接建立实际上是一个异步的过程。

当然了如果你想等真实的链接完全建立再返回ClientConn可以通过WithBlock传入选项来实现,当然了这样的话链接如果建立不成功就会一直阻塞直到康泰克斯超时。

真正的建立链接的代码后面介绍重试的时候会再详细介绍。

调用超时

这个比较简单

ctx,, cancel :=, context.WithTimeout (context.TODO (),, time.Second * 3)   defer 取消()   ,r, err :=, c.SayHello (ctx,,, pb.HelloRequest{名称:,名称})

如上代码传入一个超时上下文就可以服务器。

type  SearchService 结构{}   ,   func  (s  * SearchService),搜索(ctx  context.Context, r  * pb.SearchRequest), (* pb.SearchResponse,,错误),{   ,,,for 小姐::=,0;,小姐:& lt;, 5;,我+ +,,{   ,,,,,,,if  ctx.Err (),==, context.Canceled  {   ,,,,,,,,,,,return  nil,, status.Errorf (codes.Canceled,“SearchService.Search  canceled")   ,,,,,,,}   ,   ,,,,,,,time . sleep (1, *, time.Second)   ,,,}   ,   ,,,return , pb.SearchResponse{回应:,r.GetRequest (), +,“, Server"}, nil   }   ,   func  main (), {   ,,,…   }

而在服务器端,由于客户端已经设置了截止时间.Server势必要去检测它

否则如果客户已经结束掉了,服务器还傻傻的在那执行,这对资源是一种极大的浪费

因此在这里需要用ctx.Err()==上下文。取消进行判断,为了模拟场景我们加了循环和睡眠?

验证

重新启动服务器。去和客户端。去,得到结果:

,美元go  run  client.go   2018/10/06  17:45:55  client.Search 犯错:截止日期   exit  status  1

总结

本章节比较简单,你需要知道以下知识点:

怎么设置期限

为什么要设置期限

你要清楚地明白到,gRPC期限是很重要的,否则这小小的功能点就会要了你生产的命。

<强>补充:golang使用gRPC超时控制和对冲策略

超时控制

grcp超时控制设置在客户端调用服务时,如果设定了超时时间,客户端会立即返回超时。超时控制一般有三个因素:链路超时:上有调用端通过协议字段把自己允许的超时时间传给当前服务,表示在该时间内返回数据,超时返回已无意义。流程如下一个调图用B的总超时情况。

消息超时:服务端收到请求消息到返回响应数据的最长消息处理时间。下图B的内部的当前请求整体超时时间。调用超时:当前服务调用下游服务设置的每一个rpc请求的超时时间。如下图B调用C的单个超时时间。通常一次请求会连续调用多次rpc,这个调用超时控制的是每个rpc的独立超时时间。

怎么在golang中使用gRPC设置客户超时时间

发起rpc调用请求时,需要计算此次rpc调用的超时时间。真正生效的超时时间是通过以上三个因素实时计算的最小值,计算过程

怎么在golang中使用GRPC设置客户超时时间