【環境構築編】最速のC++ Webフレームワーク「Drogon」を試してみた!
2021.12.20
Web フレームワーク「Drogon」とは?
つい最近、TechEmpower が独自でベンチマークを計測したランキングで、とある Web フレームワークがトップに輝きました。
【TechEmpower Framework Benchmarks】
https://www.techempower.com/benchmarks/#section=data-r19&hw=ph&test=composite
それが「Drogon」です。
C++のフレームワーク
「Drogon」は、Webフレームワークでは珍しい、C++で実装されたフレームワークです。
そのため、処理速度がかなり速く、JSON データならば 1秒間に 1,077,826 件のリクエストを捌けるとのこと。
高速処理で有名な Python WebAPI フレームワーク「FastAPI」でさえ 171,055件/秒ですので、その圧倒的な差が分かるかと思います。
実際に「Drogon」を使ってみよう!
今回は、この Drogon を実際にインストールして動作確認してみたいと思います。
C++を触ったことのない人にも分かるよう解説をしていくので、現役 Web エンジニアは必見です!
参考
【公式ドキュメント】
https://drogon.docsforge.com/
Drogonのインストール方法
インストール前に、まずは環境を整えていきましょう!
Drogon インストールに必要なもの
みなさんの使用している OS にもよりますが、とりあえず以下の環境が必要です。
- git
- gcc/g++ (C/C++コンパイラ)
- cmake (C++ビルド用のツール)
- jsoncpp
- uuid
- OpenSSL
- zlib
macOS は Homebrew を使おう
筆者の環境と同じく macOS であれば、Homebrew で全て事足ります。
1 2 3 4 5 6 | $ brew install git $ brew install gcc $ brew install cmake $ brew install jsoncpp $ brew install ossp-uuid $ brew install openssl |
Drogon のインストール
ワークスペースを作る
まずは、適当にワークスペースを作ってください。
本記事では仮で「drogon-lib」としています。
Github からソースをクローンしてビルド
Drogon のインストールは、Github からソースをクローンし、ビルドします。
具体的には、以下を参照してください。
1 2 3 4 5 6 7 8 9 | $ mkdir drogon-lib $ cd drogon-lib $ git clone https://github.com/an-tao/drogon $ cd drogon $ git submodule update --init $ mkdir build $ cd build $ cmake .. $ make && sudo make install |
インストール完了!
これだけで、Drogon のインストールは終わりです。
しっかりインストールできていれば、「drogon_ctl」というコマンドが使えるようになっているはずです。
サーバーを立ち上げてみる
それでは、簡単に動作確認をしてみます。
プロジェクト生成
先ほど使えるようになったコマンドを叩くことで、必要最低限のファイルが自動で生成されます。
1 | $ drogon_ctl create project [YOUR_PROJECT_NAME] |
本記事では、プロジェクト名を「dg_sample」としています。
ディレクトリ構成はこんな感じ
上記のコマンドを叩くと、以下のようなディレクトリ構成でファイルが生成されます。
1 2 3 4 5 6 7 8 9 10 | .dg_sample ├── build # ビルド用ディレクトリ ├── CMakeLists.txt # cmake用 (Makefile生成用) ├── config.json # Drogonアプリの設定ファイル ├── controllers # コントローラ管理用 ├── filters # フィルタ管理用 ├── main.cc # アプリ メインファイル ├── models # モデル管理用 │ └── model.json └── views # ビュー管理用 |
今回は動作確認だけなので、main.cc しか使いません。
C++ファイルの拡張子は何を使えばいい?
余談ながら、C++ファイルの拡張子は「.cpp」「 .cc」「 .cxx」などいろいろあります。
コンパイラ依存な部分もありますが、「.cpp」か「.cc」を使っておけば基本的には大丈夫でしょう。
main.cc コード解説
さて、main.cc には以下のようなコードが書かれています。
1 2 3 4 5 6 7 8 9 10 | #include <drogon/drogon.h> int main() { //Set HTTP listener address and port drogon::app().addListener("0.0.0.0",80); //Load config file //drogon::app().loadConfigFile("../config.json"); //Run HTTP framework,the method will block in the internal event loop drogon::app().run(); return 0; } |
名前空間(namespace)とは?
drogon:: は、「名前空間(namespace)」といい、名前の衝突を避けるために使用する集合体 (スコープ) を指します。
クラスや構造体と異なり、型を持たないただのグループ付けにすぎません。
Python のモジュール名を想像するとわかりやすいでしょう。
記述の省略もできる
名前が衝突しないのであれば、以下のように記述して省略することも可能です。
1 2 3 4 5 6 7 8 9 10 11 12 | #include <drogon/drogon.h> using namespace drogon; // namespace省略 int main() { //Set HTTP listener address and port app().addListener("0.0.0.0",80); //Load config file //drogon::app().loadConfigFile("../config.json"); //Run HTTP framework,the method will block in the internal event loop app().run(); return 0; } |
ローカルサーバを立ち上げてみよう
さて、いよいよ実行に移ります。
1 2 3 4 | $ cd build # ビルド用ディレクトリへ移動 $ cmake .. # Makefile生成 $ make # ビルドとコンパイル $ ./dg_sample # 実行 |
「Not Found」が表示されれば成功!
http://localhost にアクセスしてみると、以下のように表示されるはずです。
HTML ファイルも何も作っていないので「Not Found」と出てきますが、フッターには「drogon/1.0.0」と表示されているはずです。
これで、Drogon によってローカルサーバが無事に立ち上がっていることがわかりました。
試しに何か表示させてみよう!
試しにコントローラを一つ作成し、URL アクセスしたときに何か返ってくるようにしてみましょう!
コントローラを作成
以下のコマンドを叩き、「TestCtrl」という名前のコントローラを作成します。
1 2 | $ cd controllers $ drogon_ctl create controller TestCtrl |
そうすると、以下の2つのファイルが作成されるはずです。
- TestCtrl.h (ヘッダファイル)
- TestCtrl.cc (ソースファイル)
C++の管理の仕方
C/C++では、「ヘッダファイルにクラスやメソッドを宣言し、ソースファイルに中身を記述する」という管理の仕方をします。
つまり、Drogon では、「ヘッダファイルにルーティングし、ソースファイルに処理を書く」のです。
ヘッダファイル修正
さっそく修正していきましょう。
チュートリアルに倣って、ヘッダファイルに「/」と「/test」という2つのパスを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #pragma once //! インクルードガード ... ヘッダーファイルが重複してインクルードされるのを避けるためのもの #include <drogon/HttpSimpleController.h> using namespace drogon; class TestCtrl:public drogon::HttpSimpleController<TestCtrl> { public: virtual void asyncHandleHttpRequest(const HttpRequestPtr& req, std::function<void (const HttpResponsePtr &)> &&callback) override; // ここから下はルーティング // 以下のパスとメソッドにおいて、TestCtrlコントローラに投げる、という意味 PATH_LIST_BEGIN PATH_ADD("/", Get, Post); // ルーティング PATH_ADD("/test", Get); // ルーティング PATH_LIST_END }; |
パスの追加にはマクロを使う
ここで面白いのは、関数ではなくマクロ (大文字表記の部分) をパス追加に使用している点ですね。
実際ソースを見てみると、このマクロは「クラスメソッド定義で関数を呼び出す役割」を果たしています。
.cc ファイル加筆
続いて .cc ファイルの方も加筆していきます。
1 2 3 4 5 6 7 8 9 | #include "TestCtrl.h" void TestCtrl::asyncHandleHttpRequest(const HttpRequestPtr& req, std::function<void (const HttpResponsePtr &)> &&callback) { auto resp = HttpResponse::newHttpResponse(); // 新しいレスポンスインスタンスを生成 resp->setStatusCode(k200OK); // HTTPステータスコード 200に設定 resp->setContentTypeCode(CT_TEXT_HTML); // Header: Content typeをHTMLにする resp->setBody("<h1>Hello World!</h1>"); // Body: callback(resp); } |
「auto」はどんな型?
C++11 で追加された型 auto は、コンパイル時に型を推測してくれます。
便利な型なので覚えておきましょう。
いざ実行!
さて、それでは実行してみましょう。
1 2 3 | $ cd build $ make $ ./dg_sample |
「localhost/」と「localhost/test」どちらも、"Hello World!"と表示されるはずです。
このように、Drogon では、コントローラの設定はとてもシンプルになっています。
Controller 編へつづく!
今回は、C++ Webフレームワーク「Drogon」の基礎的な解説をしました。
C++ なので一見複雑なコードですが、かなり使いやすく実装されています。
高速な C++ の恩恵を受けつつ、簡単にWebアプリケーションが実装できるフレームワークといえるでしょう!
Drogonには、まだまだたくさんの機能がありますので、引き続き解説記事を掲載していく予定です。
次回は「コントローラ」についてもっと詳しく見ていきます!
controller 編はこちら!
こちらの記事もオススメ!
書いた人はこんな人
- 「好きを仕事にするエンジニア集団」の(株)ライトコードです!
ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。
現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。
いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。
システム開発依頼・お見積もり大歓迎!
また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」「WEBディレクター」を積極採用中です!
インターンや新卒採用も行っております。
以下よりご応募をお待ちしております!
https://rightcode.co.jp/recruit
- ライトコードの日常2月 29, 2024座談会はじめました!ライトコードの話ちょっと聞いてみませんか?
- ライトコードの日常12月 27, 2023年忘れ!ライトコード大忘年会2023
- ライトコードの日常12月 1, 2023ライトコードクエスト〜東京オフィス歴史編〜
- ITエンタメ10月 13, 2023Netflixの成功はレコメンドエンジン?