主应用程序的软件集成和共享数据库

时间:2016-08-22 16:55:32

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

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

对当前实施的系统进行最少的更改,可以用来实现此任务的最佳方法是什么?

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

2 个答案:

答案 0 :(得分:1)

对于数据库:

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

在我看来,数据库连接+生命周期初始化本身可能是一个巨大的痛苦,并将把你的注意力从解决实际业务案例上移除。如果可能的话,我建议使用单个DB作为应用程序。大多数数据库允许您使用每表文件,甚至可以跨多台计算机/服务器分发表文件(这是一种优化)。

代码统一

为了将代码库统一为一个(我假设您想要统一代码库),您可以使每个应用程序成为一个单独的模块,每个模块都有自己的资源路径。例如,如果您有新的代码库中的Service1,Service2和Service3,则所有Service1资源将托管在/ service1路径内,Service2资源内部/ service2路径中等等。要做到这一点,您只需要修改资源文件中的Path说明符(通常是@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步继续。
  8. 注意:在网络上发送之前,始终在客户端上对您的凭据进行哈希处理。在服务器端存储只有散列凭据,没有原始文本密码。此外,如果安全性至关重要,那么也要考虑腌制您的凭证。

答案 1 :(得分:0)

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