我打算实施一个纯Akka驱动的基于REST的Web API。我不确定使用喷雾剂。如果它是好的,我会考虑使用Scalatra。基本上我对使用Scala Actor模型的并发优势感兴趣。我不希望Servlet容器在这个过程中成为障碍。如何使用Akka实现REST Web服务?
什么可以是其他选项?
更新1: 这是实现基于阿卡后端REST更好的前端? - 喷雾,Scalatra或Dropwizard或其他?
我打算实施一个纯Akka驱动的基于REST的Web API。我不确定使用喷雾剂。如果它是好的,我会考虑使用Scalatra。基本上我对使用Scala Actor模型的并发优势感兴趣。我不希望Servlet容器在这个过程中成为障碍。如何使用Akka实现REST Web服务?
什么可以是其他选项?
更新1: 这是实现基于阿卡后端REST更好的前端? - 喷雾,Scalatra或Dropwizard或其他?
实现约阿卡重要的是,它不是一个全有或全无的环境。您可以在很大程度上混合搭配不同的图书馆来构建对您有意义的系统。例如,我编写的应用程序使用前端使用Akka的Dropwizard,没有问题。我也采用了Clothesline(在Clojure中实现,但使用Scala wrapper)。而且本周晚些时候,我希望用Unfiltered的websocket implementation在阿卡面前和近实时数据反馈给客户端的浏览器的RabbitMQ管坐实验 - 我特别提到这个例子中,因为未过滤的WebSocket IMPL坐在顶部的Netty而不是一个servlet容器)。
更新:自从几年前已经写过这个答案以来,我开始仅使用Spray与Akka进行RESTful开发。虽然几乎可以使用任何JVM REST库,但Spray非常自然地适合Akka的基于actor的模型,并且库显然达到了可以轻松成为默认选择的成熟度级别。即将推出的Spray集成到Akka中作为新的akka-http模块,这是一个明确的指示。
HTTP servlets和那里的许多容器都有一个可靠和值得信赖的技术。 Akka为您提供its own embedded servlet container的选择,或者您可以使用它with your own。
你可以,当然,用滚Netty的自己的Web服务器,并有一个有趣的write-up about this on the web。
如果你想要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"
)
希望这有助于!
我不知道为什么你是可疑使用Servlet容器为基础的 - 它并没有真正限制你的选择,在任何可能的方式,它只是处理基本的HTTP服务器的管道。因此,大多数Java服务框架使用servlet API作为基础基础,即使它们不公开该级别。
我觉得DropWizard是各种JVM休息服务,包括使用阿卡实际的提升者的绝佳选择。除了其良好性的明显原因(基于证明是“JVM最佳”的库的集合),我喜欢它,因为它有助于许多其他库/框架所忽略的领域:度量的生成,声明式验证;一直保持简单,明确和可以理解的事情。
为了完整起见,它似乎有一个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")
}
}
akka-http(人们又称它为喷雾2.0),这是基于阿卡流。
我loooove有人建立一个版本的Netty +未过滤的使用码头延续和/或者Servlet 3.0异步,所以我可以钩到阿卡是这样的。我非常好奇地想知道你的Akka整体体验,如果你愿意的话,可以私下说说。保持这个令人敬畏的工作,√ –
是的,这是时间允许的,我很乐意加入。我知道那里已经有一些基础工作,但很难了解还有多少工作要做。这是我第一次进入websockets(尽管过去我已经用彗星做了很多事情),但我对可能涉及的复杂问题犹豫不决。 –
呃,我的意思是说,我知道已经有一些基础工作,因为这项工作已经开始直接在Akka进行。不确定是否有人试图通过Jetty/Servlet 3.0 API在Unfiltered中实现此功能。我应该去研究......哦,我会给一些空闲时间。 –