在聊如何使用Thrift讓Python和C#能夠互相調用以前,咱們先來看看下面的話題。html
微服務:使用一套小服務來開發單個應用的方式,每一個服務運行在 獨立的進程中,通常採用輕量級的通信機制互聯,而且他們能夠經過自動化的方式部署。python
微服務的特徵:數據庫
1)單一職責 2)輕量級通信 3)隔離性 4)有本身的數據 5)技術多樣性apache
微服務誕生的背景:json
1)互聯網行業的快速發展 2)敏捷開發,精益方法深刻人心 3)容器技術的成熟api
優點:多線程
1)獨立性,各自開發本身的模塊互不影響 2)敏捷性,能很快響應需求的變化 3)高效團隊 4)技術棧靈活,可使用多種語言進行混合開發。架構
不足:框架
1)額外的工做異步
拆分的過小,服務越多,服務之間的調用 就會過多,形成沒必要要的性能損耗。
拆分的太大,就會失去微服務的優點。
2)數據的一致性
單體架構能夠經過事務很輕鬆的實現數據的一致性,可是微服務,他們都有本身的數據庫,即便咱們在拆分微服務是保證數據庫的聯表操做,儘可能讓它在同一個微服務內,可是也很保證沒有這種意外的狀況,一旦出現就會對咱們的數據一致性形成影響。
3)溝通成本增長
採用微服務架構會帶來不少問題,在這裏只討論微服務之間是如何通信的。
1)從通信模式的角度考慮:
一對一仍是一對多 ;同步仍是異步
一對一的異步,這種模式下有兩種場景:一個是咱們給某個服務發送通知的時候,是一個一對一的異步,發送通知不須要等待響應;另外一種是咱們雖然給對方發送了一個請求,可是並不要求對方當即響應,而是最爲一個回調的方式做爲響應。
發佈訂閱:就是一個服務發佈一個消息,有不少的訂閱者會同時接到這個消息,接到這個消息,並不必定要當即響應。
發佈異步響應:好比滴滴打車,我在叫一輛車的時候,系統會把消息發送給能接收到該消息的車主,而後來響應。
2)從通信協議角度考慮:
基於http協議涉及rest API ; RPC; MQ
這裏,只來聊聊RPC,市面上有不少RPC框架,好比:dubbo(阿里)、motan(新浪)、grpc(谷歌)、thrift(Facebook),這麼多RPC框架,如何選擇呢?能夠參考下面的幾個方面,來選擇RPC框架--【I/O、線程調度模型、多語言支持、序列化方式、服務治理】,在這裏我只演示Thrift的使用,由於我只瞭解Thrift,哈哈哈哈哈。
Thrift是2007年Facebook開發的2008年進入Apache開源項目,是一個跨語言的開發框架,它須要定義一個xxx.thrift的文件, 來生成各類語言的代碼,生產以後咱們的服務提供者和消費者,都須要把代碼引進出,服務端把代碼實現,消費者直接使用API的存根,直接調用。支持的語言也比較多,thrift是cs模式,經過客戶端來生成不一樣語言的代碼,從而實現了服務端和客戶端不一樣語言的通信,在傳輸的序列化上它也支持不少種,好比:二進制、壓縮、json,xml等
在通信的模式上,支持不少種,支持阻塞的IO,還有專門傳輸文件的傳輸方式,在線程模型上,它也支持 不少種,好比單線程、線程池、多線程非阻塞IO模式。
附一張對比圖:
下面咱們來看看,在Python和C#之間該如何使用。
版本說明:
1)Python 3.6.3 Thrift-0.10.0
2)net core 2.1 Install-Package apache-thrift-netcore -Version=0.9.3.2
3)win7
首先到Thrift官網上下載:http://archive.apache.org/dist/thrift/0.9.3/
下載完畢以後,新建一個message.thrift文件:
namespace py message.api namespace csharp message.api service MessageService { bool sendMobileMessage(); bool sendEmailMessage(); }
服務端:
而後在,改文件夾下,執行cmd,會生成對應的Python代碼
打開gen-py的文件夾,顯示以下:
而後,把生成的代碼和文件,放到下面新建的Python項目中。
接着使用Pycharm,新建一個Python項目,以下所示:
在message文件夾下新建一個:
message-service.py的文件
安裝:
代碼:
from message.api import MessageService from thrift.transport import TSocket from thrift.transport import TTransport from thrift.protocol import TBinaryProtocol from thrift.server import TServer # 重寫生成 MessageService類中的兩個方法 class MessageServiceHandler: def sendMobileMessage(self): print("sendMobileMessage") return True def sendEmailMessage(self): print("sendEmailMessage") return True if __name__ == "__main__": handler = MessageServiceHandler() processor = MessageService.Processor(handler)
# 注意,這裏的host要設置爲:0.0.0.0,若是設置爲127.0.0.1,客戶端在訪問時,報:目標計算積極拒絕 transport = TSocket.TServerSocket(host="0.0.0.0", port=8800)
# 傳輸方式 buffer tfactory = TTransport.TBufferedTransportFactory()
# 傳輸的數據類型:二進制 pfactory = TBinaryProtocol.TBinaryProtocolFactory() server = TServer.TSimpleServer(processor, transport, tfactory, pfactory) print("python thrift server start") server.serve() print("python thrift server exit")
客戶端:
把 gen-csharp中的 MessageService類複製到該項目下,安裝Thrift對應的.Net Core Nuget包
新建一個.Net Core 控制檯程序:
代碼:
static void Main(string[] args) { using (TSocket socket = new TSocket("localhost", 8800))
//必定要注意,客戶端使用傳輸協議要和服務端的一致,不然會報錯 using (TTransport transport = new TBufferedTransport(socket))
using (TProtocol protocol = new TBinaryProtocol(transport)) using (var client = new MessageService.Client(protocol)) { transport.Open(); Console.WriteLine(client.sendEmailMessage()); ; } Console.ReadKey(); }
最後,確保客戶端和服務端代碼都沒有問題,先啓動服務端代碼,再啓動客戶端代碼,結果以下:
服務端啓動:
客戶端啓動:
結果:
客戶端返回了:True
服務端打印的結果:
到此,C#和Python的相互訪問就實驗成功了,但願對你有幫助,謝謝。
最後,給你們提供一些Thrift的參考文章,由於這些前輩寫的很好,但願對你有幫助。
https://www.cnblogs.com/mumuxinfei/category/597031.html
http://zheming.wang/blog/2014/08/28/94D1F945-40EC-45E4-ABAF-3B32DFFE4043/
注:本篇博客參考了楊中科老師的Thrift部分和劉果國老師Docker+k8s
做者:郭崢
出處:http://www.cnblogs.com/runningsmallguo/
本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文連接。