我們來看 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 遞迴注意事項 遞迴雖然經典,但是也有他的缺點 第一 遞迴是反...