对于数据库:
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 + 服务器端会话存储的身份验证。您还需要密码存储。
登录流程如下:
- 用户打开/登录页面
- 用户输入用户名+密码(凭据)
- 服务器收到使用凭据登录的请求。服务器根据自己的凭据/密码存储检查凭据。
- 如果成功,则服务器将响应发送回客户端以设置具有一定到期时间的 cookie。如果失败则发送 Http Unauthorized 响应。
- 服务器还将 cookie 存储在其会话存储中(cookie 将按客户端存储,user1+chrome=1 cookie,user1+firefox=另一个 cookie,user2+any=另一组 cookie)
- 在进一步的请求中,客户端发送 cookie,服务器(servlet 过滤器)根据其会话存储进行验证。如果验证通过,则服务器允许 api 调用工作。
- 如果 cookie 过期或请求中没有 cookie,则将用户重定向到 /login。从第 1 步继续。
注意:在通过网络发送之前,始终在客户端对您的凭据进行哈希处理。在服务器端仅存储散列凭据,没有原始文本密码。此外,如果安全性是最重要的,那么还要考虑对您的凭据进行加盐。