微服务通信
Microservices communication
其实我是学微服务的,遇到一个问题
上下文
我正在开发两个微服务:
- 用户管理,Spring基于,具有MySQL数据库
- 计划管理,ASP.NET 基于 SQL 服务器数据库。此服务的唯一访问点是 API 列出了一些 RESTFUL 端点,例如
/planning/{day}/{userId} or /planning/{startDate}/{endDate}/{idUser}
- 计费管理,Node.Js 基于 MongoDB。
问题
如何才能只允许通过用户服务访问规划信息而不耦合这两个服务?知道以后可以从其他地方访问规划服务,但不是现在。
如何从 MySQL 数据库中的用户对应的计费服务中获取计费信息?我知道微服务不耦合,这一点让我很难受,因为它必须以某种方式耦合,不是吗?就像在帐单中引用 idUser
一样?否则,我怎么知道应该公开我的 API 中的哪个账单?更确切地说,微服务之间如何通信,而不耦合?
如何在不从其他服务向身份验证服务复制身份验证请求的情况下创建身份验证?
这里要认识到的重要一点是,在实施用户身份验证、用户授权和用户会话管理解决方案时,微服务架构的解决方案与任何其他形式的解决方案在概念上没有显着差异分布式系统架构。
从概念上讲,解决方案将是 Kerberos protocol 的实现,其中 "ticket"(或今天更常用的 "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 or nats 等工具将您的用户管理服务的位置传播到生态系统的其余部分,而无需将您的微服务与其耦合。
How can I do to access billing informations from billing service corresponding to a user from the Mysql database?
最简单的解决方案是在计费服务的 URL 中将(单个?)密钥(例如用户 ID)作为查询参数传递。当然,您的计费服务必须以期望密钥附加到 URL 的方式实现。如果您有其他需要包含的键(例如,账单日期、订单状态等),也许您可以使用 memcached or redis 之类的东西在运行时存储这些信息。当然,现在您必须考虑将这些单点故障添加到您的生态系统中的权衡:-)
How to create authentication without duplicating authentication requests to the authentication service, from other services?
同样,一旦用户通过身份验证,其所有身份信息都可以存储在类似 memcached or redis 的内容中,以避免重复身份验证和授权过程。
另一种方法是构建另一个微服务来保护对其他服务的访问 authentication/authorization。
这与 API 网关模式有关,此处有更多信息:http://microservices.io/patterns/apigateway.html。
基本上,您的系统只有一个入口点,您可以使用 oauth 或 json 网络令牌来处理客户端身份验证。
微服务之间的安全访问也可以通过在 http 请求上使用额外的 headers 和令牌(类似于 "internal" 授权)来实现。
在我看来,微服务不应承担此责任,因为您可能必须 share/duplicate 跨应用程序验证逻辑。
另一方面,将 ID 共享为 "foreign key" 是分离相关数据的好方法。
其实我是学微服务的,遇到一个问题
上下文
我正在开发两个微服务:
- 用户管理,Spring基于,具有MySQL数据库
- 计划管理,ASP.NET 基于 SQL 服务器数据库。此服务的唯一访问点是 API 列出了一些 RESTFUL 端点,例如
/planning/{day}/{userId} or /planning/{startDate}/{endDate}/{idUser}
- 计费管理,Node.Js 基于 MongoDB。
问题
如何才能只允许通过用户服务访问规划信息而不耦合这两个服务?知道以后可以从其他地方访问规划服务,但不是现在。
如何从 MySQL 数据库中的用户对应的计费服务中获取计费信息?我知道微服务不耦合,这一点让我很难受,因为它必须以某种方式耦合,不是吗?就像在帐单中引用
idUser
一样?否则,我怎么知道应该公开我的 API 中的哪个账单?更确切地说,微服务之间如何通信,而不耦合?如何在不从其他服务向身份验证服务复制身份验证请求的情况下创建身份验证?
这里要认识到的重要一点是,在实施用户身份验证、用户授权和用户会话管理解决方案时,微服务架构的解决方案与任何其他形式的解决方案在概念上没有显着差异分布式系统架构。
从概念上讲,解决方案将是 Kerberos protocol 的实现,其中 "ticket"(或今天更常用的 "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 or nats 等工具将您的用户管理服务的位置传播到生态系统的其余部分,而无需将您的微服务与其耦合。
How can I do to access billing informations from billing service corresponding to a user from the Mysql database?
最简单的解决方案是在计费服务的 URL 中将(单个?)密钥(例如用户 ID)作为查询参数传递。当然,您的计费服务必须以期望密钥附加到 URL 的方式实现。如果您有其他需要包含的键(例如,账单日期、订单状态等),也许您可以使用 memcached or redis 之类的东西在运行时存储这些信息。当然,现在您必须考虑将这些单点故障添加到您的生态系统中的权衡:-)
How to create authentication without duplicating authentication requests to the authentication service, from other services?
同样,一旦用户通过身份验证,其所有身份信息都可以存储在类似 memcached or redis 的内容中,以避免重复身份验证和授权过程。
另一种方法是构建另一个微服务来保护对其他服务的访问 authentication/authorization。 这与 API 网关模式有关,此处有更多信息:http://microservices.io/patterns/apigateway.html。 基本上,您的系统只有一个入口点,您可以使用 oauth 或 json 网络令牌来处理客户端身份验证。
微服务之间的安全访问也可以通过在 http 请求上使用额外的 headers 和令牌(类似于 "internal" 授权)来实现。
在我看来,微服务不应承担此责任,因为您可能必须 share/duplicate 跨应用程序验证逻辑。
另一方面,将 ID 共享为 "foreign key" 是分离相关数据的好方法。