Architecture 分解为微服务

Architecture 分解为微服务,architecture,microservices,bounded-contexts,Architecture,Microservices,Bounded Contexts,我有一个关于分解成微服务的问题。假设我们有两个微服务:用户和产品。假设我们现在需要向系统中添加类别。更具体地说,产品有一个或多个类别(例如红色微型法拉利属于玩具和汽车类别),用户可以有自己喜欢的类别(例如玩具和鞋子)。现在,当我们检索产品的完整列表时,我们希望对它们进行排序,以便属于首选用户类别的产品位于顶部 基本上应该有一个在微服务之间共享的概念(在本例中为类别)。如何在微体系结构环境中对此进行最佳建模?我看到两种解决办法: 解决方案1: 制作一个单独的“类别”微服务,用于管理类别的CRUD

我有一个关于分解成微服务的问题。假设我们有两个微服务:用户产品。假设我们现在需要向系统中添加类别。更具体地说,产品有一个或多个类别(例如红色微型法拉利属于玩具和汽车类别),用户可以有自己喜欢的类别(例如玩具和鞋子)。现在,当我们检索产品的完整列表时,我们希望对它们进行排序,以便属于首选用户类别的产品位于顶部

基本上应该有一个在微服务之间共享的概念(在本例中为类别)。如何在微体系结构环境中对此进行最佳建模?我看到两种解决办法:

解决方案1:

  • 制作一个单独的“类别”微服务,用于管理类别的CRUD
  • 在产品服务中,使用API调用将类别ID链接到产品
  • 在用户服务中,使用API调用将类别ID链接到用户
  • 在产品服务中,我们有一个API调用来获取按首选项订购的产品。为了实现这一点,产品服务需要调用用户服务来获取用户类别(或侦听用户服务发出的事件)
解决方案2:

  • 制作一个单独的“类别”微服务,用于管理类别的CRUD

  • categories服务还具有一个API调用,用于将产品ID链接到类别

  • categories服务还有一个API调用,用于将用户ID链接到类别

  • 在产品服务中,我们有一个API调用来获取按首选项订购的产品(要使此工作,产品服务需要调用categories服务来获取用户和产品类别(或侦听事件)


这两种解决方案的优缺点是什么?

我认为您应该有一个更复杂的服务和三个简单的服务。您的类别服务应该是类别的CRUD,您的用户服务应该是用户的CRUD,您的产品应该更复杂,称之为productlisting服务,然后仍然有一个简单的电子产品服务

您的productlisting服务应该具有所有的复杂性,但可能是非规范化的

GET/POST/PUT/DELETE /product
GET/POST/PUT/DELETE /category
GET/POST/PUT/DELETE /user

POST/PUT /productlisting/usercategory/<userid>  <list of categories>
POST/PUT /productlisting/productcategory/<productid>  <list of categories>
GET /productlisting
GET/POST/PUT/DELETE/product
获取/发布/放置/删除/类别
获取/发布/放置/删除/用户
POST/PUT/productlisting/usercategory/
POST/PUT/productlisting/productcategory/
获取/产品列表

无论是这样,还是将它们组合成一个整体……它们都不是独立的关注点,通过ID耦合它们只会让你在长期内感到悲伤,因为耦合将是脆弱的。我从不让一个服务知道另一个服务的实体ID。在分布式系统中,这种关系约束只是自找麻烦。

我想说你应该有一个更复杂的服务和三个简单的服务。你的类别服务应该只是类别的CRUD,你的用户服务应该是用户的CRUD,你的产品应该更复杂,称之为productlisting服务,然后仍然有一个简单的产品服务

您的productlisting服务应该具有所有的复杂性,但可能是非规范化的

GET/POST/PUT/DELETE /product
GET/POST/PUT/DELETE /category
GET/POST/PUT/DELETE /user

POST/PUT /productlisting/usercategory/<userid>  <list of categories>
POST/PUT /productlisting/productcategory/<productid>  <list of categories>
GET /productlisting
GET/POST/PUT/DELETE/product
获取/发布/放置/删除/类别
获取/发布/放置/删除/用户
POST/PUT/productlisting/usercategory/
POST/PUT/productlisting/productcategory/
获取/产品列表

无论是这样,还是将它们组合成一个整体……它们不是独立的关注点,通过ID耦合它们只会让你在长期内感到悲伤,因为耦合将是脆弱的。我从不让一个服务知道另一个服务的实体ID。分布式系统中的这种关系约束只是自找麻烦。

好吧,solution 2出局了,因为您将在不同的服务中为许多事情使用类别,如果让类别服务在所有这些不同的域中实现搜索,将破坏关注点的分离

此外,一个现实的产品或用户搜索可能包括除类别之外的其他标准。让所有这些标准的服务实现它们自己的产品搜索通常不是一个好的实现,因为在多标准搜索中合并结果可能代价高昂,所以这种在服务中实现搜索的模式定义标准对象的e不可缩放


解决方案1很接近,但没有理由让产品服务知道或调用用户服务。产品服务应该有一个API,可以使用各种条件(包括类别)搜索产品。最好让客户端传递类别ID列表,而不是使用r ID。这样它就不必调用用户服务本身,而且产品和用户服务是独立的。此外,按类别搜索产品对其他事情(如浏览产品)也很有用,因为您没有将类别搜索与用户绑定,所以您可以使用相同的API来处理其他情况。

解决方案2已经过时,因为您将在不同的服务中为许多事情使用类别,如果让类别服务在所有这些不同的域中实现搜索,将破坏关注点的分离。

此外,一个现实的产品或用户搜索可能包括除类别之外的其他标准。让所有这些标准的服务实现它们自己的产品搜索通常不是一个好的实现,因为在多标准搜索中合并结果可能代价高昂,所以这种在服务中实现搜索的模式定义标准对象的e不可缩放

解决方案1很接近,但是没有理由让产品服务知道或调用用户服务。产品服务应该有一个API,可以使用各种条件搜索产品,包括categ