程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

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

編輯:Python

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/t...

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

# 安裝依賴
pip3 install thriftpy2

然後,如果是 Windows,建議在 Pycharm 中安裝 thrift 插件

PS:該插件可以方便我們編寫 Thrift 通訊文件

下載地址:https://plugins.jetbrains.com...

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 進行抓包分析,能發現服務端和客戶端通訊的方式及數據傳輸過程

4. 最後
企業項目中,常用的 HTTP 的特點是簡單、開發方便,上手簡單、是主流的數據傳輸協議

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


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved