RPC 框架 應用

 

RPC

RPC(Remote Procedure Call)服務,也即遠程過程調用,在互聯網企業技術架構中佔據了舉足輕重的地位,尤爲在當下微服務化逐步成爲大中型分佈式系統架構的主流背景下,RPC 更扮演了重要角色。python

 

Google 開源了 gRPC,Facebook 開源了 Thrift,Twitter 開源了 Finagle,百度開源了 bRPC,騰訊開源了 Tars,阿里開源了 Dubbo 和 HSF,新浪開源了 Motan 等,一線互聯網大廠們紛紛亮出本身研製的 RPC 框架武器,在解決分佈式高併發業務問題的同時,也向外界展現本身的技術實力。後端

互聯網公司百花齊放,貌似高深複雜的 RPC 框架解決了哪些業務難題?架構

gRPC 簡介:

gRPC 是一款高性能、開源的 RPC 框架,產自 Google,基於 ProtoBuf 序列化協議進行開發,支持多種語言(Golang、Python、Java等),本篇只介紹 Python 的 gRPC 使用。由於 gRPC 對 HTTP/2 協議的支持使其在 Android、IOS 等客戶端後端服務的開發領域具備良好的前景。gRPC 提供了一種簡單的方法來定義服務,同時客戶端能夠充分利用 HTTP/2 stream 的特性,從而有助於節省帶寬、下降 TCP 的鏈接次數、節省CPU的使用等。

安裝:

gRPC 的安裝:併發

$ pip install grpcio

安裝 ProtoBuf 相關的 python 依賴庫框架

$ pip install protobuf

安裝 python grpc 的 protobuf 編譯工具:分佈式

pip install grpcio-tools

實踐:

下面咱們使用 gRPC 定義一個接口,該接口實現對傳入的數據進行大寫的格式化處理微服務

建立項目 python demo 工程高併發

client目錄下的 main.py 實現了客戶端用於發送數據並打印接收到 server 端處理後的數據
  1. server 目錄下的 main.py 實現了 server 端用於接收客戶端發送的數據,並對數據進行大寫處理後返回給客戶端
  2. example 包用於編寫 proto 文件並生成 data 接口

定義 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 接口定義成功

相關文章
相關標籤/搜索