2011-07-12 43 views
28

我打算实施一个纯Akka驱动的基于REST的Web API。我不确定使用喷雾剂。如果它是好的,我会考虑使用Scalatra。基本上我对使用Scala Actor模型的并发优势感兴趣。我不希望Servlet容器在这个过程中成为障碍。如何使用Akka实现REST Web服务?

什么可以是其他选项?

更新1: 这是实现基于阿卡后端REST更好的前端? - 喷雾,Scalatra或Dropwizard或其他?

回答

27

实现约阿卡重要的是,它不是一个全有或全无的环境。您可以在很大程度上混合搭配不同的图书馆来构建对您有意义的系统。例如,我编写的应用程序使用前端使用Akka的Dropwizard,没有问题。我也采用了Clothesline(在Clojure中实现,但使用Scala wrapper)。而且本周晚些时候,我希望用Unfilteredwebsocket implementation在阿卡面前和近实时数据反馈给客户端的浏览器的RabbitMQ管坐实验 - 我特别提到这个例子中,因为未过滤的WebSocket IMPL坐在顶部的Netty而不是一个servlet容器)。

更新:自从几年前已经写过这个答案以来,我开始仅使用Spray与Akka进行RESTful开发。虽然几乎可以使用任何JVM REST库,但Spray非常自然地适合Akka的基于actor的模型,并且库显然达到了可以轻松成为默认选择的成熟度级别。即将推出的Spray集成到Akka中作为新的akka​​-http模块,这是一个明确的指示。

+0

我loooove有人建立一个版本的Netty +未过滤的使用码头延续和/或者Servlet 3.0异步,所以我可以钩到阿卡是这样的。我非常好奇地想知道你的Akka整体体验,如果你愿意的话,可以私下说说。保持这个令人敬畏的工作,√ –

+1

是的,这是时间允许的,我很乐意加入。我知道那里已经有一些基础工作,但很难了解还有多少工作要做。这是我第一次进入websockets(尽管过去我已经用彗星做了很多事情),但我对可能涉及的复杂问题犹豫不决。 –

+0

呃,我的意思是说,我知道已经有一些基础工作,因为这项工作已经开始直接在Akka进行。不确定是否有人试图通过Jetty/Servlet 3.0 API在Unfiltered中实现此功能。我应该去研究......哦,我会给一些空闲时间。 –

10

如果你想要CODE来做到这一点,那么在这里。我花了一点时间才弄清楚发生了什么,因为有一些TON的例子,并不清楚他们在做什么或如何把它们放在一起。原来它更简单比我想象:

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

希望这有助于!

0

我不知道为什么你是可疑使用Servlet容器为基础的 - 它并没有真正限制你的选择,在任何可能的方式,它只是处理基本的HTTP服务器的管道。因此,大多数Java服务框架使用servlet API作为基础基础,即使它们不公开该级别。

我觉得DropWizard是各种JVM休息服务,包括使用阿卡实际的提升者的绝佳选择。除了其良好性的明显原因(基于证明是“JVM最佳”的库的集合),我喜欢它,因为它有助于许多其他库/框架所忽略的领域:度量的生成,声明式验证;一直保持简单,明确和可以理解的事情。

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

} 
+0

我得到以下错误示例代码: scala:无法找到隐式值的参数超时:akka.util.Timeout 新的AsyncResult {val is = myActor? “做的东西,并给我一个答案”} – Owen

+0

重命名超时val to tOut为我工作 – Owen

3

akka-http(人们又称它为喷雾2.0),这是基于阿卡流。