web-dev-qa-db-ja.com

Akkaを使用してREST Webサービスを実装する方法は?

純粋なAkkaを使用したRESTベースのWeb APIを実装するつもりです。スプレーを使用するかどうかは不明です。Scalatraを使用することを検討します。問題がなければ、基本的に同時実行の利点を使用したいと思っています。 of Scala Actorモデル。サーブレットコンテナがそのプロセスの邪魔になりたくありません。

他のオプションは何ですか?

更新1:Akkaバックエンドに基づいてRESTを実装するためのより良いフロントエンドはどれですか?-スプレー、Scalatra、Dropwizardまたは他の何か?

29

Akkaについて理解する重要なことは、それがオールオアナッシング環境ではないということです。さまざまなライブラリを大まかに組み合わせて、自分にとって意味のあるシステムを構成することができます。たとえば、私は Dropwizard を使用するアプリを作成しましたが、Akkaを使用するバックエンドに問題なく対応しています。 Clothesline でも同じことを行っています(Clojureで実装されていますが、 Scalaラッパー で実装されています)。そして今週後半、 nfilteredwebsocket実装 を使用して、ほぼリアルタイムのデータをクライアントに供給するためのAkkaとRabbitMQパイプの前に座って実験したいと思いますブラウザー-フィルターされていないwebsocket実装がサーブレットコンテナーではなく Netty の上にあるため、この例を具体的に説明します。

Update:数年前にこの回答を書いて以来、AkkaでのRESTful開発専用に Spray を使い始めました。ほとんどすべてのJVM REST=ライブラリを使用できますが、SprayはAkkaのアクターベースのモデルに非常に自然に適合し、ライブラリは成熟度のレベルに達しているため、デフォルトの選択を簡単に行うことができます。新しいakka-httpモジュールとしてのSprayのAkkaへの統合がこれを明確に示しています。

27
Thomas Lockney

CODEで実行する場合は、ここにあります。非常に多くの例があるため、実際に何が起こっているのかを理解するのに少し時間がかかりました。思ったよりも簡単だったことがわかります。

package com.nthalk.akkatest

import akka.actor.Actor.actorOf
import akka.actor.Actor
import akka.camel.Consumer
import akka.camel.Message
import akka.camel.CamelServiceManager

class MyActor extends Actor with Consumer {
  def endpointUri = "jetty:http://localhost:8877/"
  def receive = {
    case msg: Message => { self.reply("State Rest Service: Achieved") }
    case _ => { self.reply("Really, no message?") }
  }
}

object App extends scala.App {
  actorOf[MyActor].start
  CamelServiceManager.startCamelService
}

そして私のbuild.sbtは次のようになります:

organization := "com.nthalk"

name := "akkatest"

version := "0.1.0"

resolvers += 
  "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/"

libraryDependencies ++= Seq(
  "org.Apache.camel" % "camel-jetty" % "2.9.0",
  "se.scalablesolutions.akka" % "akka-camel" % "1.3.1"
  )

お役に立てれば!

10
Nthalk

完全を期すために、Scalatraの例を用意しておくと便利です(Scalatraについて質問したため)。 Scalatra Akka Guide のコード例を次に示します。

package com.example.app

import akka.actor.{ActorRef, Actor, Props, ActorSystem}
import akka.dispatch.ExecutionContext
import akka.util.Timeout
import org.scalatra.FutureSupport
import org.scalatra.{Accepted, ScalatraServlet}

class MyActorApp(system:ActorSystem, myActor:ActorRef) extends ScalatraServlet with     FutureSupport {

  protected implicit def executor: ExecutionContext = system.dispatcher

  import _root_.akka.pattern.ask
  implicit val timeout = Timeout(10)

  get("/async") {
    new AsyncResult { def is = myActor ? "Do stuff and give me an answer" }
  }

  get("/fire-forget") {
    myActor ! "Hey, you know what?"
    Accepted()
  }
}

class MyActor extends Actor {
  def receive = {
    case "Do stuff and give me an answer" => sender ! "The answer is 42"
    case "Hey, you know what?" => println("Yeah I know... oh boy do I know")
  }

}
5
futurechimp

HTTPサーブレットとそこにある多くのコンテナには、実績のある信頼できる技術があります。 Akkaは 独自の埋め込みサーブレットコンテナー の選択肢を提供しますが、それを使用することもできます 独自の

もちろん、Nettyを使用して独自のWebサーバーをロールバックすることもできます。興味深いのは これに関するWebでの説明 です。

3
opyate

akka-http を使用します(人々はそれをspray-2.0とも呼びます)。これはakka-streamに基づいています。

3
Windor C

サーブレットコンテナーをベースとして使用することに疑いを抱く理由がわかりません。これは、選択を制限するものではなく、基本的なHTTPサーバーの配管を処理するだけです。したがって、ほとんどのJavaサービスフレームワークは、そのレベルを公開していなくても、サーブレットAPIを基本的な基盤として使用します。

DropWizardは、実際のリフティングにAkkaを使用するサービスを含め、あらゆる種類のJVMレストサービスに最適です。 (「JVMの最高」であることが証明されたライブラリのコレクションに基づく)その良さの明らかな理由に加えて、他の多くのlib/frameworksが除外している領域で役立つため、私はそれが好きです。物事をシンプル、明示的、理解可能に保ちながら。

0
StaxMan