java - 微服务通信

标签 java node.js apache-zookeeper microservices

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

上下文

我正在开发两个微服务:

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

问题

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

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

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

最佳答案

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

从概念上讲,解决方案将是 Kerberos protocol 的实现。 ,通过传递“票证”(或今天更普遍称为“ token ”)的概念来确定用户的身份。

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

What can I do to only permit accessing the planning information through the user service without couple the two services?

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

How can I do to access billing informations from billing service corresponding to a user from the Mysql database?

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

How to create authentication without duplicating authentication requests to the authentication service, from other services?

同样,一旦用户通过身份验证,其所有身份信息都可以存储在类似 memcached 的位置。或 redis避免重复认证和授权过程。

关于java - 微服务通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29636094/

相关文章:

java - 如何在 Java 中创建泛型方法?

java - Thread#join() 是否让其他线程通过同步块(synchronized block)?

node.js - Node 模块化架构

python - 如何使用 kazoo 包在 Python 中添加子节点数据更新监视

java - 小部件是什么意思并解释使用小部件

java - 如何调用 Twilio JavaScript 软电话客户端?

javascript - 执行 bundle 时使用各自子包的模块

javascript - 如何处理返回内部回调变量?

Java - HBase 客户端停留在 session 建立完成

apache-zookeeper - Apache Zookeeper 数据持久性。使用 CreateMode.Persistent 创建的节点能否在整个集群重新启动后继续存在?