Akka-HTTP
Akka-HTTPはAkka-ActorとAkka-StreamsをベースとしたAkkaのHTTP moduleです。
異なるレベルでのAPIを提供してくれているので高レベルから低レベルなところまでカスタムすることができて良いです。
あとはSprayの開発チームがLightbend(旧Typesafe)にそのまま移行して開発している(?)ので割とSprayのAPI、DSLに似ている部分が多かったりしてSpray使ったことがある人は移行しやすいと思います。パフォーマンスは最近はSprayに迫るところまで来ていて実用に足るところまで来ているのでは無いでしょうか。
Akka-HTPPは幾つかのmoduleから成り立っていてそれぞれを軽く説明すると以下の感じになります。
- akka-http-core: ほとんどが低レベルで構成されていてhttp server, clientのためのmodule(WebSocketsも含む)
- akka-http: 高レベルな関数やhttp serverのAPI定義などに使用出来るDSLを含んでいるmodule
- akka-http-testkit: http serverのためのテストツールmodule
- akka-http-spray-json: JSONのシリアライズ、デシリアライズのためのmodule
- akka-http-xml: XMLのシリアライズ、デシリアライズのためのmodule
実装
UserのCRUDができるREST APIを作ってみます。
ソースコードはGithubにあげておきました。
sbt
まずはplugin.sbtを書きます。
sbt-assemblyはStand-aloneなjarを作るのに使用します。
|
次にbuild.sbtに必要なライブラリを追記しておきます。
|
Scala
Routeを書く前にデータやリクエストを定義します、JSONを使いたいのでさらにJsonProtocolも定義します。
jsonFormatの後ろについている1や2はClassのパラメータ数を表しています。
|
データの定義が完了したので実際にRouteを書いていきます、ほぼSprayの書き方と同じです。
本来であればRouteとServiceは分離してあった方が良い気がしますが今回は気にせず一体型にします。
JSONを使いたいのでSprayJsonSupportを継承しています、この辺まだSprayのままみたいですね。
先に定義したJsonProtocolをimportしないとcompileが通らないので注意してください。
|
indexとpingは関係ないですがサンプルとして追加しました。
リクエストの処理が完了して手っ取り早くOKだけ返したい時はStatusCodes.OK
を使ってあげると簡単です。
全体的に特に難しいところもなく割と直感的に書けるところは良いですね。
他に便利なrouting DSLもたくさんあるので公式ドキュメントで適宜探してみると良いと思います。
次にDBのモックをこんな感じに作っておきます。
|
Boot(Main)を書いていきます。この辺はSprayとちょっと異なる部分なので注意しながらやってみてください。
bindingが失敗したときのためにloggerを仕込んでいます。
|
ここまできたらsbtでreStartしてみてください、API Serverが立ち上がると思います。
jarが欲しい場合はsbt assembly
でjarが生成されます、Stand-aloneなjarなので扱いやすいのが嬉しいです。
Akka-HTTPは本当にSprayとほぼ同じ感じでかけるので使ったことある人はとっつきやすいと思いました。
現在はパフォーマンスチューニングを中心に開発しているようなのでどこまでSprayに近づけるのか楽しみですね。