带Scala的HTTP消息网关

带Scala的HTTP消息网关,scala,architecture,lift,playframework-2.0,finagle,Scala,Architecture,Lift,Playframework 2.0,Finagle,我正在开发一个网关,它将位于移动web应用程序和后端系统上的web服务之间。此网关的目的是保护web应用程序不受后端web服务api更改的影响,以引入并发性、转换消息、缓冲等 我提议的架构如下: 使用PhoneGap的独立于平台的移动web应用(完成) 网关是一种web服务,使用Scala进行业务逻辑,使用ZeroMQ进行消息传递(新) 后端是现有的web服务(现有) 网关完全负责消息的传递、翻译、聚合等,此时不需要保持状态或进行用户身份验证——它只是负责作为一个界面,知道如何与一方的移动应

我正在开发一个网关,它将位于移动web应用程序和后端系统上的web服务之间。此网关的目的是保护web应用程序不受后端web服务api更改的影响,以引入并发性、转换消息、缓冲等

我提议的架构如下:

  • 使用PhoneGap的独立于平台的移动web应用(完成)
  • 网关是一种web服务,使用Scala进行业务逻辑,使用ZeroMQ进行消息传递(新)
  • 后端是现有的web服务(现有)
网关完全负责消息的传递、翻译、聚合等,此时不需要保持状态或进行用户身份验证——它只是负责作为一个界面,知道如何与一方的移动应用程序和另一方的一个或多个服务进行通信

我强烈考虑使用Scala作为开发语言,因为它似乎非常适合这种类型的应用程序,但是对于这样的Scala服务,正确的体系结构是什么呢?我研究了Lift和Play等框架,还考虑了做一个简单的基于“java”的web服务,并使用Scala来实现我的业务逻辑。我坚信让事情尽可能简单。我对框架中可能永远不会使用的复杂设置和数千行死代码保持警惕。另一方面,将自己局限于“自己的角色”解决方案、创建大量工作以及维护可能是现有解决方案一部分的代码也是不理想的

需要考虑的一些事情:我是架构师和开发人员,但我对Scala的了解仅限于“Scala编程,第二版”的前半部分。而且,我的时间非常有限。不过,我还是想第一次就把这件事做好

我希望一些聪明的绅士或女士能为我提供关于这种解决方案的见解,也许还有一两个链接可以让我快速入门。我真的需要快速行动,但希望其他专业人士的经验或见解能帮助我避免途中的陷阱。对开发环境和工具的任何洞察也会有所帮助。我必须在Mac(公司规则)上开发,但将部署在Ubuntu服务器上。目前,我正在安装Eclipse或Idea作为IDE,以及构建scala编译器或sbt

更新


感谢下面所有可能的答案。我看了每一个建议,它们都有优点。现在的问题是赌对马。喷雾可能是解决这个问题最简单的方法,但我也发现了。这似乎是解决我问题的绝妙办法。我有点担心它是建在Netty而不是Akka之上的。有人认为这有什么问题吗。我希望我的解决方案尽可能保持纯Scala,但欺骗似乎是最成熟的。有什么想法吗?

值得一看,它为在JVM上编写并发、容错应用程序以及编写web服务提供了一个轻量级框架。此外,该项目看起来对您的目的很有用,在Akka之上提供HTTP服务器和客户端库(尽管与Akka本身不同,我没有使用过它,所以我自己也不能保证它的正确性)。

它可能值得一看,它为编写并发代码提供了一个轻量级框架,JVM上的容错应用程序,以及编写web服务。此外,该项目看起来对您的目的很有用,在Akka之上提供HTTP服务器和客户端库(尽管与Akka本身不同,我没有使用它,所以我自己也不能担保)。

正如mistertim所说,Akka是一个不错的选择。我有偏见,但我认为Lift和它也是一种很棒的方式(我已经用Lift为iPhone应用程序构建了几个API)。除此之外,我还认识一些非常满意的人。

正如mistertim所说,Akka是一个不错的选择。我有偏见,但我认为Lift和它也是一种很棒的方式(我已经用Lift为iPhone应用程序构建了几个API)。除此之外,我还认识一些非常满意的人。

如果您想保持它的轻量级,而不是一个成熟的web框架,那么unfilted是一个非常有趣的选择

老实说,文档可以使用更多细节,但要提供web服务,您只需编写:

object MyService extends unfiltered.filter.Plan {
    def intent = {
            case req @ GET(Path ("/myendpoint")& Params(params)) => 
                                 for { 
                                    param1<-params("param1")
                                    param2<-params("param2") 
                                 } yield ResponseString(yourMethod(param1,param2))
          }

override def main(args:Array[String]) = unfiltered.jetty.Http.anylocal.filter(MyService).run(); 
}
object MyService扩展unfilted.filter.Plan{
定义意图={
case-req@GET(Path(“/myendpoint”)&Params(Params))=>
对于{

param1Unfiltered是一个非常有趣的选项,如果您想保持它的轻量级,因为它不是一个成熟的web框架

老实说,文档可以使用更多细节,但要提供web服务,您只需编写:

object MyService extends unfiltered.filter.Plan {
    def intent = {
            case req @ GET(Path ("/myendpoint")& Params(params)) => 
                                 for { 
                                    param1<-params("param1")
                                    param2<-params("param2") 
                                 } yield ResponseString(yourMethod(param1,param2))
          }

override def main(args:Array[String]) = unfiltered.jetty.Http.anylocal.filter(MyService).run(); 
}
object MyService扩展unfilted.filter.Plan{
定义意图={
case-req@GET(Path(“/myendpoint”)&Params(Params))=>
对于{

param1如果您使用的web服务纯粹用于其他服务,那么基于Akka的服务(如Spray或Blueeyes)可能是您最好的选择。您可以使用Jerkson在case类之间进行JSON映射,并使用Akka Camel链接到ZeroMQ。

如果您使用的web服务纯粹用于其他服务,那么Akka ba像Spray或Blueeyes这样的sed服务可能是你最好的选择。你可以使用Jerkson在你的case类之间进行JSON映射,并使用Akka Camel链接到ZeroMQ。

如果你的系统是中间件并且能够快速完成任务,那么这将是最好的选择。Spray是在上面开发的。Akka具有ZeroMQ支持

在将来,如果您打算在中间件中添加一些其他类似web的模块,那么选择+Akka会更好,因为Lift还提供类似于Spray的web服务