如何实现复杂的微服务?

时间:2016-08-09 16:18:55

标签: java amazon-web-services architecture microservices

对使用复杂的cenario的微服务有一些疑问。例如,结帐。

我需要处理产品的详细信息,更新库存,用户的详细信息,税收 根据用户所在地区,计算最终价格并发送产品。所以我有以下服务:

  • ProductService;
  • 的InventoryService;
  • UserService;
  • TaxesService;
  • ShippingService;
  • CheckoutService?

我的第一个问题,我需要一个新服务(比如CheckoutService)来完成所有这些逻辑(并计算最终价格)?

如果是,则此新服务将控制事务(如两阶段提交)?

每项服务都必须是您自己的数据库?如果我的应用程序在亚马逊环境中运行,我需要为每个服务都有一个RDS实例吗?

1 个答案:

答案 0 :(得分:4)

老实说,无论你得到什么答案,都不会是完美的答案,因为很多都是受设计和个人需求的影响。

我在设计复杂的微服务架构时采取的步骤与域驱动设计(DDD)紧密相关,如下所示:

  1. 定义您的域名(在您的示例中,电子商务似乎是您的域名)
  2. 确定您的直接交付物(在您的示例中,将商品添加到购物车并结帐的能力)
  3. 定义您的上下文边界(在您的示例中,Checkout可能是它自己的上下文边界,并且可能足够精细。比结帐更细粒度您可能冒险进入纳米服务区域,而不是您想要的位置)
  4. 现在你有了上下文边界,这将是你的微服务。在实现上下文边界时,您需要将其分解为自己的各个部分。从您的示例中可以看出,您有

    1. 价格/税收计算
    2. 库存管理
    3. 订单管理
    4. 然后,您可以在每个上下文边界确定所需的功能,并将其分解为演示文稿/控制器,服务和存储库。

      例如,采取订单管理。你可能想要这样的东西:

      • 订购服务以处理订单的业务逻辑和数据映射
      • 订单存储库从数据存储中提取有关订单的数据

      如果您的订单管理需求对于许多业务规则非常复杂,您可能会将其分解为多个服务/存储库以满足这些需求,或者它可能会得到它自己的上下文边界...

      我不能告诉你如何办理结账(你询问有关计算东西和控制交易的信息)。但是你决定这样做。

      完成所有这些后,您就可以确定数据存储需求和服务器需求。最初,您可能没有大量用户,因此每个服务可能位于同一项目中的同一服务器上,并且您可以在其自己的服务器上拥有单个数据库。但是请确保以稍后可以解决的方式编写所有内容,这样当您需要通过分布式系统处理更多用户的能力时,您可以这样做而无需重写大量代码。

      这是一个很好的答案,因为我可以在不知道你正在做什么的情况下给你。我不会把我放在这里的一切一字一句地付诸实施,我会在这里接受建议并自己完成各个步骤,以确定最适合您需求的设计。

      <强> TL; DR

      1. 定义您的域名
      2. 将您的域分解为上下文边界
      3. 确定上下文边界的每一部分
      4. 将这些内容分解为演示文稿/控制器,服务和存储库。
      5. 一旦完成,确定您的数据存储和服务器需求(开始时,可​​能是每个数据存储的服务器(例如服务器上的SQL和另一个上的NoSQL / Blob),以及用于您的微服务的单个服务器然后当你有更多的用户来处理,分发你的微服务时)
      6. 祝你好运!