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