gRPC 一開始由 google 開發(fā),是一款語言中立、平臺中立、開源的遠程過程調(diào)用(RPC)系統(tǒng)。
創(chuàng)新互聯(lián)公司專注于企業(yè)全網(wǎng)營銷推廣、網(wǎng)站重做改版、離石網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、H5頁面制作、電子商務商城網(wǎng)站建設、集團公司官網(wǎng)建設、外貿(mào)網(wǎng)站建設、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為離石等各大城市提供網(wǎng)站開發(fā)制作服務。
在 gRPC 里客戶端應用可以像調(diào)用本地對象一樣直接調(diào)用另一臺不同的機器上服務端應用的方法,使得您能夠更容易地創(chuàng)建分布式應用和服務。與許多 RPC 系統(tǒng)類似,gRPC 也是基于以下理念:定義一個服務,指定其能夠被遠程調(diào)用的方法(包含參數(shù)和返回類型)。在服務端實現(xiàn)這個接口,并運行一個 gRPC 服務器來處理客戶端調(diào)用。在客戶端擁有一個存根能夠像服務端一樣的方法。因為 gRPC 對 HTTP/2 協(xié)議的支持使其在 Android、IOS 等客戶端后端服務的開發(fā)領(lǐng)域具有良好的前景。gRPC 提供了一種簡單的方法來定義服務,同時客戶端可以充分利用 HTTP2 stream 的特性,從而有助于節(jié)省帶寬、降低 TCP 的連接次數(shù)、節(jié)省CPU的使用等。

