• トップ
  • ブログ一覧
  • 【環境構築編】最速の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エンジニアの働き方 特集社員としての働き方社員としてのエンジニアの働き方とは?ライトコードのエンジニアはどんな働き方をしてるのか、まとめたいと...

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    広告メディア事業部

    広告メディア事業部

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background