RPCRPC(Remote Procedure Call)服務(wù),也即遠程過程調(diào)用,,在互聯(lián)網(wǎng)企業(yè)技術(shù)架構(gòu)中占據(jù)了舉足輕重的地位,,尤其在當(dāng)下微服務(wù)化逐步成為大中型分布式系統(tǒng)架構(gòu)的主流背景下,RPC 更扮演了重要角色,。
Google 開源了 gRPC,F(xiàn)acebook 開源了 Thrift,,Twitter 開源了 Finagle,,百度開源了 bRPC,,騰訊開源了 Tars,阿里開源了 Dubbo 和 HSF,,新浪開源了 Motan 等,,一線互聯(lián)網(wǎng)大廠們紛紛亮出自己研制的 RPC 框架武器,在解決分布式高并發(fā)業(yè)務(wù)問題的同時,,也向外界展示自己的技術(shù)實力,。 互聯(lián)網(wǎng)公司百花齊放,貌似高深復(fù)雜的 RPC 框架解決了哪些業(yè)務(wù)難題,? gRPC 簡介:gRPC 是一款高性能,、開源的 RPC 框架,產(chǎn)自 Google,,基于 ProtoBuf 序列化協(xié)議進行開發(fā),,支持多種語言(Golang、Python,、Java等),,本篇只介紹 Python 的 gRPC 使用。因為 gRPC 對 HTTP/2 協(xié)議的支持使其在 Android,、IOS 等客戶端后端服務(wù)的開發(fā)領(lǐng)域具有良好的前景,。gRPC 提供了一種簡單的方法來定義服務(wù),同時客戶端可以充分利用 HTTP/2 stream 的特性,,從而有助于節(jié)省帶寬,、降低 TCP 的連接次數(shù)、節(jié)省CPU的使用等,。
安裝:gRPC 的安裝: $ pip install grpcio 安裝 ProtoBuf 相關(guān)的 python 依賴庫 $ pip install protobuf 安裝 python grpc 的 protobuf 編譯工具: pip install grpcio-tools 實踐:下面我們使用 gRPC 定義一個接口,,該接口實現(xiàn)對傳入的數(shù)據(jù)進行大寫的格式化處理 創(chuàng)建項目 python demo 工程 client目錄下的 main.py 實現(xiàn)了客戶端用于發(fā)送數(shù)據(jù)并打印接收到 server 端處理后的數(shù)據(jù)
定義 gRPC 接口:
syntax = "proto3"; package example; service FormatData { rpc DoFormat(Data) returns (Data){} } message Data { string text = 1; } 編譯 protobuf python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. ./data.proto #在 example 目錄中執(zhí)行編譯,,會生成:data_pb2.py 與 data_pb2_grpc.py 實現(xiàn) server 端: #! /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' class FormatData(data_pb2_grpc.FormatDataServicer): def DoFormat(self, request, context): str = request.text return data_pb2.Data(text=str.upper()) def serve(): grpcServer = grpc.server(futures.ThreadPoolExecutor(max_workers=4)) data_pb2_grpc.add_FormatDataServicer_to_server(FormatData(), grpcServer) grpcServer.add_insecure_port(_HOST + ':' + _PORT) grpcServer.start() try: while True: time.sleep(_ONE_DAY_IN_SECONDS) except KeyboardInterrupt: grpcServer.stop(0) if __name__ == '__main__': serve() 實現(xiàn) client 端: #! /usr/bin/env python # -*- coding: utf-8 -*- import grpc from example import data_pb2, data_pb2_grpc _HOST = 'localhost' _PORT = '8080' def run(): conn = grpc.insecure_channel(_HOST + ':' + _PORT) client = data_pb2_grpc.FormatDataStub(channel=conn) response = client.DoFormat(data_pb2.Data(text='hello,world!')) print("received: " + response.text) if __name__ == '__main__': run() 執(zhí)行驗證結(jié)果: 先啟動 server,,之后再執(zhí)行 client client 側(cè)控制臺如果打印的結(jié)果為:“received: HELLO,WORLD!” ,證明 gRPC 接口定義成功 |
|