gRPC 101:在Python中運行Go代碼

gRPC 101:在Python中運行Go代碼

顧名思義,我們將用Golang編寫函數定義,並從Python程序中調用該函數。 對於一個人為什麼要用一種語言編寫功能並從另一種語言執行該功能,我聽起來有些荒謬。 但是,請相信我,您做的次數比您想象的要多。 例如,當您以任何喜歡的編程語言或框架(例如Flask,Express,RoR等)編寫後端API並在客戶端中調用這些API時,這些API可以是Web App,Mobile App或 即使是多次使用不同於您的後端的語言編寫的CLI。 當您在客戶端中調用API端點時,您實際上要做的是在服務器中執行一個函數,該函數是從客戶端完成的。

現在,您已經瞭解了何時需要執行此函數的跨語言調用,下面將討論有關RPC及其相對於以上REST API方法的優勢的更多信息。

在RPC中,基本上發生的事情是客戶端應用程序可以調用位於不同計算機上的服務器應用程序上的方法,就好像它是創建分佈式應用程序和服務的本地對象一樣。 gRPC是Google開發的框架,使我們能夠製作RPC應用程序。

此時您可能會想到兩個問題:1。 當您可信賴的REST正常工作時,為什麼要使用RPC?2。 為什麼要用一種語言編寫程序並從另一種語言執行程序? (儘管我已經在上面進行了解釋,但更多的是討論)

回答第一個問題,假設您正在構建一個高度可擴展的應用程序,例如Flipkart,現在作為這個龐大而複雜的電子商務網站的一部分,您將需要創建至少十二種服務,這些服務將執行庫存管理,用戶的購物車管理,付款,物流,建議,賣方業務邏輯等。如您所見,這些服務之間將存在很多相互依賴關係,例如付款服務將需要了解用戶購物車中的信息,賣方將需要了解物流以及許多其他方面。其他這樣的關係。假設您為每個服務編寫一個REST API並相互交換端點。突然,您的Slack會收到大量消息,例如我應該在此API中傳遞哪些參數,以及關於如何更改Carts API中的一個參數使支付服務陷入困境的憤怒消息。隨著服務數量的增加,複雜性也隨之增加,這種方法的可伸縮性不是很高。為了解決這個問題,人們在後端使用RPC,這有助於簡化這數十種服務之間的對話。正如我們將看到的Proto文件一樣,它本身是關於進行RPC調用時發送的請求內容和響應內容的絕對事實。

回答第二個問題,某些編程語言在一項工作上要比其他語言更好地配備,例如在高頻交易中,速度至關重要,因此您將始終使用高性能語言(如C ++)編寫核心邏輯,現在此服務需要 與您的其他服務進行交互。 因此,從業務角度來看,在不同的服務中使用不同的語言是有意義的。

可能您想過,請告訴我們代碼。 讓我們開始編寫代碼。 我們將編寫一個基本程序,假定某人的Github用戶名將返回其關注者列表。 整個代碼可以在我的github個人資料上訪問。

下面給出了目錄結構。

gRPC 101:在Python中運行Go代碼

> Directory Structure

我們先來看github.proto

gRPC 101:在Python中運行Go代碼

原始文件是定義服務器和客戶端之間要交換的功能的方式。 如您所見,我們定義了一個名為GithubService的服務,並聲明我們將擁有一個名為GetFollowers的函數,該函數將FollowerRequest作為參數並返回FollowerResponse作為響應。 此處重複的關鍵字意味著我們打算將一個字符串數組作為類型。 在字符串github_username = 1中,數字1表示在序列化和反序列化過程中的標識符。 在REST中,通常將數據作為JSON傳遞,但在gRPC中,數據以稱為protobuf的二進制格式傳遞。

我們無法直接使用此原型文件來製作客戶端和服務器文件,我們首先需要將該原型文件轉換為實際代碼。 gRPC支持多種語言,您可以通過訪問其網站進行檢查。 您將需要Python和Go所需的編譯器,以分別將此原型文件編譯為Python和Go代碼。 安裝後,您可以運行以下命令來生成文件。

<code># GO
protoc -I githubpb/ — go_out=plugins=grpc:githubpb/ githubpb/github.proto
# Python
python -m grpc_tools.protoc -I. — python_out=githubpb — grpc_python_out=githubpb githubpb/github.proto/<code>

將自動生成的文件將為github.pb.go,github_pb2.py,github_pb2_grpc.py

現在,讓我們在Golang中實現實際代碼。

我將不介紹GetFollowers函數的實現,這只是對github API的正常調用以獲取數據。

gRPC 101:在Python中運行Go代碼

> server.go

在這裡,在主要功能中,我們只是使用由protoc編譯器生成的代碼註冊服務器。 我們在localhost:50051提供服務器。 您只需要編寫標準樣板代碼即可使服務器運行。

現在,讓我們用Python編寫客戶端代碼。

gRPC 101:在Python中運行Go代碼

sys.path.insert(1,'/ home / jigar / grpc')語句只是為了我們可以為當前目錄之外的目錄導入文件。

我們正在導入由python grpc編譯器生成的文件。 我們在localhost:50051上連接到服務器,並在服務器上調用GetFollowers函數。 同樣,您會在這裡找到一些樣板代碼來建立客戶端和服務器之間的實際連接。

現在來看結果,讓我們同時運行客戶端和服務器。

gRPC 101:在Python中運行Go代碼

gRPC 101:在Python中運行Go代碼

因此,我們已成功調用了由python程序在Go中實現的函數。 您也可以在python中實現相反的實現,然後在Go中調用。 例如,我也在Go中建立了一個客戶端。 您可以在上面鏈接的存儲庫中查看。

希望您今天能學到一些新穎有趣的東西,隨時發表評論並提出疑問。

(本文翻譯自Jigar Chavada的文章《gRPC 101 : Run your Go Code in Python》,參考:https://medium.com/@chavada.jigar.3/grpc-101-run-your-go-code-in-python-1aab3df732)


分享到:


相關文章: