thrift初識-c++服務端和python客戶端

来源:http://www.cnblogs.com/a1368017681/archive/2017/09/08/7494450.html
-Advertisement-
Play Games

thrift初識 c++服務端和python客戶端 thrift作為一個跨語言的服務部署框架,目前的應用非常廣泛。 這裡通過thrift實現一個簡單的echo服務來加深對其的理解和印象。入門學習thrift強烈推薦官方文檔 "thrift study" 整個echo服務分為兩個很簡單的部分,服務端和 ...


thrift初識-c++服務端和python客戶端

thrift作為一個跨語言的服務部署框架,目前的應用非常廣泛。
這裡通過thrift實現一個簡單的echo服務來加深對其的理解和印象。入門學習thrift強烈推薦官方文檔thrift study

整個echo服務分為兩個很簡單的部分,服務端和客戶端,thrift是跨語言的,所以我嘗試了兩種不同的語言,用C++做伺服器端,python寫客戶端(畢竟簡單),在實踐之前先介紹下thrift的原理。

thrift工作原理

這裡只做下簡單介紹,因為我也是初學,網上還是有很多其他的好的博文的。
thrift通過它自定義的一種IDL來定義它RPC的規範(介面和數據類型),然後通過編譯器生成不同語言的代碼(gen-cpp,gen-java,gen-py等),底層網路傳輸,協議層的功能都由這些生成的代碼來維護。
thrift的network stack有張經典的介紹圖如下:

  1. 圖中transport層做為傳輸,其實是一種網路數據讀寫的抽象層,把傳輸和其他系統解耦。
  2. protocol層,定義transport層的傳輸的數據格式,作序列化和反序列化的格式要求。
  3. processor層:A Processor encapsulates the ability to read data from input streams and write to output streams. The input and output streams are represented by Protocol objects.
  4. server層做一個上述功能特性的聚合。

開發人員一般都在server層寫,不過因為業務不同會對不同層次提供的介面採取不同的使用,比如非阻塞的網路IO。

C++服務端

接下來是實踐,寫了一個簡單的echo服務為例。首先在echo.thrift中定義service如下:

service echo{
     string echo(1:string msg)
}

然後使用命令thrift -gen cpp echo.thrift和thrift -gen py echo.thrift分別生成c++和python版本的代碼,python的用來做客戶端。
然後修改生成的cpp目錄gen-cpp之下的echo_server.skeleton.cpp,內容如下:

// This autogenerated skeleton file illustrates how to build a server.
// You should copy it to another filename to avoid overwriting it.

#include "echo.h"
#include <protocol/TBinaryProtocol.h>
#include <server/TSimpleServer.h>
#include <transport/TServerSocket.h>
#include <transport/TBufferTransports.h>
#include <iostream>

using namespace ::apache::thrift;
using namespace ::apache::thrift::protocol;
using namespace ::apache::thrift::transport;
using namespace ::apache::thrift::server;

using boost::shared_ptr;

//using namespace ;

class echoHandler : virtual public echoIf {
 public:
  echoHandler() {
    // Your initialization goes here
  }

  void echo(std::string& _return, const std::string& msg) {
    // Your implementation goes here
   // printf("echo\n");
    std::cout << "get msg: " << msg << std::endl;  //主要就是這個函數的修改
    _return = msg;
  }

};

int main(int argc, char **argv) {
  int port = 9090;
  shared_ptr<echoHandler> handler(new echoHandler());
  shared_ptr<TProcessor> processor(new echoProcessor(handler));
  shared_ptr<TServerTransport> serverTransport(new TServerSocket(port));
  shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory());
  shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());

  TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);
  server.serve();
  return 0;
}

之後編譯,新手編譯可能會遇到兩個問題。第一個問題是找不到thrift,g++提示錯誤Thrift.h: No such file or directory,解決方法也簡單,既然是找不到,那就把它添進去,加上g++編譯選項 -I /usr/local/include/thrift -L /usr/local/lib,添加thrift的安裝路徑的頭文件庫和lib庫。 第二個問題是提示error: ‘uint8_t’ does not name a type,解決辦法也是加上編譯選項-g -DHAVE_NETINET_IN_H,原因參考error:‘uint8_t’ does not name a type. 所以最後編譯命令就是 g++ -g -DHAVE_NETINET_IN_H -I /usr/include/thrift -o server *.cpp -lthrift(lib看情況加不加),這樣就生成的可執行文件server,server預設監聽9090埠。

