使用Thrift讓Python和C#能夠相互調用

在聊如何使用Thrift讓Python和C#能夠互相調用以前,咱們先來看看下面的話題。html

1、什麼是微服務、微服務的特徵、誕生的背景、優點和不足

  微服務:使用一套小服務來開發單個應用的方式,每一個服務運行在 獨立的進程中,通常採用輕量級的通信機制互聯而且他們能夠經過自動化的方式部署。python

  微服務的特徵:數據庫

  1)單一職責 2)輕量級通信  3)隔離性 4)有本身的數據 5)技術多樣性apache

  微服務誕生的背景:json

  1)互聯網行業的快速發展 2)敏捷開發,精益方法深刻人心  3)容器技術的成熟api

  優點:多線程

  1)獨立性,各自開發本身的模塊互不影響  2)敏捷性,能很快響應需求的變化  3)高效團隊  4)技術棧靈活,可使用多種語言進行混合開發。架構

  不足:框架

  1)額外的工做異步

  拆分的過小,服務越多,服務之間的調用 就會過多,形成沒必要要的性能損耗。
  拆分的太大,就會失去微服務的優點。
  2)數據的一致性
  單體架構能夠經過事務很輕鬆的實現數據的一致性,可是微服務,他們都有本身的數據庫,即便咱們在拆分微服務是保證數據庫的聯表操做,儘可能讓它在同一個微服務內,可是也很保證沒有這種意外的狀況,一旦出現就會對咱們的數據一致性形成影響。
  3)溝通成本增長

2、微服務架構帶來的問題

  採用微服務架構會帶來不少問題,在這裏只討論微服務之間是如何通信的。

  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#之間該如何使用。

3、代碼演示

版本說明:

  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/

本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文連接。

相關文章
相關標籤/搜索