gRPC 是一款高性能、開源的 RPC 框架,產自 Google,基於 ProtoBuf 序列化協議進行開發,支持多種語言(Golang、Python、Java等),本篇只介紹 Python 的 gRPC 使用。由於 gRPC 對 HTTP/2 協議的支持使其在 Android、IOS 等客戶端後端服務的開發領域具備良好的前景。gRPC 提供了一種簡單的方法來定義服務,同時客戶端能夠充分利用 HTTP/2 stream 的特性,從而有助於節省帶寬、下降 TCP 的鏈接次數、節省CPU的使用等java
gRPC 默認使用 protocol buffers,這是 Google 開源的一種輕便高效的結構化數據存儲格式,能夠用於結構化數據串行化,或者說序列化。它很適合作數據存儲或 RPC 數據交換格式。python
官方參考文檔git
$ pip install grpcio
$ pip install protobuf
$ pip install grpcio-tools
先來看一個很是簡單的例子。假設你想定義一個「搜索請求」的消息格式,每個請求含有一個查詢字符串、你感興趣的查詢結果所在的頁數,以及每一頁多少條查詢結果。能夠採用以下的方式來定義消息類型的.proto文件了:github
syntax = "proto3"; // 聲明使用 proto3 語法 message SearchRequest { string query = 1; // 每一個字段都要指定數據類型 int32 page_number = 2; // 這裏的數字2 是標識符,最小的標識號能夠從1開始,最大到2^29 - 1, or 536,870,911。不可使用其中的[19000-19999] int32 result_per_page = 3; // 這裏是註釋,使用 // }
[1,15]以內的標識號在編碼的時候會佔用一個字節。[16,2047]以內的標識號則佔用2個字節。因此應該爲那些頻繁出現的消息元素保留 [1,15]以內的標識號。切記:要爲未來有可能添加的、頻繁出現的標識號預留一些標識號。shell
所指定的消息字段修飾符必須是以下之一:後端
一個標量消息字段能夠含有一個以下的類型——該表格展現了定義於.proto文件中的類型,以及與之對應的、在自動生成的訪問類中定義的類型:服務器
當一個消息被解析的時候,若是被編碼的信息不包含一個特定的singular元素,被解析的對象鎖對應的域被設置位一個默認值,對於不一樣類型指定以下:架構
你能夠在其餘消息類型中定義、使用消息類型,在下面的例子中,Result消息就定義在SearchResponse消息內,如:框架
message SearchResponse { message Result { string url = 1; string title = 2; repeated string snippets = 3; } repeated Result results = 1; }
在 message SearchResponse 中,定義了嵌套消息 Result,並用來定義SearchResponse消息中的results域。ide
當用protocol buffer編譯器來運行.proto文件時,編譯器將生成所選擇語言的代碼,這些代碼能夠操做在.proto文件中定義的消息類型,包括獲取、設置字段值,將消息序列化到一個輸出流中,以及從一個輸入流中解析消息。
使用如下命令編譯:
$ python -m grpc_tools.protoc -I./ --python_out=. --grpc_python_out=. ./hello.proto
生成了兩個文件:
建立和運行 Greeter 服務能夠分爲兩個部分:
實現咱們服務定義的生成的服務接口:作咱們的服務的實際的「工做」的函數。
首先運行服務端代碼
python server/main.py
而後運行客戶端代碼
python client/main.py
輸出: >>> Greeter client received: Hello, goodspeed!