注意: 不幸的是这个问题已经关闭,但是如果有其他人提出同样的问题,我正试图维护它.
我一直在寻找在Scala中开发服务的良好解决方案,该服务将位于移动设备和现有Web服务之间.
目前可行的选项清单是:
那里可能有更多的选择.如何决定使用哪一个?什么是一个好的Scala中间件选择的特征(借口双关语;-).一方面,我想去Akka,因为它是TypeSafe Scala堆栈的一部分,但另一方面,像Finagle这样的东西有一组丰富的库,使管道变得如此简单.喷雾看起来很好用,很简单.
任何建议,见解或经验将不胜感激.我相信那里的某些人必须有一些经验,他们不介意分享.
更新:
我很乐意重新开启这个问题.这个问题的一个很好的答案将有助于新的Scalateers避免相关的陷阱.
更新2:
这些是我自问这个问题后的经验:
Finagle - 我用Finagle进行了一个项目,它坚如磐石.
喷雾 - 在我的最新项目中,我正在使用Spray,我非常高兴.最新版本基于Akka 2构建,您可以使用Spray-can库直接运行它,无需Web服务器.Spray是一组库,而不是框架,非常模块化.在了解喷雾:在阿卡视频REST给出了一个很好的概述,而这个博客在Cakesolutions显示了一个非常好的发展方式和结构.
更新3:
生活移动得非常快.如果你不停下来,偶尔环顾四周,你可能会错过它.- Ferris Bueller
这些天选择变得更加简单.在我的拙见中,Spray赢得了这场战斗.它被整合到Akka中,成为下一个Akka HTTP.我现在一直在使用Spray进行多个项目,并且可以诚实地说它是我遇到的奇妙和最好的支持软件.
这不能回答最初的问题,但至少可以说明为什么Spray在大多数情况下似乎是最佳选择.它非常灵活,无阻塞且非常稳定.它有客户端和服务器端库以及一个很棒的测试工具包.另外,请查看这些统计信息以了解性能:Web框架基准测试
您如何在全球范围内排除传递依赖?我的项目取决于许多Twitter库或依赖于Twitter库的库.我不想slf4j-jdk14
在我的类路径中,无论如何(我使用logback作为slf4j绑定).
目前我这样做:
"com.twitter" %% "finagle-thriftmux" % "6.16.0" exclude("org.slf4j", "slf4j-jdk14")
Run Code Online (Sandbox Code Playgroud)
但每当有人添加另一个使用的依赖项时,slf4j-jdk14
我可能会将其恢复到类路径中.
我在练习中没有使用过Finagle和Akka,但我一直在阅读很多关于它们的内容.
Finagle是一个RPC系统而Akka是高度并发应用程序的工具包,为什么所有人都将它们作为两个可能无法一起使用的可能解决方案进行比较?我所做的所有搜索建议使用其中一个,没有人建议一起使用它们.
例如,Finagle有一种通过thrift和IDL定义端点的非常有趣的方法.使用此IDL,我们可以定义自定义端点,并通过scooge或任何代码生成工具,可以毫不费力地使用服务.此外,还会创建连接到此服务的客户端,并自动解决许多常见的客户端问题(重新连接,超时,重试,负载平衡,连接池,...).
相反,Akka解决了许多并发问题,并且在没有手动控制线程的所有复杂性的情况下,它可以非常好地扩展.
总结一下,为什么不一起使用它们?:
你怎么看?
注意:假设映射Futures和Promises的问题已得到解决,以及FuturePools和ExecutionContexts之间的不匹配.模式是将Finagle转换为使用Futures的scala方式.
我知道Scala Future更好的原因很多.是否有任何理由使用Twitter Future?除了Finagle使用它之外.
我正在努力使用Twitter的Finagle库来实现对SOAP服务器的HTTP请求.
下面的代码成功地执行了第一次测试(使用java.net.URL),但是我在第二次测试时遇到了困难(使用Finagle客户端).我究竟做错了什么?
此外,我一直被拖入和命令式的写作风格.如果你能帮助我让Finagle更像'scala',我将非常感激.
开始:
import java.net.InetSocketAddress
import scala.xml.{Elem, XML}
import org.jboss.netty.buffer.ChannelBuffers
import org.jboss.netty.util.CharsetUtil.UTF_8
import com.twitter.finagle.Service;
import com.twitter.finagle.builder.ClientBuilder;
import com.twitter.finagle.http.Http;
import org.jboss.netty.handler.codec.http._
class SoapClient {
private def error(msg: String) = {
println("SoapClient error: " + msg)
}
def wrap(xml: Elem): String = {
val buf = new StringBuilder
buf.append("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=
\"no\"?>\n")
buf.append("<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://
schemas.xmlsoap.org/soap/envelope/\">\n")
buf.append("<SOAP-ENV:Body>\n")
buf.append(xml.toString)
buf.append("\n</SOAP-ENV:Body>\n")
buf.append("</SOAP-ENV:Envelope>\n")
buf.toString
}
def sendWithJavaNetURL(host: String, req: Elem): Option[Elem] = {
val url = new java.net.URL(host)
val outs = wrap(req).getBytes
val conn …
Run Code Online (Sandbox Code Playgroud) 在Finagle中使用的Netty使用"处理程序"管道来顺序处理和输出绑定数据.Netty示例和包含的库显示了用于诸如身份验证,协议编解码器和服务的实际业务逻辑之类的各种处理程序.
Finagle似乎采用了处理程序的概念,而是直接为API用户提供编解码器,过滤器和服务.虽然这些签名具有不同的签名,但Finagle的新用户仍然需要决定使用哪个来实现其整个服务器的每个部分.他们现在需要决定哪个部分应该是编解码器的一部分,而不是任何过滤器,而不是仅仅链接到链的末端的单一服务.总之,虽然Finagle是一个比Netty更高级别的库,并且应该使构建服务的任务更容易,但API用户可能有更多的选择.
将处理流的特定部分放入编解码器而不是过滤器与单一服务的关键决策点和优缺点是什么?如果管道有可能进一步扩展,那么服务逻辑是否应该放入过滤器中,而在管道末端使用"noop"服务?鉴于订购过滤器(作为管道中的处理程序)的灵活性,与一端的单一编解码器和另一端的服务相比,为什么"一切"都不应该是过滤器?
在webservices的上下文中,我已经看到使用术语"TCP连接流失".特别是Twitter finagle有办法避免它发生.怎么会发生?这是什么意思?
我使用Finagle作为Web服务器,我想从我的应用程序逻辑返回Scala-Futures.如何将scala.concurrent.Future转换为com.twitter.util.Future,当然是以非阻塞的方式?
这是将请求参数绑定到路由器的代码.
val testReader: Endpoint[Test] = Endpoint.derive[Test].fromParams
val test: Endpoint[String] = post("test" ? testReader) { t : Test => {
Created("OK")
}}
Run Code Online (Sandbox Code Playgroud)
我正在使用这种方法fromParams
.此方法可以非常酷的方式绑定请求参数.但是,我不知道哪种类似的方式可以绑定雀科中的请求体
提前谢谢了
RPC系统(如Twitter的Finagle)和企业服务总线(如Mule)之间有什么区别?他们每个人都善于解决什么样的问题?