python客戶端

python客戶端比較簡單,在gen-py目錄中添加client.py文件,內容如下:

#!/usr/bin/env python
#coding:utf-8
import sys
sys.path.append('./')

from echo import echo #引入客戶端類

from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol

try:
  #建立socket
  transport = TSocket.TSocket('localhost', 9090)
  #選擇傳輸層,這塊要和服務端的設置一致
  transport = TTransport.TBufferedTransport(transport)
  #選擇傳輸協議,這個也要和服務端保持一致,否則無法通信
  protocol = TBinaryProtocol.TBinaryProtocol(transport)
  #創建客戶端
  client = echo.Client(protocol)
  transport.open()

  while 1:
    msg = raw_input("input msg: ")
    msg_ret = client.echo(msg)
    print "echo: "+msg_ret

#  print "server - " + msg
  #關閉傳輸
  transport.close()
#捕獲異常
except Thrift.TException, ex:
  print "%s" % (ex.message)

最後運行先運行server,之後執行python client.py能得到這樣的結果,在server會收到信息,客戶端輸入的信息也得到回顯。
客戶端

input msg: show parameter
echo: show parameter
input msg:

服務端

get msg: show parameter

最後的內容大致如上所示,以後會慢慢寫更加複雜的thrift的代碼了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 安裝JDK/安裝JRE以及配置java環境變數對於java初學者來說是一件比較頭疼的事情,這邊分享一個簡單的批處理命令,助大家一步完成JDK或者單獨安裝JRK的需求。 關鍵步驟: 1.新建一個.txt文檔,複製附件一/附件二到文檔中; 2.修改文檔中的內容: 附件一:start /WAIT jdk- ...
  • 輸出結果 有時候,輸出結果是: 測試結果: 1 WaitForAll 不會阻塞主線程。 2 100 個 TTask 不會創建100個線程,不用寫代碼就可得到 【線程池】 一樣的功能! 3 無法判斷 Task 全部結束?? 4 線程中涉及到 【介面】時要多註意! 測試環境: win10 + delph ...
  • 今天做了個實現驗證碼功能的小demo,但驗證碼無法輸出到訪問頁面,報錯如下: 圖片寫入response.getOutputStream代碼如下: 隨後百度了一下,將 改為 就可以正常顯示了 _(:з」∠)_ 。。。 ...
  • ``` def test(a, b, c=3): print(locals()) # 混用兩種,確保順序命名在前 test(c = 30, 1, 2) SyntaxError: positional argument follows keyword argument ``` ...
  • 每次我發佈軟體工程師的崗位工作要求 ,各種求職申請就會紛至沓來,接踵而至 。但每每讓我困惑的是, 似乎總有那麼幾位應聘者完全不明白所謂“編程”的意思。 當然,他們另有想法。 而我認為,如果你應聘的是“Web 前端開發”崗位,那麼你只懂jQuery也可以勝任,那麼,“軟體工程師”是不是就意味著會HTM ...
  • 想了半天,發現單獨的封裝和多態沒什麼好講的,我們就簡單說說Java裡面對應的語法吧。 相關內容如下: 一、訪問修飾符 二、getter/setter方法 三、構造方法 四、super和this 五、static關鍵字 六、final關鍵字 七、方法重寫 八、抽象類和介面 一、訪問修飾符 Java當中 ...
  • 其實本來真的沒打算寫這篇文章,主要是我得記憶力不是很好,不像一些記憶力強的人,面試完以後,幾乎能把自己和麵試官的對話都給記下來。我自己當初面試完以後,除了記住一些聊過的知識點以外,具體的內容基本上忘得一干二凈,所以寫這篇文章其實是很有難度的。 但是,最近問我的人實在是太多了,為了避免重覆回答,給自己 ...
  • 原文出處:http://hi.baidu.com/eduask%C9%BD%C8%AA/blog/item/227bf4d81c71ebf538012f53.html 這是什麼原因呢? 1。java在編譯的時候 Integer a = 100; 被翻譯成-> Integer a = Integer. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...