??在閱讀gRPC-go源碼前,我們先從整體上簡單了解一下gRPC-go框架中grpc客戶端跟grpc服務器端整個的交互過程丰刊,都經(jīng)歷了哪些過程隘谣;
??在后面的章節(jié)中,我們會對每個過程進行詳細的分析;
??在grpc-go框架中grpc客戶端跟grpc服務器端整個交互主要經(jīng)歷以下階段:
??grpc客戶端跟grpc服務器端整體交互過程寻歧,如下圖所示:
grpc客戶端跟grpc服務器端整個交互過程大概經(jīng)歷了哪些階段
1)rpc鏈接建立階段
?a)建立tcp鏈接階段
??i.用戶設置鏈接參數(shù)掌栅,如攔截器設置,鏈接地址設置等
??ii.解析器根據(jù)鏈接地址來獲取后端對應的grpc服務器地址列表
??iii.平衡器根據(jù)grpc服務器地址列表來建立tcp鏈接
?b)幀交互階段
??i.grpc服務器端需要自己能夠發(fā)送的幀大小码泛、窗口大小等信息發(fā)送給客戶端猾封,
??ii.客戶端接收到這些信息后,會更新本地的幀大小噪珊,窗口大小等信息
??iii.PRI校驗
- rpc請求階段
?a)客戶端將請求服務的名稱晌缘,方法名稱、超時時間等信息封裝到頭幀里痢站,發(fā)送給服務器端磷箕;
?b)這樣服務器端接收到頭幀后,就可以解析出客戶端請求的方法名稱了瑟押,如Greeter服務下的SayHello方法名稱了
?c)客戶端需要將SayHello方法的具體參數(shù)值搀捷,進行序列化,壓縮后多望,封裝成數(shù)據(jù)幀發(fā)送服務器端
?d)服務器端接收到數(shù)據(jù)幀后,進行解壓怀偷,反序列化操作后,就得到了請求方法的具體參數(shù)值了播玖,如&pb.HelloRequest{Name: name}
?e)服務器端此時已經(jīng)知道了客戶端請求的方法名稱,以及該方法名稱的具體參數(shù)值了蜀踏,
?f)服務器端開始具體執(zhí)行方法,如真正執(zhí)行SayHello方法了果覆;執(zhí)行完成后,
?g)服務器端創(chuàng)建頭幀局待,將執(zhí)行的狀態(tài)信息發(fā)送給客戶端斑响,如grpc-status, 狀態(tài)碼200
?h)客戶端開始接收服務器端的發(fā)送的頭幀
?i)服務器端將執(zhí)行結(jié)果钳榨,進行序列化、壓縮后薛耻,封裝成數(shù)據(jù)幀,發(fā)送給客戶端
?j)客戶端接收到服務器端反饋的數(shù)據(jù)幀后饼齿,進行解壓饲漾,反序列化后瘟滨,,就可以得到SayHello方法的具體執(zhí)行結(jié)果了能颁。
簡單總結(jié)一下杂瘸,
rpc鏈接,其實就是干了四件事:
- 第一伙菊,確定grpc服務器端的地址列表败玉,有哪些;
- 第二镜硕,如何向grpc服務器端發(fā)起鏈接运翼,是鏈接一個grpc服務器端,還是全部連接兴枯,還是選擇負載低的grpc服務器進行鏈接血淌,
- 第三,調(diào)用golang原生的net包财剖,進行tcp鏈接悠夯;
- 第四,進行http2幀的交互過程躺坟,如接下來傳輸?shù)膸拇笮∈嵌嗌俾俨梗翱诖笮∈嵌嗌俚?/li>
rpc請求,干了哪些事咪橙?
- 第一夕膀,通過頭幀,將客戶端請求方法的服務名稱美侦,方法名稱等信息傳輸給服務器端产舞;如服務名稱為helloworld.Greeter,方法名稱為SayHello
- 第二菠剩,通過數(shù)據(jù)幀易猫,客戶端將請求方法的參數(shù)值發(fā)送給服務器端,
- 第三赠叼,到目前為止擦囊,服務器端就知道客戶端要執(zhí)行的哪個服務下的哪個方法了,并且也知道該方法的具體參數(shù)值了嘴办;就可以具體執(zhí)行了
- 第四瞬场,服務器端,將具體的執(zhí)行結(jié)果涧郊,封裝成數(shù)據(jù)幀贯被,再反饋客戶端,這樣客戶端就獲得了最終的執(zhí)行結(jié)果,也就是實現(xiàn)了在本地調(diào)用了遠程服務中的某個方法彤灶,或者說不同內(nèi)存空間的方法調(diào)用
在這里我們只需要簡單了解一下grpc客戶端跟grpc服務器端交互的整體流程即可看幼。詳細流程,會在后面的章節(jié)中幌陕,慢慢介紹的诵姜。