.NETでThriftを使用する

.NETプロジェクトでThriftのような便利なものを使用する方法の例を共有したいと思います。



知らない人のために、 Thriftは異なる言語、つまりC ++、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、Cocoa、Smalltalk、OCamlで記述されたコード間の相互作用を促進するためのフレームワークです。



Thriftが使用され、元々はFacebookによって作成されました。 ここでもHabréで繰り返し言及されていましたが、.NETの例は見つかりませんでした。 正直なところ、Googleでも見つけることができませんでしたが、検索が不十分だった可能性があります。



Thriftを使用すると、サービス、データ構造、さらには例外を一度記述し、サポートされているすべての言語のコードを生成できます。 したがって、たとえば、.NET上のThriftを使用してサーバーを作成する場合、

  1. ソケットを使用するなど、クライアント/サーバーアプリケーションを記述する時間を大幅に節約します。
  2. サポートされているすべての言語でほぼ自動的に顧客を獲得します。
この例では、単純に時間を返す簡単なサービスを実装しています。 しかし、このようなレイアウトを使用することは、何か便利なものに拡張するのに十分簡単です。





必要なのは:

  1. ソースの節約 -プロジェクトに接続するためのライブラリ(クラスライブラリ)を構築するために必要です。
  2. Thriftコンパイラ -.thriftファイルから必要な言語のコードを生成するコンソールユーティリティ


どちらもここから取得できます。



また、記事の最後に、動作中のアプリケーションのソースコードを示します。彼らは既にライブラリとコンパイラをすでに構築しており、そこからすべてを取得できます。



ステップ1:準備

したがって、ソースをダウンロードしたら、それらを任意のディレクトリに展開して、

thrift-0.5.0\lib\csharp\src\





ソリューションを開き、プロジェクトをビルドします。 次に、 Thrift.dllライブラリがあります。



ステップ2:プロジェクトを作成する

Visual Studioで3つのプロジェクトを作成し、それらをソリューションに結合します。 次のようになりました。

画像



以前に取得したThrift.dllライブラリとダウンロードしたThriftコンパイラーを取得し、ソリューションのディレクトリに配置します。



ステップ3:.thriftファイルからコードを生成する

サービスとデータ構造について説明します。 これを行うには、次の内容のTimeService.thriftファイルを作成します。

namespace csharp TimeServer.Thrift



//Structure for returning Time

struct TimeInfoStruct{

1: string Time

}



//Service

service TimeService

{

TimeInfoStruct GetTime()

}




* This source code was highlighted with Source Code Highlighter .








それをTimeServerCoreプロジェクトに入れます。 また、ステップ1で取得したThrift.dllへのリンク(参照)をプロジェクトに追加します。



重要:.thriftファイルをUnicodeエンコードで保存しないでください。Thriftコンパイラーは、スタジオで[ファイル]-> [高度な保存オプション]でUnicodeを別のエンコードに変更するまで、何も生成しません。



このファイルには、クライアントサーバーアプリケーションのほぼすべての説明が含まれています。



.thriftファイルを指定して手動でThriftコンパイラーを呼び出して必要なクラスを取得できますが、 TimeService.thriftを変更した場合に備えて、プロジェクトに事前ビルドイベントを追加することをお勧めします



私のディレクトリ階層で、私はこの呼び出しを受けました

$(SolutionDir)\Thrift\thrift-0.5.0.exe -gen csharp -o $(ProjectDir) $(ProjectDir)\TimeService.thrift







「Thrift-0.5.0.exe」はコンパイラ自体です。オプション「-gen csharp」は、C#のクラスが必要であることを示し、オプション「-o $(ProjectDir)」は結果の配置場所を示し、残りは「$(ProjectDir )\ TimeService.thrift "は、コンパイルするファイルを示します。



したがって、ビルド後(実際には、ビルド前のイベントがある) TimeServerCore 、2つのクラスを作成します

TimeInfoStruct.cs-時間を転送するための構造。原則として、サービスメソッドは単純に文字列を返すことができますが、構造はより興味深いものです。

