體驗 gRPC 那些事兒

2021-07-26 12:09:47 字數 3600 閱讀 1361

我們來看 google 對於 grpc 的定義:

a high performance, open-source universal rpc framework

即 grpc 是乙個開源的高效能通過 rpc 框架。具體來說,它具有以下特點:

對於 grpc 的應用場景,google 給出了一些常見的應用情景,個人則認為更適合於內部服務的使用。

關於 protobuf,多說一下。grpc 將服務介面的定義寫在.proto檔案中,.proto檔案遵循 protobuf 的規範。使用 grpc 提供的命令列工具,可以對.proto檔案進行編譯成相關語言的源**,例如 c++ 語言或者 python 語言的服務端和客戶端** 。

以 python 版本的 grpc 為例,說明 grpc 的安裝。

1) 將 pip 的版本公升級到最新版本

pip

install--

upgrade

pip

2)安裝 grpcio 包

pip install grpcio
3)安裝 grpc 的 python 工具包

pip install grpcio-tools
git clone 

cd grpc/examples/python/helloworld

環境已安裝完畢,接下來便可以執行**了。進入examples/python/helloworld目錄。

執行服務端程式,服務端監聽 50051埠。

python greeter_server.py
開啟另乙個終端,執行客戶端程式,

python greeter_client.py
可以看到客戶端程式的輸出

greeter client received: hello, you!

說明客戶端通過 grpc 成功從服務端獲取了資料。

正常使用 grpc 的流程是,我們需要首先編寫介面和訊息的宣告檔案.proto,然後進行編譯才可以得到相應介面和訊息的原始檔。上面我們省略了編譯的操作,是由於 grpc 的源**中已經將 examples 目錄下的例子都編譯好了。

開啟examples/protos/helloworld.proto,可以看到原來的介面和訊息宣告為:

// the greeting service definition.

service greeter

}// the request message containing the user's name.

message hellorequest

// the response message containing the greetings

message helloreply

.proto檔案包括兩部分的宣告,分別是介面的宣告和訊息的宣告。原來已經有乙個介面sayhello,假設現在我們需要增加乙個介面sayhelloagain,新介面的引數和返回值使用原有的型別,那麼新的.proto檔案如下:

// the greeting service definition.

service greeter

// sends another greeting

rpc sayhelloagain (hellorequest) returns (helloreply) {}

}

編寫或者更新.proto檔案後,需要對其進行編譯。上面我們安裝了grpcio-tools工具,可以對.proto檔案編譯。

cd

examples/python/helloworld

python-m

grpc_tools

.protoc-i

../.

./protos--

python_out=.-

-grpc_python_out=..

./..

/protos/helloworld

.proto

執行命令後會生成新的helloworld_pb2.py檔案和新的helloworld_pb2_grpc.py檔案。helloworld_pb2.py檔案包含生成的請求類和響應類,而helloworld_pb2_grpc.py檔案則包含生成的服務端骨架(skeleton)**和客戶端樁(stub)**。

為了使用新的介面sayhelloagain,需要在我們的程式**增加新的測試**。

服務端程式:

class

greeter

(helloworld_pb2_grpc.greeterservicer):

defsayhello

(self, request, context):

return helloworld_pb2.helloreply(message='hello, %s!' % request.name)

defsayhelloagain

(self, request, context):

return helloworld_pb2.helloreply(message='hello again, %s!' % request.name)

客戶端程式:

def

run():

channel = grpc.insecure_channel('localhost:50051')

stub = helloworld_pb2_grpc.greeterstub(channel)

response = stub.sayhello(helloworld_pb2.hellorequest(name='you'))

print("greeter client received: " + response.message)

response = stub.sayhelloagain(helloworld_pb2.hellorequest(name='you'))

print("greeter client received: " + response.message)

最後我們再次執行新的服務端和客戶端程式。可以看到,客戶端終端中,增加了一行輸出:

greeter client received: hello, you!

greeter client received: hello again, you!

說明我們成功新增了新的介面。

/docs/quickstart/python.html

鏈結那些事兒

鏈結,就是將不同部分的 和資料收集和組合成為乙個單一檔案的過程,這個檔案可被載入到儲存器中執行。鏈結可以執行於編譯時 compile time 也就是源 被翻譯成機器 時 eg.普通的鏈結器鏈結,以及靜態鏈結庫,由靜態鏈結器鏈結 也可以執行於載入時 例如動態鏈結庫的載入時鏈結 也可以執行於執行時 r...

指標那些事兒

1.野指標 也叫懸擺指標,迷失指標 野指標是導致bug的罪魁禍首之一。對指標呼叫delete後 釋放掉了它指向的記憶體,野指標還是指向原來的位址 如果沒有重新賦值就使用它,將導致難以預料的後果。因為此時操作野指標,它指向的記憶體位址可能已經分配給其他變數在使用了。所以指標在delete之後,如果不再...

遞迴那些事兒

include include include include 求階乘 int fac int n if n 1 求累加 int add int n 求字串長度 int my strlen const char dest int main 遞迴注意事項 遞迴雖然經典,但是也有他的缺點 第一 遞迴是反...