微服务通信

我实际上在研究微服务,而且我正面临一个问题。

上下文

我正在开发两个微服务:

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

问题

  1. 我可以做什么,只允许通过用户服务访问计划信息,而不需要两个服务? 知道计划服务可以在其他地方稍后访问,但不是现在。

  2. 如何从MySQL数据库访问与用户对应的账单服务的账单信息? 我知道微服务不耦合,这一点是杀了我,因为它必须耦合在一个没有? 像在帐单中引用idUser一样? 否则,我怎么能知道我的API应该公开哪些账单? 更确切地说,微服务如何在它们之间进行通信,而不被耦合呢?

  3. 如何从其他服务中创build身份validation而不重复身份validation服务的身份validation请求?

这里要认识到的重要一点是,在实现用户authentication,用户授权和用户会话pipe理解决scheme时,微服务体系结构的解决scheme和任何其他forms的分布式系统体系结构之间没有明显的概念差异。

从概念上讲,解决scheme将是Kerberos协议的实现,通过传递“票据”(或“标记”,因为它更常被称为今天)的概念来build立用户的身份。

所以在你的情况下,你的用户pipe理服务将作为你的后端authentication和授权服务器,所有其他服务需要注意。 您的用户pipe理服务将负责发布和validation用户令牌,以build立用户的身份和angular色。

我可以做什么,只允许通过用户服务访问计划信息,而不需要两个服务?

当用户试图访问您的.Net服务时,您的服务将不得不依靠您的用户pipe理服务来build立用户的身份。 换句话说,您的.Net服务将需要知道您的用户pipe理服务(即其URL)。 您可以使用etcd或nats之类的工具将您的用户pipe理服务的位置传播到您生态系统的其他部分,而无需将您的微服务耦合到它。

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

最简单的解决scheme是在帐单服务的URL中传递(single?)键(如用户ID)作为查询参数。 当然,您的账单服务必须以这种方式实现,以期望将密钥附加到URL上。 如果您还需要包含其他密钥(例如,结算date,订单状态等),也许可以使用memcached或redis之类的东西在运行时存储这些信息。 当然,现在您必须考虑将这些单点故障添加到您的生态系统中的权衡:-)

如何从其他服务中创build身份validation而不重复身份validation服务的身份validation请求?

同样,一旦用户被authentication,其所有的身份信息可以被存储在像memcached或redis的东西,以避免重复authentication和授权过程。

另一种方法是构build另一个微服务,通过身份validation/授权来保护对其他服务的访问。 这涉及到API网关模式,附加信息在这里: http : //microservices.io/patterns/apigateway.html 。 基本上你可以有一个入口点到你的系统,你可以使用oauth或者json的networking令牌来处理客户端authentication。

微服务之间的安全访问也可以通过http请求(types为“内部”auth)使用额外的头部和令牌来实现。

在我看来,微服务不应该有这个责任,因为你可能需要在应用程序之间共享/复制授权逻辑。

在另一个说明中,将ID分享为“外键”是解耦相关数据的好方法。