Python RPC 不會?不妨看看這篇文章

AirPython發表於2021-08-06

image

1. 前言

大家好,我是安果!

RPC,全程為 Remote Procedure Call,是一種程式間的通訊方式,它採用「 服務端 / 客戶機 」模式,是一種請求響應模型

其中,服務端負責提供服務程式、響應請求做具體的實現邏輯,客戶機負責請求呼叫

主流的 RPC 框架包含:

  • 阿里的 Dubbo

  • Facebook 的 Thrift

  • Google 的 gRpc

  • 新浪微博的 Motan

  • Golang 生態的 rpcx

其中,gRpc 和 Thrift 是跨語言的 RPC 服務框架,並且 Thrift 相比效能更高

本篇文章以 Thrift 為例,聊聊 Python 中使用 RPC 的流程

2. thriftpy2 介紹

Thrift 是一種介面描述語言和二進位制通訊協議,它可以被用來定義和建立跨語言的服務,使得不同語言的客戶端、伺服器之間能進行高效透明的通訊

thriftpy2 是在 Thrift 的基礎上進行二次封裝,使用它編寫 RPC 更加方便快捷

專案地址:https://github.com/Thriftpy/thriftpy2

首先,我們在虛擬環境下安裝依賴包

# 安裝依賴
pip3 install thriftpy2

然後,如果是 Windows,建議在 Pycharm 中安裝  thrift 外掛

PS:該外掛可以方便我們編寫 Thrift 通訊檔案

下載地址:https://plugins.jetbrains.com/plugin/7331-thrift-support

3. 實戰一下

首先,根據需求編寫 Thrift 通訊檔案

比如,該檔案定義 2 個方法

  • 無參函式 ping

  • 登入 login

    包含兩個引數:username、password

# foo.thrift

service PingPong{
    string ping(),
    string login(
        1: string username,
        2: string password
    )
}

然後,編寫服務端程式碼

根據 Thrift 通訊檔案中定義的方法,編寫具體的實現邏輯

建立一個服務物件,指定繫結的 ip 地址及埠號,開啟服務並監聽訊息

# rcp_server.py

import thriftpy2
from thriftpy2.rpc import make_server

# 讀取通訊配置檔案
pingpong_thrift = thriftpy2.load("foo.thrift", module_name="pingpong_thrift")

class Dispatcher(object):
    """根據通訊配置檔案定義的方法,重寫實現方法"""

    def ping(self):
        """
        Ping一下
        :return:
        """
        return "pong"

    def login(self, username, password):
        """
        登入
        :param username: 使用者名稱
        :param password: 密碼
        :return:
        """
        print('獲取客戶端傳過來的引數,使用者名稱:',username,",密碼:",password)
        return '登入成功!'


# 建立服務,指定本地ip地址及監聽埠號
server = make_server(pingpong_thrift.PingPong, Dispatcher(), '192.168.40.217', 9000)

# 開啟服務並監聽
server.serve()

接著,編寫客戶端程式碼

這裡,根據服務端提供的 ip 地址、埠號,建立客戶端連線物件,呼叫通訊檔案中定義好的方法

PS:如果客戶端在遠端執行,需要將 Thrift 通訊檔案放置到同級目錄下執行

# rcp_client.py

import thriftpy2
from thriftpy2.rpc import make_client

# 讀取通訊配置檔案
pingpong_thrift = thriftpy2.load("foo.thrift", module_name="pingpong_thrift")

# 建立客戶端
client = make_client(pingpong_thrift.PingPong, '192.168.40.217', 9000)

# 呼叫通訊檔案中定義好的方法(實際呼叫服務端的方法)
print(client.ping())
print(client.login('root', 'pwd'))

最後,分別執行服務端和客戶端的程式碼

使用 WireShark 進行抓包分析,能發現服務端和客戶端通訊的方式及資料傳輸過程

WireShark 的使用可以參考這篇文章:

爬蟲遇到 Socket,莫慌,肝就完了!

4. 最後

企業專案中,常用的 HTTP 的特點是簡單、開發方便,上手簡單、是主流的資料傳輸協議

相比 HTTP 或 H2,RPC 的主要優勢體現在安全高、效能消耗低、傳輸效率高、服務治理方便上,所以我們可以根據實際專案需求選擇合理的資料通訊方式

如果你覺得文章還不錯,請大家 點贊、分享、留言 下,因為這將是我持續輸出更多優質文章的最強動力!

相關文章