TimeService.csは、唯一のメソッドを持つサービスです。



また、シリアル化/逆シリアル化、視覚的なToStringなどのコードもあります。



それらは\ TimeServerCore \ gen-csharp \ TimeServer \ Thriftにあります。 複数の言語が指定されている場合、異なるフォルダーの異なる言語のコードを拡散するために、gen-csharpディレクトリーは常に表示され、.thriftファイルで指定された名前空間のために、階層の下位に2つのディレクトリー(\ TimeServer \ Thrift)が作成されます。



これらの2つのファイルをプロジェクトに追加する必要があります。その後、次のようになります。

画像



ステップ4:サーバー

サーバーを取りましょう。 ソリューションのTimeServerCoreプロジェクトだけでなく、TimeServerのThrift.dllへの参照を追加します。 次に、新しいクラスTimeServiceImplementation.csを作成します。



このクラスでは、サービスのメソッドを実装します。 生成されたファイルTimeService.cs Thriftでは、実装する必要がある特別なインターフェイスが作成されました。



インターフェイスは次のとおりです。

public class TimeService { //



public interface Iface {

TimeInfoStruct GetTime();

}

//...

}




* This source code was highlighted with Source Code Highlighter .








ご覧のとおり、.thriftファイルで説明した関数は1つだけです。



このインターフェイスの実装は次のとおりです。

class TimeServiceImplementation : TimeService.Iface

{

public TimeInfoStruct GetTime()

{

return new TimeInfoStruct() { Time = DateTime .Now.ToString() };

}

}




* This source code was highlighted with Source Code Highlighter .








そして、すべてがほぼ準備できているので、アプリケーションの起動時にサーバーを強制的に起動し、クライアントを待機する必要があります。

static void Main( string [] args)

{

TimeServiceImplementation service = new TimeServiceImplementation();

TProcessor processor = new TimeService.Processor(service);

TServerTransport transport = new TServerSocket(1337, 1000);

TServer server = new TSimpleServer(processor, transport);



server.Serve();

}




* This source code was highlighted with Source Code Highlighter .








サーバーインターフェースの実装を作成した後、ポート1337でサーバーを起動し、接続を待機しますここで、最も単純なサーバーを作成するために必要なすべてのコード。

TSimpleServerサーバーの実装に加えて、Thrift.dllライブラリにはTThreadedServerとTThreadPoolServerがあります。



ステップ5:顧客



クライアントの実装はさらに簡単です:



static void Main( string [] args)

{

TTransport transport = new TSocket( "localhost" , 1337);

TProtocol proto = new TBinaryProtocol(transport);

TimeService.Client client = new TimeService.Client(proto);



transport.Open();

TimeInfoStruct result = client.GetTime();



Console .WriteLine(result.ToString());

Console .ReadKey();

}




* This source code was highlighted with Source Code Highlighter .








Thrift.dllとTimeServerCoreプロジェクトをクライアントプロジェクトに追加することを忘れないでください。



その後、最初にサーバーを起動し、次にクライアントを起動できます。 現在の時刻を印刷する必要があります。



以上です。 そして、ほとんどの時間を初期設定に費やし、Thriftの知人に費やしました。 これで、.thirftファイルでサービスに新しい構造とメソッドを追加できます。その後、サーバーメソッドの実装のみを記述します。

他の言語で作成されたクライアントまたはサーバーが必要な場合は、Thriftを使用してそれらのクラスも生成できます。



たとえば、Thriftを使用して、Cassandraデータベースの.NETクライアントが取得されました。 Cassandraを作成しましたが、Facebookは.NETクライアントをサポートすることはほとんどありませんでした:)



約束されたソースは次のとおりです。

dl.dropbox.com/u/3945288/Thirft-Time-Server-.NET-Sample.zip

github.com/kmuzykov/Thirft-Time-Server-.NET-Sample



ここにThrift Wikiへのリンクがありますが、.NETに関する情報はあまりありません。



All Articles