假设我们有一组microsericervice(每个服务都有其自己的DB)。我们的客户是其他公司。每个客户都希望拥有自己的数据库。
在这种情况下,每个服务都有许多数据库。是否存在管理资源的最佳实践?
我认为所有服务都可以是无状态的。而且任何公司(我们的客户)都必须具有自己的配置并带有资源描述。示例:数据库,文件存储等
调用任何服务都必须激活资源上下文。而且所有下一个服务都必须使用此上下文。
示例。 有人在他的浏览器网站中打开:clientCompany.com。 我们的第一个服务(例如AuthenticationService)检查此配置,并在“主机”部分中找到主机名“ clientCompany.com”。 然后,它激活此上下文,并且整个服务链都使用该上下文中的存储,DB和其他资源。
资源配置:
[
{
"contextName":"ClientCompanyName",
"hosts":[
"clientCompany.com",
"client-company.com"
],
"storage":{
"path":"/mnt/ClientCompanyName"
},
.....
},
.....
]
这是一个好习惯吗? 我对使用Java和Spring创建这样的系统的可能性感兴趣吗? 请共享指向实现此任务的资源和工具的链接。 并告诉您您对这种实现有何看法?
答案 0 :(得分:2)
让您的TenantID不在“公共”视图中很重要,因此我们将Tenant分配集成到了我们的授权过程中。
这是对我们有用的方法:
TenantService
管理所有可用租户的列表,并在添加/删除/更改它们时生成集成事件等。每个Tenant
都具有Id
GUID
以及Abbreviation
nvarchar(5)
-稍后再介绍tenant_abbreviation.role_name
格式,以便应用程序可以读取角色并知道他们适用于哪些租户。在我们的情况下,一个用户可能可以访问多个具有不同角色的租户。JWT Access Token
-需要此JWT才能访问所有其他服务。因此,当微服务获取JWT(经过验证)时,它就会知道UserId以及每个租户可以访问的任何/所有权限。TenantId
,因此我们可以将Claims与当前Tenant进行比较-如果它们不匹配,则是一个问题在应用程序中系统的缺点是要管理很多角色/权限,但是我们已经实现了自动化,并且至少在我们的案例中(我们使用Auth0.com),即使有成千上万的租户,我们的IdP仍然可以处理它没问题。即使我们的工具放慢了一点速度,每个租户仍然会表现出色。
好处是,它非常安全,只需很少的工具即可处理IdP上的工作负载,因此易于管理和跟踪,并且每个服务都可以获得良好的详细授权/上下文信息。它还提供了很大的灵活性,可以在租户之间混合/匹配用户(如有必要)和/或为每个租户分配单独的权限。