Introduction
.NETでRPCを試してみる gRPC編 第0回のように、最新のRPCとしてgRPCを試しました。
さまざまな言語をサポートしているので、C++でしか動かない (C#のP/InvokeやC++/CLIからも動作しない) ライブラリをRPCで動かそうと思いました。
ところが、C++でgRPCを動かすのは面倒な模様。
- CMake
- Active State Perl
- Ninja
- Go
- yasm
といったモジュールのインストールが必要のため断念。
かわりに見つけたのがApache Thrift。
こちらも、クライアント/サーバーのコードを生成して利用するため、ロジックの実装に注力できるRPCフレームワーク。
公式は下記。
今回は、クライアントをC#、サーバーをC++として試してみます。
Preparation
Thriftのライブラリは自分でビルドする必要があります。
そのために、下記の手順で、関連ライブラリなどを入手していきます。
boost
Boost C++ Librariesからインストーラを落としてきて展開します。
2017/04/09時点で、1.63が安定版の最新です。
OpenSSL
Heartbleedでも有名になったSSLのライブラリですね。公式ページは下記。
OpenSSLは、2017/04/09時点で、1.1.0eが安定版の最新ですが、1.1.0系はネット上で転がっている情報が少ないし、ビルド方法が違っていて、ビルドできなかったので、1.0.2系を使います。
2017/04/09時点で、1.0.2jが1.0.2系の最新です。
一応説明すると、バイナリの入手は2通りあります。
- 有志が配布しているバイナリの入手
- 現在有志が配布していて、最新版はインストーラのみで環境が汚れてしまう、かつ寄付を求められます。
- 自分でビルド
- Perlのインストールが必要で、環境が汚れてしまう。
- Perlの有名どころのActivePerlは無償と有償がある。企業利用でも、pre-production development and prototyping なら無償版が使える。
* ビルドのためだけなので無償版でOK?
- 最近は、Strawberry Perlというのがあり、かつzipのようなポータブル版もある。
というわけで、インストーラは嫌なので、今回は自分でビルドするために、Strawberry PerlのPortable版を入手しました。
2017/04/09時点で、Strawberry Perlは、5.24.1.1が安定版の最新です。
Portable版でも123MBあります。展開後は、400MBを超えますのでディスク容量には注意。
Strawberry Perlを展開後、スタート > 全てのプログラム > Visual Studio 2015 > Windows Desktop Command Prompts > VS2015 x64 Native Tools コマンド プロンプト
を起動、そしてStrawberry Perlの展開先まで移動し、下記のように実行します。
1 | D:\Works\Lib\Strawberry Perl\5.24.1.1>portableshell.bat |
続いて、OpenSSLの展開先まで移動します。そして、下記のように実行します。
1 | c:\openssl-1.0.2j>mkdir "openssl-1.0.2j_x64_VC-WIN" |
次に、do_win64a.batというバッチを実行します。
1 | C:\openssl-1.0.2j>ms\do_win64a.bat |
以上で、ビルドの準備ができました。
そして、下記のコマンドを実行することで、openssl-1.0.2j_x64_VC-WIN に成果物が出来上がります。
1 | C:\openssl-1.0.2j>nmake -f ms\nt.mak |
成功すると、
- openssl-1.0.2j_x64_VC-WIN\bin
- openssl-1.0.2j_x64_VC-WIN\include
- openssl-1.0.2j_x64_VC-WIN\lib
- openssl-1.0.2j_x64_VC-WIN\ssl
というフォルダができています。
libevent
聞きなれないライブラリですが、公式ページ
によれば、
The libevent API provides a mechanism to execute a callback function when a specific event occurs on a file descriptor or after a timeout has been reached. Furthermore, libevent also support callbacks due to signals or regular timeouts. libevent is meant to replace the event loop found in event driven network servers
とのこと。つまり、特定のイベントが発生したりしたら、コールバック関数を実行するメカニズムを提供するAPIがlibeventであり、イベントドリブンなネットワークサービス内のイベントループを置き換えるもの、とのこと。
確かに、C++ってイベントみたいな機構って、コールバックしかないし、それらをモジュールで積極的に使うってシーンがないから、こういうライブラリはありがたいのかも。
詳しい説明は例のごとくWikipedia。
入手先は、公式ページのDownload–Stable releasesから。
2017/04/09時点で、2.1.8が安定版の最新です。
ソースからビルドするタイプです。
ビルドは簡単で、
スタート > 全てのプログラム > Visual Studio 2015 > 開発者コマンド プロンプト for VS2015
を開く- libeventの展開先フォルダに移動
- nmake -f Makefile.nmake を実行
以上です。
終了時に、
1 | NMAKE : fatal error U1073: 'print-winsock-errors.obj' のビルド方法が指定されていません。 |
と表示されますが、
- libevent.lib
- libevent_core.lib
- libevent_extras.lib
が、フォルダに出来上がっています。
Apache Thrift & Compiler
ソースとコンパイラーを入手します。
Downloadから、thrift-0.10.0.tar.gz、Thrift compiler for Windowsをダウンロードします。
2017/04/09時点で、0.10.0が最新です。
コンパイラーといっても、gRPC toolのように、定義ファイルからコードを生成するだけのものです。
ソースは、任意の場所に展開します。
展開先のlib\cppにthrift.slnがあるので、Visual Studioで起動します。
libthrift
libthriftのプロパティを開きます。C/C++ -> 全般
を開き、追加のインクルード ディレクトリに下記を追加します。
1 | {boost_install_dir}\boost_X_YZ_0 |
ライブラリアン -> 全般
を開き、追加のライブラリ ディレクトリに下記を追加します。>を開き、追加のライブラリ ディレクトリに下記を追加します。
1 | {openss_install_dir}\lib |
最後に、libthrift\concurrency\BoostThreadFactory.cppをプロジェクトから除外します。
libthriftnb
libthriftのプロパティを開きます。C/C++ -> 全般
を開き、追加のインクルード ディレクトリに下記を追加します。
1 | {boost_install_dir} |
以上の設定を終えたら、ビルドが可能になります。
ソリューションでDebug/Release/Debug-mt/Release-mt、ターゲットプラットフォーム(x64/Win32)を選択してビルドします。
- libthriftnb.lib
- libthrift.lib
が生成されているはずです。
Conclusion
今回は導入のみ。
次回は、C#-C++で通信してみます。