在api层逻辑代码中设置context超时时间,传递到rpc层逻辑代码时设置的context超时时间消失
我在用
go-zero
时,在api
层传递context
到rpc
层,但报错:rpc error:DeadlineExceeded desc = context deadline exceeded
,这是上下文超时导致的(客户端用的上下文是context.WithTimeout
超时时间小于服务端的返回时间,造成context deadline exceeded
)。为解决报错,我在api
层使用“ctx, cancel := context.WithTimeout(context.Background(), time.Hour*3)
”,再将ctx
替换原本的context
传到rpc
层,最后还是报同样的错误。我使用debug
追踪代码后发现是这个go-zero
中的的拦截器导致的:这个方法的参数是拦截器获取的,具体可以看一下这个博客:https://www.lixueduan.com/posts/grpc/05-interceptor/
一旦执行这个拦截器,它会将
api
层设置的Rpc: Timeout
作为api
层传入context
的父context
的超时时间进行设置,若父context
或子context
(api
层传入context
)超时时间结束,请求会被直接终止。若没有设置Rpc: Timeout
,则默认2s
。解决方案:
我通过在
api
和rpc
层的yml
文件中设置Timeout
解决了这个问题。文章来源:https://www.toymoban.com/news/detail-507498.html我们在
api
层逻辑代码中设置context
超时时间,传递到rpc
层逻辑代码时,设置的context
超时时间其实并没有消失,只是我们在api
层传入的context
变成了子context
,它的父context
超时时间结束时,整个请求都会被结束,所以我们必须要设置父context
的超时时间才行。文章来源地址https://www.toymoban.com/news/detail-507498.html
api层和rpc层Timeout配置说明
Api层
yml配置:
Name: msm-api # 服务名 Host: 0.0.0.0 Port: 90XX Mode: dev Log: ServiceName: msm-api Mode: console Level: error Timeout: 10000 # 10s,api请求的响应超时时间,若超过10s还未返回则结束请求。该超时时间会被api层初始化的的context作为超时时间进行设置,若再新建一个context则不会被使用,而使用默认或自定义的超时时间 #rpc service MsmRpcConf: Endpoints: - 127.0.0.1:9XXX NonBlock: true Timeout: 10000 # 10s,设置rpc的超时时间,该超时时间会被拦截器TimeoutInterceptor作为api层传入context的父context的超时时间进行设置,若父context或子context(api层传入context)超时时间结束,请求会被直接终止。
配置结构体:
package config import ( "github.com/zeromicro/go-zero/zrpc" "github.com/zeromicro/go-zero/rest" ) type Config struct { rest.RestConf MsmRpcConf zrpc.RpcClientConf }
Rpc层
yml配置:
Name: aliyunmsm-rpc # 服务名 ListenOn: 0.0.0.0:9XXX # 服务监听地址 Mode: dev Timeout: 10000 # 10s,设置rpc服务的响应的超时时间,若超过10s还未返回则结束请求 Log: ServiceName: aliyunmsm-rpc Mode: console Level: error Redis: Host: 192.168.5.X:6379 Type: node DB: DataSource: root:XXX@tcp(127.0.0.1:3306)/XXX_micro?charset=utf8mb4&parseTime=true&loc=Asia%2FShanghai Cache: - Host: 192.168.5.X:6379
配置结构体:
package config import ( "github.com/zeromicro/go-zero/zrpc" "github.com/zeromicro/go-zero/core/stores/cache" ) type Config struct { zrpc.RpcServerConf DB struct { DataSource string } Cache cache.CacheConf }
到了这里,关于go-zero踩坑:在api层逻辑代码中设置context超时时间,传递到rpc层逻辑代码时设置的context超时时间消失 + api层和rpc层Timeout配置说明的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!