在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
追蹤代碼后發(fā)現(xiàn)是這個go-zero
中的的攔截器導致的:這個方法的參數(shù)是攔截器獲取的,具體可以看一下這個博客:https://www.lixueduan.com/posts/grpc/05-interceptor/
一旦執(zhí)行這個攔截器,它會將
api
層設置的Rpc: Timeout
作為api
層傳入context
的父context
的超時時間進行設置,若父context
或子context
(api
層傳入context
)超時時間結束,請求會被直接終止。若沒有設置Rpc: Timeout
,則默認2s
。解決方案:
我通過在
api
和rpc
層的yml
文件中設置Timeout
解決了這個問題。文章來源:http://www.zghlxwxcb.cn/news/detail-507498.html我們在
api
層邏輯代碼中設置context
超時時間,傳遞到rpc
層邏輯代碼時,設置的context
超時時間其實并沒有消失,只是我們在api
層傳入的context
變成了子context
,它的父context
超時時間結束時,整個請求都會被結束,所以我們必須要設置父context
的超時時間才行。文章來源地址http://www.zghlxwxcb.cn/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 # 服務監(jiān)聽地址 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模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!