go-zero踩坑:在api层逻辑代码中设置context超时时间,传递到rpc层逻辑代码时设置的context超时时间消失 + api层和rpc层Timeout配置说明

在api层逻辑代码中设置context超时时间,传递到rpc层逻辑代码时设置的context超时时间消失

我在用go-zero时,在api层传递contextrpc层,但报错: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中的的拦截器导致的:

image-20230130162037103 image-20230130162053484 image-20230130162136641

这个方法的参数是拦截器获取的,具体可以看一下这个博客:https://www.lixueduan.com/posts/grpc/05-interceptor/

一旦执行这个拦截器,它会将api层设置的Rpc: Timeout作为api层传入context的父context的超时时间进行设置,若父context或子contextapi层传入context)超时时间结束,请求会被直接终止。若没有设置Rpc: Timeout,则默认2s

解决方案:

我通过在apirpc层的yml文件中设置Timeout解决了这个问题。

我们在api层逻辑代码中设置context超时时间,传递到rpc层逻辑代码时,设置的context超时时间其实并没有消失,只是我们在api层传入的context变成了子context,它的父context超时时间结束时,整个请求都会被结束,所以我们必须要设置父context的超时时间才行。

image-20230130183914359

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
}
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

itmengge

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值