ブドウ:シングルレールではありません、パート2

グレープに関する最初の投稿で 、私はその主要な機能をすぐにスキップしました。 最後の投稿の公開の結果によると、私はフレームワークの適用の実例と比較ベンチマークを約束しました。



今日、サンプルの作成を開始します。次のことができるAPIを開発します。

-ユーザー登録

-メールでアクティベート

-承認されたユーザーデータを更新する

-許可されたユーザープロファイルを返す









TL; DR
gem install grape-gen
      
      





正直なところ、私は少しずるいです-何も書きません。

その投稿の後、私はしばらく考えました-私は何をすべきですか? 真空中で球形の例を書くのに時間をかけたくなかっただけです。彼らが言うように、魚を食べて骨を絞らないようにしたかったのです。

そこで少し時間をかけて、フル機能のAPIアプリケーションのgemジェネレーターをgrapeにまとめて、明白に-grape -genという名前を付けました。



「スケルトン」アプリケーション、バッテリー付属



フレームワーク自体を除き、現代のWebアプリケーションに必要なものについての長い話で苦しむことはありません。

すぐに使えるジェネレーターは以下を提供します:

-ORM(これまでのところ、Mongoidのみ)

-認証(ワード+ CanCanCan)

-バックグラウンドタスク(Sidekiq)

-リアルタイムメッセージ(Faye)

-ElasticSearch(タイヤ)との統合

-ファイルのダウンロード(Carrierwave)

-Mandrill(MandrillMailer)経由でメールを送信する

-ガード+スポークおよびテストを使用してAPIを文書化するためのgemを備えたカスタマイズされたテスト環境。



これらはすべて接着されており、すぐに使用できます。

少なくともfayeとsidekiqには、Redisを強くお勧めします。



gemをシェルにgrape-genをインストールすると、同名のコマンドが使用可能になります。 アプリケーションを生成するには、次を実行します。

 $ grape-gen app your_app_name
      
      





ジェネレーターは特定のコンポーネントを無効にする機能を提供します。ここにコマンドのヘルプがあります
 $ grape-gen help app Usage: grape-gen app APP_NAME Options: [--path=PATH] [--orm=ORM] # Default: mongoid [--batteries=one two three] # Batteries to include # Default: ["sidekiq", "carrierwave", "mandrill", "es", "faye"] [--use-grape-rackbuilder], [--no-use-grape-rackbuilder] # Default: true
      
      





デフォルトでオンに設定されているgrape-rackbuilderについて-これは、開発環境でファイルを自動ロードしてコードを再ロードするための松葉杖です。 すべてがスムーズではなく、そこにあるコードがひどいわけではありませんが、割り当てられたほとんどの機能に対応しています。近い将来、パッチを適用します。



EventMachineについて



最初の投稿のコメントで、 stalkergは「非同期プログラミングがなければ、そのようなフレームワークはほとんど意味がない」という考えを表現しました。

私はこれに何らかの真実があると信じているので、アプリケーションはすぐにEventMachineベースのサーバー(ThinまたはGoliath)の下で実行するように設計されています。

これは、準備中にアプリケーションで使用されるすべての「バッテリー」がブロッキングIOをEventMachineからの非同期アナログに置き換える準備ができていることを意味し、Carrierwave画像処理はEventMachine.deferを介してスレッドプールに送信されます同じ時間で、イベントループに2倍の頻度で「ため息」を与えながら、2倍の画像を処理します-テストで確認しました)。

もちろん、em-synchrony。 各要求はRack :: FiberPoolを介して独自のファイバーで実行されるため、コールバックはありません。



アプリケーションが提供するAPI



 POST /api/auth/register email password display_name POST /api/auth/approve_email email email_approvement_code PUT /api/profile display_name avatar remove_avatar GET /api/profile
      
      





APIは、JBuilderを使用して生成され、MultiJson + ojを介してシリアル化されるJSONを提供します。



アプリケーション構成



redis、elasticsearch、サードパーティAPIキーへの接続はconfig / application.ymlファイルで設定されます

データベース接続はconfig / database.ymlで設定されます

config / logging.ymlのロギング設定

config / sidekiq.ymlのSidekiq設定



試運転



構成が正しいことを確認したら、新しく作成したアプリケーションを起動します。

 $ RACK_ENV=production thin start -p 9292 #   API $ thin start -p 9393 -e production -R faye.ru #   faye $ sidekiq -C config/sidekiq.yml -r ./config/boot_sidekiq.rb -e production #   Sidekiq
      
      





プロセスが正常に開始されると、https :// localhost:9292 / fayeでチャネル/ユーザー/登録済みおよび/時間にサブスクライブしているプリミティブなフェイクライアントのページが利用可能になります。

/ timeチャネルへのメッセージは、5秒ごとに実行するようにスケジュールされたSidekiqタスクによって送信されます。

したがって、5秒ごとにサーバー時間の行がページに追加されます。



ユーザーの登録と電子メールの確認の後、display_nameのメッセージが/ user / registeredチャネルに追加され、それを受信すると、ブラウザーは新しいユーザーに挨拶するための提案を含む行を追加します。



テスト環境



テスト環境は、RSpec 3 gem、rspec_api_documentationに基づいています。 多くのFactoryGirl、DatabaseCleaner、Fakerのお気に入りが含まれています



これはすべてGuard + Sporkの下で開始され、さらにテスト環境では、開発時と同様にコードの再読み込みが使用されるため、テストを十分に迅速に実行できます。



それとは別に、 rspec_api_documentation gemに言及する価値があります。テストを記述し、APIドキュメントを生成するプロセスを組み合わせることができます。

その前にSwaggerを使用しましたが、残念ながら正規のREST APIに適しています。 APIがよりJSONスタイルのRPCである場合、APIをSwagger記述構造に組み込むことは難しく、API応答構造のドキュメントはグレープエンティティのみが利用できます。テスト例(有効なユーザー登録など)を記述します。この例を実行すると、サーバーに送信された要求、受信した応答、要求URLを記憶し、この情報からドキュメントを生成します。 また、パラメーターの説明を指定することもできます。 など

以下に例を示します。
 resource "Account" do get "/accounts" do parameter :page, "Page to view" # default :document is :all example "Get a list of all accounts" do do_request status.should == 200 end # Don't actually document this example, purely for testing purposes example "Get a list on page 2", :document => false do do_request(:page => 2) status.should == 404 end # With example_request, you can't change the :document example_request "Get a list on page 3", :page => 3 do status.should == 404 end end post "/accounts" do parameter :email, "User email" example "Creating an account", :document => :private do do_request(:email => "eric@example.com") status.should == 201 end example "Creating an account - errors", :document => [:private, :developers] do do_request status.should == 422 end end end
      
      





次は?

この投稿では、APIアプリケーションをすばやく作成するために必要な基本情報を提供したと思います。

プロジェクトで使用される宝石は、十分に文書化されています。 あなたが私が重要な何かを見逃したと思うなら-コメントやPMに書いてください、私は間違いなく付け加えます。

次の投稿では、このアプリケーションの多かれ少なかれ客観的なベンチマークの準備を試みます。

これまでのところ、i5 2500Kでは、1つのアプリケーションインスタンス(1つのスレッド)が、既存のユーザーのデータでPOST / api / auth /登録するために毎秒700リクエストを処理すると言うことができます。

また、計画では、Goliathサーバー(JITは非常に優れています)にJRubyサポートを追加し、httpおよびアプリ内キャッシュを追加する予定です。



All Articles