5

我实际上正在研究微服务,但我遇到了一个问题。

语境

我正在开发两个微服务:

  • 用户管理,基于 Spring,带有 MySQL 数据库
  • 规划管理,基于 ASP.NET 的 SQL Server 数据库。此服务的唯一访问点是列出一些 RESTFUL 端点的 API,例如/planning/{day}/{userId} or /planning/{startDate}/{endDate}/{idUser}
  • 计费管理,基于 MongoDB 的 Node.Js。

问题

  1. 我该怎么做才能只允许通过用户服务访问计划信息而不耦合这两个服务?知道以后可以从其他地方访问计划服务,但不是现在。

  2. 如何从 MySQL 数据库中的用户对应的计费服务中访问计费信息?我知道微服务没有耦合,这一点让我很生气,因为它必须以某种方式耦合,不是吗?就像idUser在计费中引用?否则,我怎么知道我应该从我的 API 中公开哪些账单?更准确地说,微服务如何在它们之间进行通信,而不是耦合?

  3. 如何在不将身份验证请求从其他服务复制到身份验证服务的情况下创建身份验证?

4

2 回答 2

7

这里要认识到的重要一点是,在实现用户身份验证、用户授权和用户会话管理解决方案时,微服务架构的解决方案与任何其他形式的分布式系统架构的解决方案在概念上没有显着差异。

从概念上讲,该解决方案将是Kerberos 协议的实现,其中传递“票证”(或今天更常见的“令牌”)的概念以建立用户身份。

因此,在您的情况下,您的用户管理服务将充当您的后端身份验证和授权服务器,所有其他服务都需要注意这一点。您的用户管理服务将负责颁发和验证用户令牌以建立您的用户的身份和角色。

我该怎么做才能只允许通过用户服务访问计划信息而不耦合这两个服务?

当用户尝试访问您的 .Net 服务时,您的服务将不得不依赖您的用户管理服务来建立用户的身份。换句话说,您的.Net 服务需要知道您的用户管理服务在哪里(即它的URL)。您可以利用etcdnat等工具将用户管理服务的位置传播到生态系统的其他部分,而无需将微服务与其耦合。

如何从 Mysql 数据库中的用户对应的计费服务中访问计费信息?

最简单的解决方案是将(单个?)键(比如用户 ID)作为查询参数传入计费服务的 URL。当然,您的计费服务必须以期望将密钥附加到 URL 的方式实现。如果您有其他需要包含的键(例如,计费日期、订单状态等),也许您可​​以使用memcachedredis 之类的东西在运行时存储这些信息。当然,现在您必须考虑将这些单点故障添加到您的生态系统的权衡:-)

如何在不将身份验证请求从其他服务复制到身份验证服务的情况下创建身份验证?

同样,一旦用户通过身份验证,其所有身份信息都可以存储在memcachedredis之类的东西中,以避免重复身份验证和授权过程。

于 2015-04-15T04:49:08.437 回答
4

另一种方法可能是构建另一个微服务,通过身份验证/授权保护对其他服务的访问。这与 API Gateway 模式有关,此处提供更多信息:http ://microservices.io/patterns/apigateway.html 。基本上,您的系统只有一个入口点,您可以使用 oauth 或 json Web 令牌来处理客户端身份验证。

微服务之间的安全访问也可以通过 http 请求上的附加标头和令牌(一种“内部”身份验证)来实现。

在我看来,微服务不应该承担这个责任,因为您可能必须在您的应用程序中共享/复制身份验证逻辑。

另一方面,将 ID 共享为“外键”是解耦相关数据的好方法。

于 2015-05-13T00:42:55.827 回答