0202年,您真的需要Thrift這樣一個RPC微服務框架來拯救一下傳統HTTP接口(api)了

原文轉載自「劉悅的技術博客」https://v3u.cn/a_id_104

目前市面上類似Django的drf框架基於json的http接口解決方案大行其道,人們也熱衷於在接口不多、系統與系統交互較少的情況下使用它,http接口的優點就是簡單、直接、開發方便,門檻低,利用現成的http協議進行傳輸。

但是事情往往有兩面,如果是一個大型的網站,內部子系統較多、接口非常多的情況下,RPC框架的好處就顯示出來了,首先就是長鏈接,不必每次通信都要像http 一樣去3次握手4次揮手,減少了網絡開銷;其次就是RPC框架一般都有註冊中心,有豐富的監控管理;發佈、下線接口、動態擴展等,對調用方來說是無感知、統一化的操作。第三個來說就是安全性。最後就是最近流行的服務化架構、服務化治理,RPC框架是一個強力的支撐。

論複雜度,RPC框架肯定是高於簡單的HTTP接口的。但毋庸置疑,HTTP接口由於受限於HTTP協議,需要帶HTTP請求頭,導致傳輸起來效率或者說安全性不如RPC,目前市面上流行的rpc框架有dubbo/hessian Thrift,阿里開源的dubbo固然還不錯,但是本人更傾向於facebook開源的Thrift框架,這款框架在github上好評如潮,這一次我們使用的就是基於Thrift的thriftpy2框架。

Thrift是一種接口描述語言和二進制通訊協議,它被用來定義和創建跨語言的服務,這是維基百科的描述。簡單來說就是你可以按照Thrift定義語法編寫.thrift,然後用Thrift命令行生成各種語言的代碼,比如OC、Java、C++、JS,調用這些代碼就可以完成客戶端與服務器的通信了,不需要自己去寫網絡請求、數據解析等接口。

其實在本人的實際教學工作中主要考慮到這兩個優點:

RPC。通過簡單定義Thrift描述語言文件,使用Thrift -gen命令可以生成多種語言的代碼,這些代碼包含了網絡通信,數據編解碼的功能。這就免去了前後臺編寫這部分繁瑣的代碼,同時也統一了前後臺的實現邏輯。

Thrift的二進制數據的編碼比json更加緊湊、減少了無用的數據的傳輸。

安裝:

pip3 install thriftpy2

首先定義 thrift 通訊文件,無論是server端還是clinet端都是基於這個文件進行通信 pingpong.thrift

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

可以看到我們定義了兩個方法,一個有參一個無參,第一個方法用來檢測接口是否通信成功,也就是傳統的ping命令,第二個方法顧名思義,用戶登錄

然後建立一個thrift_server.py 建立服務端的代碼

import thriftpy2
pingpong_thrift = thriftpy2.load("pingpong.thrift", module_name="pingpong_thrift")

from thriftpy2.rpc import make_server

class Dispatcher(object):
    
    def ping(self):
        return "pong"

    def check_login(self,username,password):
        print(username,password)
        return '123'

server = make_server(pingpong_thrift.PingPong, Dispatcher(), '127.0.0.1', 6000)
server.serve()

服務端首先讀取通信文件,然後建立起一個服務,監聽6000端口,等待客戶端請求,實際上服務端的方法也是主要業務邏輯編寫的地方。

隨後建立一個thrift_client.py文件,編寫客戶端代碼

import thriftpy2
pingpong_thrift = thriftpy2.load("pingpong.thrift", module_name="pingpong_thrift")

from thriftpy2.rpc import make_client

client = make_client(pingpong_thrift.PingPong, '127.0.0.1', 6000)

print(client.ping())

print(client.check_login('admin','123456'))

我們看到客戶端同樣讀取通信文件,嚴格按照通信文件的方法調用方式進行傳參調用,獲取返回值

運行服務器端的服務

python3 thrift_server.py

然後再執行客戶端腳本python3 thrift_client.py

可以看到服務端和客戶端就可以通信了

可以說非常簡單,這裏着重提到的一點是Thrift的數據編解碼,我們知道傳統http接口通常以json爲數據介質,json中一個對象類似於這樣的:{“key”:“content”},但實際上這個對象只有“content”纔是我們真正想要的數據,而“key”這個字符串並不是我們實際需要的,只是爲了做一個標記,方便我們查找“content”。而Thrift則可以省去“key”這個多餘的字符串。

定義thrift的結構裏的屬性名稱實際上在thrift數據二進制編解碼是被忽略的(thrift的json編解碼未驗證),這個名稱的作用只是作爲生成的OC代碼類的屬性名稱。這也解釋了爲什麼Thrift的二進制編碼會比平時使用的json更省流量。同時也說明了只要我們在.thrift文件中定義struct的時候保證struct的屬性的順序不變,即使通信雙方使用了各自使用不同的屬性名稱也不會有問題。

隨着請求併發量的提高,簡單的HTTP肯定達不到預期的效果,Thrift或許纔是你尋找的答案。

原文轉載自「劉悅的技術博客」 https://v3u.cn/a_id_104

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章