基于HTTP/2
IDL使用ProtoBuf
多語言支持( C, C++, Python, PHP, Nodejs, C#, Objective-C、Golang、Java)
gRPC已經(jīng)應用在Google的云服務和對外提供的API中,其主要應用場景如下:
protobuf二進制消息,性能好/效率高(空間和時間效率都很不錯)
proto文件生成目標代碼,簡單易用
序列化反序列化直接對應程序中的數(shù)據(jù)類,不需要解析后在進行映射(XML,JSON都是這種方式)
支持向前兼容(新加字段采用默認值)和向后兼容(忽略新加字段),簡化升級
支持多種語言(可以把proto文件看做IDL文件)
Netty等一些框架集成
GRPC尚未提供連接池,需要自行實現(xiàn)
尚未提供“服務發(fā)現(xiàn)”、“負載均衡”機制
因為基于HTTP2,絕大部多數(shù)HTTP Server、Nginx都尚不支持,即Nginx不能將GRPC請求作為HTTP請求來負載均衡,而是作為普通的TCP請求。(nginx1.9版本已支持)
http2只允許單個鏈接傳輸10億流數(shù)據(jù)。原因在于:? htt2使用31位×××標示流,服務端使用奇數(shù),客戶端使用偶數(shù),所以總共10億可用
解決思路:超過一定數(shù)量的流,需要重啟鏈接。
gRPC有四種通信方式:
簡單rpc? 這就是一般的rpc調(diào)用,一個請求對象對應一個返回對象?
proto語法:
rpc simpleHello(Person) returns (Result) {}
服務端流式rpc? 一個請求對象,服務端可以傳回多個結(jié)果對象?
proto語法 :
rpc serverStreamHello(Person) returns (stream Result) {}
客戶端流式rpc? 客戶端傳入多個請求對象,服務端返回一個響應結(jié)果?
proto語法 :
rpc clientStreamHello(stream Person) returns (Result) {}
雙向流式rpc? 結(jié)合客戶端流式rpc和服務端流式rpc,可以傳入多個對象,返回多個響應對象?
proto語法 :
rpc biStreamHello(stream Person) returns (stream Result) {}
gRPC使用ProtoBuf定義服務, 我們可以一次性的在一個 .proto 文件中定義服務并使用任何支持它的語言去實現(xiàn)客戶端和服務器,反過來,它們可以在各種環(huán)境中,從云服務器到你自己的平板電腦—— gRPC 幫你解決了不同語言及環(huán)境間通信的復雜性。使用 protocol buffers 還能獲得其他好處,包括高效的序列號,簡單的 IDL 以及容易進行接口更新。
gRPC 的安裝: pip install grpcio
安裝 ProtoBuf 相關(guān)的 python 依賴庫: pip install protobuf
安裝 python grpc 的 protobuf 編譯工具: pip install grpcio-tools
syntax = "proto3";
package example;
service FormatData {   //定義服務,用在rpc傳輸中
  rpc DoFormat(actionrequest) returns (actionresponse){}
}
message actionrequest {
  string text = 1;
}
message actionresponse{
  string text=1;
}
在proto文件目錄下 調(diào)用下列命令
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. ./data.proto會生成:data_pb2.py 與 data_pb2_grpc.py, 其中data_pb2.py是數(shù)據(jù)格式調(diào)用的文件,data_pb2_grpc.py是grpc傳輸協(xié)議接口調(diào)用的文件.
在服務器端代碼中需要實現(xiàn)proto文件中編寫的服務接口,并重寫處理函數(shù),將重寫后的服務類實例化以后添加到grpc服務器中,這樣創(chuàng)建的grpc服務器就可以實現(xiàn)自定義的proto傳輸服務了
# 實現(xiàn)了 server 端用于接收客戶端發(fā)送的數(shù)據(jù),并對數(shù)據(jù)進行大寫處理后返回給客戶端
# ! /usr/bin/env python
# -*- coding: utf-8 -*-
import grpc
import time
from concurrent import futures
from example import data_pb2, data_pb2_grpc
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
_HOST = 'localhost'
_PORT = '8080'
import json
# 實現(xiàn)一個派生類,重寫rpc中的接口函數(shù).自動生成的grpc文件中比proto中的服務名稱多了一個Servicer
class FormatData(data_pb2_grpc.FormatDataServicer):
    # 重寫接口函數(shù).輸入和輸出都是proto中定義的Data類型
    def DoFormat(self, request, context):
        str = request.text
        print(str, type(str))
        return data_pb2.actionresponse(text=json.dumps(str.upper()))  # 返回一個類實例
def serve():
    # 定義服務器并設置最大連接數(shù),corcurrent.futures是一個并發(fā)庫,類似于線程池的概念
    grpcServer = grpc.server(futures.ThreadPoolExecutor(max_workers=4))  # 創(chuàng)建一個服務器
    data_pb2_grpc.add_FormatDataServicer_to_server(FormatData(), grpcServer)  # 在服務器中添加派生的接口服務(自己實現(xiàn)了處理函數(shù))
    grpcServer.add_insecure_port(_HOST + ':' + _PORT)  # 添加監(jiān)聽端口
    grpcServer.start()  # 啟動服務器
    try:
        while True:
            time.sleep(_ONE_DAY_IN_SECONDS)
    except KeyboardInterrupt:
        grpcServer.stop(0)  # 關(guān)閉服務器
if __name__ == '__main__':
    serve()
# 實現(xiàn)了客戶端用于發(fā)送數(shù)據(jù)并打印接收到 server 端處理后的數(shù)據(jù)
# ! /usr/bin/env python
# -*- coding: utf-8 -*-
import grpc
from example import data_pb2, data_pb2_grpc
_HOST = 'localhost'
_PORT = '8080'
import json
def run():
    conn = grpc.insecure_channel(_HOST + ':' + _PORT)  # 監(jiān)聽頻道
    print(conn)
    client = data_pb2_grpc.FormatDataStub(channel=conn)  # 客戶端使用Stub類發(fā)送請求,參數(shù)為頻道,為了綁定鏈接
    print(client)
    data = {'name': 'xjt', 'age': 18}
    response = client.DoFormat(data_pb2.actionrequest(text=json.dumps(data)))  # 返回的結(jié)果就是proto中定義的類
    print("received: " + response.text)
if __name__ == '__main__':
    run()
客戶端鏈接的主機號和端口號,必須是服務器創(chuàng)建的主機號和端口號.
先運行服務端,在運行客戶端,結(jié)果如下:
client.py

server.py

最終目錄結(jié)構(gòu)

                文章標題:Grpc跨語言遠程調(diào)用pythondemo
                
                網(wǎng)頁網(wǎng)址:http://www.yijiale78.com/article36/gceosg.html
            
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設、自適應網(wǎng)站、網(wǎng)站設計、微信公眾號、動態(tài)網(wǎng)站、網(wǎng)頁設計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)