2012-03-06 63 views
6

随着Akka 2的发布,Akka HTTP modules已被替换为使用Play2-mini的选项,其中Play2-mini看起来像Play2减去模型视图控制器。混合Akka 2,Play2-mini框架和HTTP

该行在执行REST服务和创建HTTP客户端之间灰显。例如,假设我想在一个服务中创建一个Web服务(不必是REST)和一个HTTP客户端,即HTTP代理。我使用Akka还是Play2-mini?

我已经在Finagle中创建了这样的服务,并且希望用Akka和/或Play2-mini重做练习来了解它的比较。

在高层次,架构是什么样子的?这些产品如何融合在一起?

+1

您可能会发现[喷雾](https://github.com/spray/spray)有趣。它建立在Akka(现在1.3,但迁移到Akka 2在路线图中)之上,并且具有服务器和客户端。我希望我不会在这里顽强,只是认为喷雾值得一些关注。 – elbowich 2012-03-06 17:57:17

+0

@elbowich谢谢。如果你知道任何这样的喷雾作为代理或网关的例子,我很想看看它。我试图围绕创建任何基于Scala的解决方案所需的一切构建我的技能集。有这么多的选择,在某些时候必须选择一个并坚持下去。我只是不知道哪些......尚;-)我认为TypeSafe堆栈(Scala,Akka,Play)有很大的希望。这只是有点混淆 – Jack 2012-03-07 07:43:43

+1

在这里你去:https://gist.github.com/2008342。你需要喷雾服务器,喷雾客户端和喷雾罐来运行它。 – elbowich 2012-03-09 20:10:37

回答

3

我会说喷雾是你最好的选择。但是,它不能用于Java。我们正在使用play2-mini框架,但有一些问题。目前还不清楚如何将它与Java连接到Akka,而Spray则完全围绕这个概念构建 - 当请求进入时,您会向演员请求消息。

一起玩,你必须推出自己的连接: 即,在静态(角色眼)请求方法里面:

Timeout timeout = new Timeout(Duration.parse("20 seconds")); 
Future<Object> future = Patterns.ask(myActor, new ClientMessage(null), timeout); 

Promise<Object> sdf = Akka.asPromise(future); 
Promise<Result> r2 = sdf.map(new Function<Object, Result>() { 

@Override 
public Result apply(Object a) throws Throwable { 
    val wsrm = (MyMessage)a; 
    return ok((wsrm).val); // String value from message object 
} 

}); 
Result test2 = async(r2); 
return test2; 

效果很好。并且Play在系统中也使用AKKA事件,因此您可以使用它的actor context来创建您的演员。

不幸的是,目前Play2-mini并不是最小的,它取决于整个Play框架,这也会导致更多的问题。显然,他们正在制作一个裸机版本,AFAIK将涉及将Play分解成模块,我不会很快看到这种情况。

IMO,喷雾是一个更好的选择。这是fluentness适合更好地AKKA,但unfort我要在这里使用Java,所以我不能用它: https://github.com/spray/spray/issues/96

至于你的HTTP客户端/服务的问题 - AKKA没有任何HTTP功能本身,所以你需要与HTTP服务器接口,在这种情况下播放。您可以使用Async请求来保持连接的活动状态,而您的actor系统将消息异步传递给您的http客户端actor,以异步获取http响应,将消息发送回web服务层,并返回播放状态。

希望能澄清一些混淆。我也很困惑,直到几天的研究;)如果还有什么我可以帮忙澄清的,请让我知道 - 为了社区的利益! ;)

喷雾罐有一个异步HTTP客户端,但对于我们卡在爪哇岛的人,还有:https://github.com/sonatype/async-http-client,你可以使用AKKA。