您如何处理微服务架构中的共享概念?


39

我正在研究我正在开发的应用程序的体系结构模式,微服务方法似乎是一个不错的选择,但是我不确定如何处理服务之间的交互。

该应用程序主要处理用户,用户拥有的配置文件,照片以及代表照片中一对多配置文件的标签。可以想象有一些方法可以返回用户上传的照片,返回包含特定标记个人资料的照片,等等。

这是我设计基于微服务的体系结构的第一步,而我来自于启发式历史的整体式域模型。在那个世界中,控制器会将这些域对象缝合在一起,但是我很难理解如何以微服务方式工作。

Answers:


34

通常,服务在需要访问其数据时会调用其他服务。每个数据段应属于一个特定的服务,它将是访问和修改该数据的唯一入口点。一些服务将很简单,通常与您的域模型紧密对应(例如,用于处理用户的服务),而其他服务将是高级的,并使用来自其他服务的数据(例如,显示照片列表以及有关上传它们的用户的信息) )。

在您的用例中,您应该从外部开始,并考虑要通过API向用户提供哪些操作(如果是后端服务),或者如果是Web应用程序,则应该在GUI中提供哪些操作。请注意,GUI部分通常是带有其自己的控制器的常规应用程序:可以通过REST调用操作(例如在AngularJS中),但是这些端点仅是为GUI应用程序设计的,并非常识上的微服务。

假设您要显示照片以及有关上传者的信息。您可以拥有一个用户服务,该服务返回给定用户ID的有关用户的信息,以及一个可以列出照片的照片服务(例如,通过按某些条件进行搜索)。照片列表将为每张照片包含上传用户的ID。这样,这两种服务就不会耦合-摄影服务仅知道用户ID,而对用户数据本身一无所知。在这两个服务之上,您可以使用第三个服务创建一个服务,例如“列出带有上传者信息的照片”,该服务将调用另外两个服务并将它们返回的数据合并。或者,此操作可以由您的Web应用程序而不是服务执行。


1
这对我有很大帮助。我从编写几个UI用例开始,这些用例可以练习堆栈,并且大部分内容都放在适当的位置。
anjunatl 2015年

1
在这个特定的例子中,我们应该做例如。如果列表中有10张照片,则需要10次致电用户服务以获取用户数据?会不会增加很多开销?
里卡多·索扎

1
@rcdmk您可以添加REST端点,该端点获取多个ID的列表作为输入,并返回多张照片作为输出。出于性能原因,通常在实践中这样做。有时,API设计是纯度和实际考虑之间的折衷。
米哈尔Kosmulski

@MichałKosmulski我必须开始讨论,但是StackExchange设计不鼓励他们:)在此特定示例中,我不喜欢微服务方法的原因是直接查询基础数据库(存储用户和图像)的效率更高。想象一下,这些上游服务是否依赖于其他上游服务,依此类推。直接查询数据存储更加安全。仅是我的5美分,仅此而已。再一次,我真的很想就这个话题进行富有成效的讨论,但是StackExachange并不是一个好地方(您可以推荐微服务讨论论坛吗?)
ajukraine

@ajukraine我认为关于stackexchange的聊天可能是进行讨论的好地方。关于性能:1.微服务确实会带来性能成本,并且2.微服务在某些情况下是好的,但在其他情况下却不是。至于依赖关系:在微服务架构中,您经常制作数据的本地副本并使用异步消息传递以减少依赖关系的数量。这是一次真正的体系结构更改,而不仅仅是将应用程序的每个模块自动更改为单独的应用程序。
米哈尔Kosmulski

4

该应用程序主要处理用户,用户拥有的配置文件,照片以及代表照片中一对多配置文件的标签。可以想象有一些方法可以返回用户上传的照片,返回包含特定标记个人资料的照片,等等。

好吧,概要文件服务不应与用户对象一起使用。它可能仅知道被要求为其返回数据的用户的ID,而不再知道。这样,您将不需要用户服务和配置文件服务之间的交互。

如果那不能回答您的问题,请您描述一下您正在处理的确切情况,以澄清问题?


这个和Michal的回答帮助我理解了它,但是他的建议帮助我制定了所需的服务。我陷入了一种想法,即需要代表一个完整的对象,而不仅仅是对对象的引用(用户对象与用户ID)。非常感谢,谢谢!
anjunatl 2015年

@anjunatl Welcome;)
Vladislav Rastrusny15年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.