RPC(Remote Procedure Call)服務,也即遠程過程調用,在互聯網企業技術架構中佔據了舉足輕重的地位,尤爲在當下微服務化逐步成爲大中型分佈式系統架構的主流背景下,RPC 更扮演了重要角色。python
Google 開源了 gRPC,Facebook 開源了 Thrift,Twitter 開源了 Finagle,百度開源了 bRPC,騰訊開源了 Tars,阿里開源了 Dubbo 和 HSF,新浪開源了 Motan 等,一線互聯網大廠們紛紛亮出本身研製的 RPC 框架武器,在解決分佈式高併發業務問題的同時,也向外界展現本身的技術實力。後端
互聯網公司百花齊放,貌似高深複雜的 RPC 框架解決了哪些業務難題?架構
gRPC 的安裝:併發
$ pip install grpcio
安裝 ProtoBuf 相關的 python 依賴庫框架
$ pip install protobuf
安裝 python grpc 的 protobuf 編譯工具:分佈式
pip install grpcio-tools
下面咱們使用 gRPC 定義一個接口,該接口實現對傳入的數據進行大寫的格式化處理微服務
建立項目 python demo 工程高併發
client目錄下的 main.py 實現了客戶端用於發送數據並打印接收到 server 端處理後的數據
定義 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 目錄中執行編譯,會生成:data_pb2.py 與 data_pb2_grpc.py
實現 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()
實現 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()
執行驗證結果:
先啓動 server,以後再執行 client
client 側控制檯若是打印的結果爲:「received: HELLO,WORLD!」 ,證實 gRPC 接口定義成功