JavaFX桌面应用程序与远程服务器通信的最佳实践

JavaFX桌面应用程序与远程服务器通信的最佳实践,java,javafx,desktop-application,Java,Javafx,Desktop Application,我需要关于在JavaFX中设计与远程服务器通信的桌面应用程序的最佳实践的建议。由于我在开发web应用程序方面有很多经验,所以我需要知道常见的问题,并且需要知道在开发桌面应用程序时应该考虑这些问题 问题描述和要求: 这是一个应用程序,供员工根据其角色查看数据、执行报告和执行其他多项操作 此应用程序将为10名以上的员工安装,以后可以增加 每个员工都应该能够登录并使用该应用程序(多个员工可以同时使用该应用程序) 每位员工对数据所做的任何修改都将记录下来,以备将来跟踪 应用程序将根据每个用户的角色显示

我需要关于在JavaFX中设计与远程服务器通信的桌面应用程序的最佳实践的建议。由于我在开发web应用程序方面有很多经验,所以我需要知道常见的问题,并且需要知道在开发桌面应用程序时应该考虑这些问题

问题描述和要求: 这是一个应用程序,供员工根据其角色查看数据、执行报告和执行其他多项操作

  • 此应用程序将为10名以上的员工安装,以后可以增加
  • 每个员工都应该能够登录并使用该应用程序(多个员工可以同时使用该应用程序)
  • 每位员工对数据所做的任何修改都将记录下来,以备将来跟踪
  • 应用程序将根据每个用户的角色显示不同的内容
  • 由于该应用程序将安装在许多计算机上,员工可以从不同的计算机登录到该应用程序,并通过其登录进行识别
建议的解决办法: 以下情况是否被视为良好做法:

  • 我使用Mysql作为后端数据库
  • 我创建了一个连接到数据库的中间服务器 允许客户端应用程序连接到服务器并进行交换 员工使用的每个应用程序实例都应 直接建立到托管在另一个数据库上的数据库的连接 同一本地网络上的服务器

我认为完全需要创建一个中间服务器。如果您不确切知道将使用该应用程序的用户数量,如果它突然从10个用户扩展到100个,则会杀死您的数据库。此外,数据库连接对延迟非常敏感,并且交换了许多消息,因此后端服务器离数据库越近,它的性能就越好。(从MySQL数据库直接通过3G网络访问的经验来看,必须转到REST才能可靠地工作)

据我所知,您已经熟悉Java,因此我选择以下体系结构:

  • 数据库:(MySQL、PGSQL、MSSQL…)
  • 后端服务器:Spring引导可能是一个不错的选择

    • JPA(Eclipselink或Hibernate)存储库
    • 在服务级别实现业务逻辑
    • REST接口
    • 处理身份验证和令牌
  • 前端:JavaFX

    • 与终端的HTTP通信。JavaFX中没有实现任何业务逻辑。仅与后端接口
该体系结构将允许在中心位置更新业务逻辑,而无需关心最终用户拥有哪个版本的应用程序。另外,我建议对API进行版本设置(例如http:///api/v1/...)避免不兼容


当然,您可以尝试使用
springdatarestwebmvc
通过REST直接公开数据库模型。如果您的数据库已经正确设计,那么在Netbeans中,只需点击几下,您就可以提取模型,并准备好一个应用程序,通过REST公开您的模型;然后,需要在客户机中实现业务逻辑。老实说,如果将来需要维护项目,不要使用此解决方案并在服务器中实现逻辑。

应用程序的体系结构需要考虑许多组件,并且可以通过多种方式进行设计,因此,这个问题没有明确的答案,但在设计一个问题时,应该考虑一些要点。在开发桌面应用程序时,应该考虑它与Web应用程序的关键区别,并尝试解决它们带来的挑战。

  • 网络(或Internet)连接:桌面应用程序可能不会一直有活动的网络连接,因此除非您需要 当活动连接不可用时,程序会使每个事务失败 应该有本地嵌入式数据库(如h2),然后同步 当活动连接可用时(不要连接到远程数据库),远程服务器中web应用程序的数据 直接因为服务器端验证、负载平衡等等!)

    桌面应用程序本质上是独立的,因此如果不能 没有网络连接的功能那么它有什么意义呢 作为一个桌面应用程序

  • 同步:上一点建议您使用本地 数据库并将其与远程服务器应用程序同步。记得吗 同步应该是双向的:A)将本地数据发送到服务器 B) 从服务器接收数据并将其保存在本地数据库中。这 如果数据模型复杂且充满依赖性,则可能很棘手 因为依赖实体需要同步在一起,所以 增加了在连接故障或其他事件中执行同步操作的风险 功率损耗。还应考虑数据模型的更改。因此,试着:

    • 将数据模型设计为尽可能最小
    • 避免实体之间的依赖关系
    • 避免在数据模型中建模跨用户交互,因为它打破了这样一种假设,即应用程序的设计目的是供用户使用,而不考虑其他用户(这在桌面应用程序中经常出现)
    • 为同步设计一个协议,该协议考虑数据模型的更改,可能需要在同步开始之前更新程序
  • 更新:桌面应用程序通常需要定期更新。你有 在设计架构的所有步骤中都要牢记这一点, 特别是在设计高级模块时 尽可能独立,以便可以独立更新。您还需要设计一个更新方案来处理此需求

  • 多线程:JavaFx和大多数桌面框架