請先閱讀 grpc的dial正常執行流程
預設配置情況下(還有其它沒有提到的配置都取預設值):
- 設定了balancer(etcd等)
- 沒有設定WithBlock,即dialOptions.block = false
- 沒有設定FailOnNonTempDialError,即dialOptions.copts.FailOnNonTempDialError = false
分為以下幾種異常情況說明
-
dial的時候,叢集服務位址為空
這個時候會走到A1,傳回錯誤 errNoAddr = errors.New("grpc: there is no address available to dial")
-
dial的時候叢集的一個服務挂了,但是沒有從balancer(etcd等)去掉
這個時候執行流程 A-A2–A22, 會在A22一直循環重試連接配接這個位址,并且每次重試間隔增長至最大值(120s)
-
已經連接配接正常了,在運作時候叢集的一個服務挂了,但是沒有從balancer(etcd等)去掉
這個時候執行流程 A2242-A233–A22, 會在A22一直循環重試連接配接這個位址,并且每次重試間隔增長至最大值(120s)
-
已經連接配接正常了,服務也是正常的,這個時候從balancer(etcd等)去掉一個位址
這個時候執行流程A3-A34-A231,結束
-
對于情況2,如果接下來從balancer(etcd等)去掉
這個時候執行流程A3-A34-A221,結束
-
對于情況3,如果接下來從balancer(etcd等)去掉
這個時候執行流程A3-A34-A233,結束