29

純粋な Akka を利用した REST ベースの Web API を実装するつもりです。スプレーの使い方がよくわかりません。もしよろしければ、Scalatra を使用することを検討します。基本的に、私は Scala Actor モデルの並行性の利点を利用することに興味があります。その過程でサーブレットコンテナが邪魔になるのは嫌です。

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

更新 1: Akka バックエンドに基づいて REST を実装するには、どちらのフロントエンドが適していますか? - スプレー、Scalatra、Dropwizard、またはその他?

4

6 に答える 6

27

Akka について認識すべき重要な点は、Akka が全か無かの環境ではないということです。大部分は、さまざまなライブラリを組み合わせて、自分にとって意味のあるシステムを構成できます。たとえば、問題なく、Akka を使用するバックエンドの前面にあるDropwizardを使用するアプリを作成しました。私はClotheslineでも同じことをしました(Clojureで実装されていますが、Scalaラッパーを使用しています)。そして今週後半には、Unfilteredwebsocket 実装を Akka の前に置き、RabbitMQ パイプを使用してほぼリアルタイムのデータをクライアント ブラウザーに供給する実験をしたいと考えています。ネッティの上にサーブレット コンテナーではなく)。

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

于 2011-07-12T18:45:44.673 に答える
10

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"
  )

お役に立てれば!

于 2012-02-28T16:52:38.930 に答える
5

完全を期すために、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")
  }

}
于 2013-04-04T13:04:36.763 に答える
3

akka-streams に基づいた akka -http ( spray-2.0とも呼ばれます) を使用します。

于 2015-03-13T03:24:40.563 に答える
3

HTTP サーブレットとそこにある多くのコンテナーは、実証済みの信頼できるテクノロジです。Akka は、独自の埋め込みサーブレット コンテナーを選択するか、独自の .xmlと共に使用することができます。

もちろん、Netty を使用して独自の Web サーバーをロールアップすることもできます。これについては、興味深い記事が Web に掲載されています。

于 2011-07-12T18:24:55.817 に答える
0

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

DropWizard は、実際のリフティングに Akka を使用するものを含め、あらゆる種類の JVM レスト サービスに最適な選択肢だと思います。その良さの明らかな理由 (「JVM の最高」であることが証明されたライブラリのコレクションに基づく) に加えて、他の多くのライブラリ/フレームワークが除外している領域で役立つため、私はそれが好きです: メトリックの生成、宣言型検証。物事をシンプル、明確、そして理解しやすいものに保ちます。

于 2012-03-12T18:40:06.307 に答える