微服务通信
我实际上在研究微服务,而且我正面临一个问题。
上下文
我正在开发两个微服务:
- 基于Spring的用户pipe理,带有MySQL数据库
- 规划pipe理,基于SQL Server数据库的ASP.NET。 这个服务的唯一访问点是API列出了一些RESTFUL端点,例如
/planning/{day}/{userId} or /planning/{startDate}/{endDate}/{idUser}
- 账单pipe理,基于MongoDB的Node.Js。
问题
-
我可以做什么,只允许通过用户服务访问计划信息,而不需要两个服务? 知道计划服务可以在其他地方稍后访问,但不是现在。
-
如何从MySQL数据库访问与用户对应的账单服务的账单信息? 我知道微服务不耦合,这一点是杀了我,因为它必须耦合在一个没有? 像在帐单中引用
idUser
一样? 否则,我怎么能知道我的API应该公开哪些账单? 更确切地说,微服务如何在它们之间进行通信,而不被耦合呢? -
如何从其他服务中创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分享为“外键”是解耦相关数据的好方法。