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

这篇具有很好参考价值的文章主要介绍了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中的的拦截器导致的:

这个方法的参数是拦截器获取的,具体可以看一下这个博客: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的超时时间才行。文章来源地址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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于go-zero的api服务刨析并对比与gin的区别

    官网go-zero go-zero是一个集成了各种工程实践的微服务框架,集多种功能于一体,如服务主要的API服务,RPC服务等。除了构建微服务工程外,zero也是一款性能优良的web框架,也可以构建单体web应用。 更多移步www.w3cschool.cn/go-zero。 go的web框架是很多的,例如github较为流行的有:

    2024年02月13日
    浏览(56)
  • 【go-zero】(1):尝试使用go-zero的工具goctl进行model,controller代码生成,配置数据库,实现FindAll方法,查询数据库全部数据

    本文的原文连接是: https://blog.csdn.net/freewebsys/article/details/128707849 未经博主允许不得转载。 博主CSDN地址是:https://blog.csdn.net/freewebsys 博主掘金地址是:https://juejin.cn/user/585379920479288 博主知乎地址是:https://www.zhihu.com/people/freewebsystem 项目地址: https://go-zero.dev/cn/ go-zero 是一个集

    2023年04月24日
    浏览(42)
  • 【go-zero】go-zero分布式锁实战 | apifox测试go-zero分布式锁方式

    包地址:github.com/zeromicro/go-zero/core/stores/redis 使用场景: 为了防止并发的下载相同的excel 我们通过redis锁来控制请求相同的excel下载 个人思路: req为API传入的请求参数 然后加密成md5的字符串,这样可以处理 相同的请求

    2024年02月15日
    浏览(41)
  • go-zero系列:接入Prometheus

    参考文档:https://zhuanlan.zhihu.com/p/463418864 https://prometheus.io/download/ 进入下载文件夹,比如prometheus-2.44.0.windows-amd64。 然后双击Prometheus.exe启动软件。 启动后,可以访问 http://127.0.0.1:9090/。就能查看Prometheus后台。 然后重启go-zero项目,能看到输出日志:Starting prometheus agent at 0.0.

    2024年02月16日
    浏览(39)
  • go-zero学习 第一章 基础

    因官网重新改版,本文是基于官网最新版本的文档并整合旧文档重新进行全面总结、归纳。 本文主要对官网 快速开始 进行提炼总结,未涉及部分将在后续章节陆续补充完善。 go-zero 的 goctl 工具下载 验证 goctl 的安装结果: goctl 一键安装 protoc 、 protoc-gen-go 、 protoc-gen-go-grp

    2024年02月09日
    浏览(47)
  • 使用go-zero快速构建微服务

    本文是对 使用go-zero快速构建微服务 [1] 的亲手实践 编写API Gateway代码 mkdir api goctl api -o api/bookstore.api cd api goctl api go -api bookstore.api -dir . go run bookstore.go -f etc/bookstore-api.yaml 启动API Gateway服务,默认侦听在8888端口 因为默认生成的 api/etc/bookstore-api.yml 为: 按提示下载,再次运行

    2024年02月13日
    浏览(64)
  • go-zero 开发之安装 etcd

    本文只涉及 Linux 上的安装。 二进制安装 下载二进制安装包 下载地址示例: 解压二进制安装包 删除二进制安装包 版本检查 启动 etcd 往 etcd 写读数据 Docker 安装 etcd 主要使用 Google 容器注册表(gcr.io)下的 gcr.io/etcd-development/etcd 仓库来存储其容器镜像。作为次要选项,它还使

    2024年02月04日
    浏览(41)
  • go-zero的服务发现源码阅读

    服务发现原理与grpc源码解析_wangxiaoangg的博客-CSDN博客   go-zero rpc demo官方文档:rpc编写与调用 | go-zero 目录 一 服务注册 1. 创建rpc服务 2. 启动rpc服务 3. registerEtcd做了什么 4. discov.NewPublisher 服务发布者 二 服务发现 1.定义注册resolver 2.解析etcd地址创建链接 3.update方法 在看rp

    2024年02月06日
    浏览(59)
  • go-zero微服务实战——服务构建

    接上一节go-zero微服务实战——基本环境搭建。搭建好了微服务的基本环境,开始构建整个微服务体系了,将其他服务也搭建起来。 order的目录结构,如下 根目录 api服务 rpc服务 自定义逻辑层logic 自定义参数层models 自定义工具层util api服务和rpc服务都是基于goctl一键生成的,当

    2024年02月14日
    浏览(45)
  • go-zero 是如何做路由管理的?

    原文链接: go-zero 是如何做路由管理的? go-zero 是一个微服务框架,包含了 web 和 rpc 两大部分。 而对于 web 框架来说,路由管理是必不可少的一部分,那么本文就来探讨一下 go-zero 的路由管理是怎么做的,具体采用了哪种技术方案。 路由管理方案有很多种,具体应该如何选

    2024年02月13日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包