【问题标题】:Software integration and shared database for a master application主应用程序的软件集成和共享数据库
【发布时间】:2016-12-29 07:42:57
【问题描述】:

我有 4 个独立的软件系统,分别使用 java EE、Spring、hibernate 等实现。我想将它们全部集成并构建一个主应用程序。我也想要一次登录。现在他们有自己的数据库,我也想有一个共享的单一数据库,因为他们有一些共同的信息。

在对当前实施的系统进行最小更改的情况下,可用于完成此任务的最佳方法是什么?

我是否必须在新数据库之上实现一个新的服务层(例如:使用 JAX-RS)或其他东西来访问新的共享数据库并为所有数据库访问服务提供业务逻辑到上述软件系统?

【问题讨论】:

    标签: java database jakarta-ee architecture restful-architecture


    【解决方案1】:

    对于数据库:

    Spring/hibernate 应用默认支持连接到一个数据库。如果您想连接到多个数据库(自己的数据库 + 公共数据库),那么您必须自己处理数据库对象(Jdbc 连接 + 池 + 生命周期/事务管理 + 其他数据库初始化)。

    在我看来,数据库连接+生命周期初始化自己可能是一个巨大的痛苦,并且会分散您解决实际业务案例的注意力。如果可能,我建议为应用程序使用单个数据库。大多数数据库允许您使用每表文件,甚至可以将表文件分布在多台机器/服务器上(这是一种优化)。

    代码统一

    为了将代码库统一为一个(我假设您想要统一代码库),您可以使每个应用程序成为一个单独的模块,每个模块都有自己的资源路径。例如,如果您有 Service1、Service2 和 Service3,那么在您的新代码库中,您的所有 Service1 资源都将托管在 /service1 路径内,Service2 资源将托管在 /service2 路径内,依此类推。为此,您只需修改资源文件中的路径说明符(通常是@Path 注释)。

    问:自从路径改变后,如何更改对这些服务的所有 api 调用?

    答:现在,如果您已经从配置文件中获取了这些服务的 api 调用路径,那就太好了,只需更改配置文件中的路径即可。否则,您实际上可以开始使用这种配置方法,并指定如下内容:

    在你的配置文件中:

    api-paths: {
        service1: /service1/
        service2: /service2/
        ...
    } 
    

    配置统一

    您可以将所有配置放在大多数框架支持的单个文件中。另一种选择是为每个服务放置单独的配置文件。对于第二个选项,请查看TypeSafe Config Lib。它允许您使用多个带有覆盖的配置文件。

    注意:如果不需要统一代码库,请使用像 nginx 这样的反向代理。这就是像 google/fb 这样的大型网站的运作方式。您会看到一个域,它将所有微服务隐藏在反向代理层和 CDN 后面。

    用于验证/登录

    您可以在 servlet 过滤器中执行此操作。在您的配置中有一个排除列表,这些排除的路径无需登录即可访问。例如,/login 路径必须在排除列表中,以便人们无需先登录即可访问登录页面。现在您的 servlet 过滤器可以实现一个简单的基于客户端 cookie + 服务器端会话存储的身份验证。您还需要密码存储。

    登录流程如下:

    1. 用户打开/登录页面
    2. 用户输入用户名+密码(凭据)
    3. 服务器收到使用凭据登录的请求。服务器根据自己的凭据/密码存储检查凭据。
    4. 如果成功,则服务器将响应发送回客户端以设置具有一定到期时间的 cookie。如果失败则发送 Http Unauthorized 响应。
    5. 服务器还将 cookie 存储在其会话存储中(cookie 将按客户端存储,user1+chrome=1 cookie,user1+firefox=另一个 cookie,user2+any=另一组 cookie)
    6. 在进一步的请求中,客户端发送 cookie,服务器(servlet 过滤器)根据其会话存储进行验证。如果验证通过,则服务器允许 api 调用工作。
    7. 如果 cookie 过期或请求中没有 cookie,则将用户重定向到 /login。从第 1 步继续。

    注意:在通过网络发送之前,始终在客户端对您的凭据进行哈希处理。在服务器端仅存储散列凭据,没有原始文本密码。此外,如果安全性是最重要的,那么还要考虑对您的凭据进行加盐。

    【讨论】:

    • 非常感谢您的帮助。我对如何解决我的问题有了一个好主意。如果您能对模块进行一些解释,那就太好了。您的意思是与我们在 Maven 中使用的模块相同的模块吗?另外,如果我们使用没有代码统一的反向代理,我可以为所有软件使用一个数据库吗?
    • @heshan :是的,模块是指 maven 模块(如果你喜欢 gradle,也可以使用 gradle 模块)。即使您的应用程序/服务单独运行,也可以使用单个数据库。所以是的,反向代理+单个数据库也可以。像 nodejs/nginx 这样负责登录的 IMO 反向代理将最快实现。当您说他们的数据库中有共同信息时,您是指共同表吗?还是逻辑上通用信息但没有通用表?
    • 我指的是公用表。例如,员工的 ID 详细信息。我必须为所有应用程序维护一个通用的单个员工表。我认为如果我为每个应用程序使用单独的数据库,可能会出现一些一致性问题。
    【解决方案2】:

    我认为一个很好的方法是查看 netflix 技术堆栈。有一个名为 zuul 的项目,它充当反向代理。此代理可以将传入请求路由到您的基础服务。这个代理可以是你的服务的前门,每个请求只有经过身份验证才能通过。 希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2019-03-29
      • 2014-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多