首頁>技術>

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

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

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

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

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

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

下面給出了目錄結構。

我們先來看github.proto

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

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

# GOprotoc -I githubpb/ — go_out=plugins=grpc:githubpb/ githubpb/github.proto# Pythonpython -m grpc_tools.protoc -I. — python_out=githubpb — grpc_python_out=githubpb githubpb/github.proto

將自動生成的檔案將為github.pb.go,github_pb2.py,github_pb2_grpc.py

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

我將不介紹GetFollowers函式的實現,這只是對github API的正常呼叫以獲取資料。

> server.go

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

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

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

我們正在匯入由python grpc編譯器生成的檔案。 我們在localhost:50051上連線到伺服器,並在伺服器上呼叫GetFollowers函式。 同樣,您會在這裡找到一些樣板程式碼來建立客戶端和伺服器之間的實際連線。

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

因此,我們已成功呼叫了由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)

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Qt開源作品4-網路除錯助手