• トップ
  • ブログ一覧
  • 【環境構築編】最速のC++ Webフレームワーク「Drogon」を試してみた!
  • 【環境構築編】最速のC++ Webフレームワーク「Drogon」を試してみた!

    広告メディア事業部広告メディア事業部
    2020.09.11

    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 にもよりますが、とりあえず以下の環境が必要です。

    1. git
    2. gcc/g++ (C/C++コンパイラ)
    3. cmake (C++ビルド用のツール)
    4. jsoncpp
    5. uuid
    6. OpenSSL
    7. 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」というコマンドが使えるようになっているはずです。

    Drogon のロゴとバージョンが表示される

    サーバーを立ち上げてみる

    それでは、簡単に動作確認をしてみます。

    プロジェクト生成

    先ほど使えるようになったコマンドを叩くことで、必要最低限のファイルが自動で生成されます。

    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 にアクセスしてみると、以下のように表示されるはずです。

    何もビューもコントローラも作成していないのでNot Found

    HTML ファイルも何も作っていないので「Not Found」と出てきますが、フッターには「drogon/1.0.0」と表示されているはずです。

    これで、Drogon によってローカルサーバが無事に立ち上がっていることがわかりました。

    試しに何か表示させてみよう!

    試しにコントローラを一つ作成し、URL アクセスしたときに何か返ってくるようにしてみましょう!

    コントローラを作成

    以下のコマンドを叩き、「TestCtrl」という名前のコントローラを作成します。

    1$ cd controllers
    2$ drogon_ctl create controller TestCtrl

    そうすると、以下の2つのファイルが作成されるはずです。

    1. TestCtrl.h (ヘッダファイル)
    2. 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 編はこちら!

    featureImg2020.09.13【Controller編】最速のC++ Webフレームワーク「Drogon」を試してみた!Controller 編~最速のC++ Web フレームワーク「Drogon」を試してみる~最速の Web フレームワ...

    こちらの記事もオススメ!

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
    featureImg2020.07.27IT・コンピューターの歴史特集IT・コンピューターの歴史をまとめていきたいと思います!弊社ブログにある記事のみで構成しているため、まだ「未完成状態」...
    featureImg2020.08.04エンジニアの働き方 特集社員としての働き方社員としてのエンジニアの働き方とは?ライトコードのエンジニアはどんな働き方をしてるのか、まとめたいと...

    広告メディア事業部

    広告メディア事業部

    おすすめ記事