Scala 对于具有外部数据库和RESTfulWebGUI和服务的系统,什么是合适的设计?

Scala 对于具有外部数据库和RESTfulWebGUI和服务的系统,什么是合适的设计?,scala,database-design,rest,architecture,playframework,Scala,Database Design,Rest,Architecture,Playframework,基本上,我开始这样设计我的项目: 玩!web gui框架(使用RESTful服务) 用于RESTful服务的Spray框架,连接到数据库,处理传入数据,为web gui提供数据 数据库。只有服务有权访问它 现在我想知道,这是否真的是最好的设计。 事实上是玩!我可以轻松地同时托管web gui和服务。 这将更容易在简单的情况下进行测试和部署。 在需要高性能的复杂情况下,我仍然可以运行一个纯粹用于gui的实例,然后运行几个实例作为服务(即使它们中的每一个都可以提供完整的功能)。 另一方面,我不确定它

基本上,我开始这样设计我的项目:

  • 玩!web gui框架(使用RESTful服务)
  • 用于RESTful服务的Spray框架,连接到数据库,处理传入数据,为web gui提供数据
  • 数据库。只有服务有权访问它
  • 现在我想知道,这是否真的是最好的设计。 事实上是玩!我可以轻松地同时托管web gui和服务。 这将更容易在简单的情况下进行测试和部署。 在需要高性能的复杂情况下,我仍然可以运行一个纯粹用于gui的实例,然后运行几个实例作为服务(即使它们中的每一个都可以提供完整的功能)。
    另一方面,我不确定它是否会对性能造成太大的影响(服务将处理大量数据,而不仅仅是来自web gui)。还有,这不是混合了我应该分开的东西吗

    若我决定将它们分开,我是否应该只允许通过RESTful服务连接到数据库?如何解决服务和web gui试图使用不同版本数据库的问题?在这种情况下,我应该使用版本化的REST协议吗

    -----------------编辑-----------------

    我当前的系统结构如下:

    但我想知道通过在游戏中加入RESTful服务来简化它是否有意义!直接使用gui web服务器

    -----------------编辑2-----------------

    这张图表说明了我的主要问题。 换言之,明确地说:连接我的服务和web gui并共享模型是否不好?为什么? 因为也没有什么好处:

    • 所需的服务和gui之间的配置更少
    • 无需数据传输
    • 不需要创建单独的访问层(这可能是不利的,但在什么情况下?)
    • gui/服务模型之间没有不一致(例如,由于不同的协议版本)
    • 易于测试和部署
    • 无代码复制(通常我们需要复制模型的大部分)
    也就是说,这是一张图表:

    为什么需要RESTful服务来连接数据库?最好玩!应用程序直接从控制器访问数据库。将通过服务层访问模型视为反模式。如果您打算与其他(非播放!)应用程序或您无法控制的外部系统共享数据,那么服务层可能会很方便,但在其他方面,最好保持简单。但是,您也可以从游戏中简单地公开RESTful接口!应用程序本身用于其他系统


    玩!是关于让事情保持简单,避免过去困扰Java开发的过度设计的废话。

    好吧,我认为这里没有客观上正确或错误的答案,但我将提供我的观点:我认为您提供的图表完全正确。RESTful服务是所有客户端(包括web前端)的单一访问点,我认为这是应该的

    没有说任何关于游戏的事!,Spray或任何其他web框架(或者,就此而言,任何数据库服务器、HTML模板库、JSON解析器等),显而易见的经验法则是通过防止实现细节泄漏到接口中来保持严格的关注点分离。现在,你提出了两个问题:

    • 性能:将对象编组和反编组为JSON表示并通过HTTP提供服务的过程非常快速(例如,与JAXB相比),并且得到Scala库和web框架的良好支持。当您不可避免地在特定组件中发现性能瓶颈时,您可以单独处理这些瓶颈

    • 测试和部署:事实上!框架避免使用servlet,这会使事情变得有点复杂。通常情况下,我会建议您在测试/登台时,只需将前端内容的战争和web服务的战争放在同一个servlet容器中并排进行。例如,我在过去使用过。玩起来可不那么简单!,但我发现的一个模块(从未使用过)是。。。重点是,做任何你需要做的事情来保持层的解耦,然后把这些部分粘在一起,以便按照你的意愿进行测试


    希望这是有用的…

    好吧,经过几个小时的思考,我想我找到了能满足我需求的解决方案。我希望实现的目标是:

  • Web GUI无法直接调用数据库;它需要使用适当的模型,这反过来又会使用一些对象存储库
  • 必须能够以最少的配置将整个内容作为一个包进行测试和部署(至少在开发阶段是这样,然后应该能够轻松地切换到更灵活的解决方案)
  • 不应存在代码重复(即服务和web gui模型中的相同代码)
  • 如果一种方法出现错误,我需要能够切换到另一种方法
  • 我之前忘记说的是,我的服务将使用一些嵌入式缓存来聚合和处理数据,然后使用更大的数据块向数据库提交数据。它也出现在图表上

    我的班级结构如下所示:

    | 
    |- models
        |- IElementsRepository.scala
        |- ElementsRepositoryJSON.scala
        |- ElementsRepositoryDB.scala
        |- Element.scala
        |- Service
             |- Element.scala
        |- Web
             |- Element.scala
    |- controlers
        |- Element.scala
    |- views
        |- Element
             |- index.scala.html
    
    因此,它与普通的MVC web应用程序类似,只是服务和web gui有单独的模型类继承自主应用程序。
    在Element.scala中,我将使用DI(可能使用GUI)注入IElementsRepository对象。
    IElementsRepository有两个具体实现:

  • ElementsRepositoryJSON允许通过JSON从服务检索数据
  • ElementsRepositoryDB允许从loca检索数据