微服务通信

mfr*_*het 5 java node.js microservices apache-zookeeper

我正在研究微服务,我正面临着一个问题.

上下文

我正在开发两个微服务:

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

问题

  1. 如果只允许通过用户服务访问规划信息而不同时使用这两种服务,我该怎么做?知道计划服务可以稍后从其他地方访问,但现在不能访问.

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

  3. 如何创建身份验证而不从其他服务复制身份验证服务的身份验证请求?

iva*_*sim 7

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

从概念上讲,该解决方案将是Kerberos协议的实现,其中传递"票证"(或称为"令牌",因为它更常见于今天)的概念被传递以建立用户的身份.

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

如果只允许通过用户服务访问规划信息而不同时使用这两种服务,我该怎么做?

当用户尝试访问.Net服务时,您的服务必须依赖您的用户管理服务来建立用户的身份.换句话说,您的.Net服务需要知道您的用户管理服务在哪里(即其URL).您可以使用一样的工具ETCDNATS到您的用户管理服务的位置传播到您的生态系统的其余部分,没有你的微服务连接到它.

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

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

如何创建身份验证而不从其他服务复制身份验证服务的身份验证请求?

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