這是一個報錯,引起的
all SubConns are in TransientFailure, latest connection error: <nil> #2636git
上面的信息。github
我搜索了下。golang
https://github.com/grpc/grpc-go/issues/2636編程
這裏寫到了: GRPC_GO_REQUIRE_HANDSHAKE=off
google
因此下面的文章 也提到了。這個是對的。
spa
個別的可能性是註冊中心地址不對:GRPChttp請求遇到的異常(all SubConns are in TransientFailure, latest connection error: connection closed)。code
也有能夠以下是版本問題。server
引用自:Jiajun的編程隨想。開發
在 這個issue 裏所提到的feature實現以前,Go的gRPC實現裏, 客戶端和服務端握手過程當中,客戶端並不會等待HTTP/2協議握手完成以後纔開始交互,所以Go的gRPC v1.18以後開始 改變這種行爲,實現前面所說的這個feature。然而,這就引入了一個不兼容問題,也引入了一大堆bug。很不幸,我就 踩中了。rpc
這個feature能夠經過設置
GRPC_GO_REQUIRE_HANDSHAKE=on
這個環境變量來開啓,也能夠經過設置GRPC_GO_REQUIRE_HANDSHAKE=off
來關閉。
開發一個gRPC應用的時候,客戶端不斷的報錯:
error: rpc error: code = Unavailable desc = all SubConns are in TransientFailure, latest connection error: timed out waiting for server handshake
這個錯誤我之前遇到過,而後就想着設置 GRPC_GO_REQUIRE_HANDSHAKE=off
來解決,而後發現並無用,通過一番查閱以後,發現 原來是在所使用的版本里,即使設置這個環境變量,也沒有用:
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 google.golang.org/grpc v1.23.0
解決方案就是降級版本:
google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107 google.golang.org/grpc v1.19.0
順帶,還要設置環境變量 GRPC_GO_REQUIRE_HANDSHAKE=off
。