微服务资源管理

时间:2019-10-02 16:57:14

标签: java spring architecture microservices

假设我们有一组microsericervice(每个服务都有其自己的DB)。我们的客户是其他公司。每个客户都希望拥有自己的数据库。

在这种情况下,每个服务都有许多数据库。是否存在管理资源的最佳实践?

我认为所有服务都可以是无状态的。而且任何公司(我们的客户)都必须具有自己的配置并带有资源描述。示例:数据库,文件存储等

调用任何服务都必须激活资源上下文。而且所有下一个服务都必须使用此上下文。

示例。 有人在他的浏览器网站中打开:clientCompany.com。 我们的第一个服务(例如AuthenticationService)检查此配置,并在“主机”部分中找到主机名“ clientCompany.com”。 然后,它激活此上下文,并且整个服务链都使用该上下文中的存储,DB和其他资源。

资源配置:

[  
   {  
      "contextName":"ClientCompanyName",
      "hosts":[  
         "clientCompany.com",
         "client-company.com"
      ],
      "storage":{  
         "path":"/mnt/ClientCompanyName"
      },
      .....
   },
   .....
]

这是一个好习惯吗? 我对使用Java和Spring创建这样的系统的可能性感兴趣吗? 请共享指向实现此任务的资源和工具的链接。 并告诉您您对这种实现有何看法?

1 个答案:

答案 0 :(得分:2)

让您的TenantID不在“公共”视图中很重要,因此我们将Tenant分配集成到了我们的授权过程中。

这是对我们有用的方法:

  • TenantService管理所有可用租户的列表,并在添加/删除/更改它们时生成集成事件等。每个Tenant都具有Id GUID以及Abbreviation nvarchar(5)-稍后再介绍
  • 我们在应用程序和身份提供商(IdP)之间使用OIDC,然后为所有微服务使用Bearer令牌
  • 将新用户添加到系统时,必须至少指定一个租户,并将其作为该用户的角色推送到我们的IdP中。
  • 我们的角色采用tenant_abbreviation.role_name格式,以便应用程序可以读取角色并知道他们适用于哪些租户。在我们的情况下,一个用户可能可以访问多个具有不同角色的租户。
  • 登录时,应用程序请求并接收包含用户声明的JWT Access Token-需要此JWT才能访问所有其他服务。因此,当微服务获取JWT(经过验证)时,它就会知道UserId以及每个租户可以访问的任何/所有权限。
  • 当批准的应用程序与JWT一起调用微服务时,它会在标头中传递当前上下文TenantId,因此我们可以将Claims与当前Tenant进行比较-如果它们不匹配,则是一个问题在应用程序中

系统的缺点是要管理很多角色/权限,但是我们已经实现了自动化,并且至少在我们的案例中(我们使用Auth0.com),即使有成千上万的租户,我们的IdP仍然可以处理它没问题。即使我们的工具放慢了一点速度,每个租户仍然会表现出色。

好处是,它非常安全,只需很少的工具即可处理IdP上的工作负载,因此易于管理和跟踪,并且每个服务都可以获得良好的详细授权/上下文信息。它还提供了很大的灵活性,可以在租户之间混合/匹配用户(如有必要)和/或为每个租户分配单独的权限。