微服务通信

6

我正在学习微服务,遇到了问题。

背景

我正在开发两个微服务:

  • 用户管理,基于Spring,使用MySQL数据库
  • 计划管理,基于ASP.NET,使用SQL Server数据库。该服务的唯一访问点是列出一些RESTful端点的API,如/planning/{day}/{userId}或/planning/{startDate}/{endDate}/{idUser}
  • 账单管理,基于Node.Js,使用MongoDB。

问题

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

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

  3. 如何创建身份验证,而不需要从其他服务中复制身份验证请求到身份验证服务?


如果您喜欢这个答案,请考虑将其标记为“已接受”。谢谢! - ivan.sim
2个回答

7
重要的是要认识到,在实现用户身份验证、用户授权和用户会话管理解决方案方面,微服务架构与其他形式的分布式系统架构之间并没有显著的概念差异。
从概念上讲,解决方案将实现Kerberos协议,使用“票证”(或更常见的“令牌”)来传递以建立用户身份。
因此,在您的情况下,您的用户管理服务将作为后端身份验证和授权服务器,所有其他服务都需要知道它。您的用户管理服务将负责发行和验证用户令牌,以建立用户的身份和角色。

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

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

我该如何从Mysql数据库中访问与用户对应的账单信息?

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

如何创建身份验证而无需从其他服务向身份验证服务复制身份验证请求?

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

4
另一种方法是构建另一个微服务来通过身份验证/授权保护对其他服务的访问。这与API网关模式有关,更多信息请参见:http://microservices.io/patterns/apigateway.html。基本上,您将拥有系统的单个入口点,并且可以使用oauth或json web tokens来处理客户端身份验证。 可以使用类似于http请求中的附加标头和令牌等内容来实现微服务之间的安全访问(类似于“内部”身份验证)。 在我看来,微服务不应该具有此责任,因为您可能需要在整个应用程序中共享/复制auth逻辑。 另外,共享ID作为“外键”是解耦相关数据的好方法。

1
是的,这正是API网关的用途。问题是:如果用户尝试从他的主机:端口访问计费API呢?知道是API网关处理请求并调用authservice,似乎我有一个安全问题... :-) - mfrachet
你可以通过阻止端口来限制对这些微服务的访问。或者,就像我说的那样,你可以在受保护的服务之间使用某种共享令牌。这真的取决于你需要多细粒度的安全性。如果你部署了一组微服务集群,你只需将80端口暴露给API网关即可,其余端口应该被外部封锁。 - ronaldofs
你可以在计费服务内使用组合来始终通过认证服务。示例在这里:https://dev59.com/SV0Z5IYBdhLWcg3wzC9W#42633198 - Nima Gardideh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接