1

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

我提出的架构如下:

  • 使用 PhoneGap 的平台独立移动 Web 应用程序(完成)
  • Gateway 是一个使用 Scala 进行业务逻辑和 ZeroMQ 进行消息传递的 Web 服务(新)
  • 后端是现有的 Web 服务(现有)

网关纯粹负责消息的传递、翻译、聚合等,此时不需要保持状态或进行用户身份验证——它只负责作​​为一个单一的接口,一方面知道如何与移动应用程序通信以及另一侧的一项或多项服务。

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

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

我希望一些聪明的绅士或淑女能给我提供这种类型的解决方案的见解,也许一两个链接可以快速开始。我真的需要快速前进,但希望其他专业人士的经验或见解可以帮助我避免一路走来的陷阱。对开发环境和工具的任何见解也会有所帮助。我必须在 Mac 上开发(公司规则),但将部署在 Ubuntu 服务器上。我目前在安装 Eclipse 或 Idea 作为 IDE 和用于构建的 scala 编译器或 sbt 之间进行权衡。

更新

感谢以下所有可能的答案。我查看了每一个建议,它们都有优点。现在的问题是押在正确的马上。Spray 可能是解决问题的最简单方法,但我也找到了 Finagle。它似乎是我问题的绝佳解决方案。我有点担心它是建立在 Netty 而不是 Akka 之上的。有没有人看到任何问题。我希望让我的解决方案尽可能纯粹地使用 Scala,但 Finagle 似乎是其中最成熟的。有任何想法吗?

4

5 回答 5

3

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

于 2012-01-04T10:01:46.557 回答
2

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

于 2012-01-04T10:16:08.117 回答
2

如果您使用的是纯粹用于其他服务的 Web 服务,那么像 Spray 或 Blueeyes 这样的基于 Akka 的服务可能是您最好的选择。您可以使用 Jerkson 执行与案例类之间的 JSON 映射,并使用 Akka-Camel 链接到 ZeroMQ。

于 2012-01-05T01:58:24.010 回答
0

如果您想保持轻量级,未过滤是非常有趣的选择,因为它不是一个成熟的 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(); 
}

如果您不想使用框架并且不想将 java/java 注释与 Scala 混合使用,则非常有用(否则,您有通常的 java 解决方案)

不过,如果您认为演员适合您的问题,我建议您研究一下 Akka

于 2012-01-04T17:10:12.577 回答
0

如果您的系统是中间件并且可以快速完成工作,那么Spray将是最好的。Spray 是在Akka之上开发的。Akka 有 ZeroMQ 支持。

将来如果你要在中间件中添加一些其他类似 web 的模块,那么选择Lift + Akka 会更好,因为 Lift 还提供了类似 Web 服务的 Spray + 它可以很容易地开始开发其他模块。

您可以选择 SBT 作为您的构建,有一些项目模板、模板生成工具可用,因此您可以非常快速地获得项目构建。

根据我的经验,SBT + InteliJ Idea 效果很好,看看sbt-idea 插件

喷涂项目模板
电梯项目模板生成器

于 2012-01-08T06:51:52.603 回答