【问题标题】:How to implement complex microservices? [closed]如何实现复杂的微服务? [关闭]
【发布时间】:2016-12-15 19:15:30
【问题描述】:
A 对使用复杂场景的微服务有一些疑问。例如,结帐。
我需要处理产品的详细信息、更新库存、用户的详细信息、税金
根据用户所在地区,计算最终价格并发送产品。所以我有以下服务:
- 产品服务;
- 库存服务;
- 用户服务;
- 税务服务;
- 航运服务;
- CheckoutService?
我的第一个问题,我需要一个新服务(如 CheckoutService)来完成所有这些逻辑(并计算最终价格)?
如果是,这个新服务将控制事务(如两阶段提交)?
每个服务都必须是您自己的数据库?如果我的应用程序在亚马逊环境中运行,我需要为每个服务拥有一个 RDS 实例吗?
【问题讨论】:
标签:
java
amazon-web-services
architecture
microservices
【解决方案1】:
老实说,无论您得到什么答案,都不会是完美的答案,因为其中很多都取决于设计和您自己的个人需求。
我在设计复杂的微服务架构时采取的步骤与领域驱动设计 (DDD) 密切相关,如下所示:
- 定义您的域(在您的示例中,电子商务似乎是您的域)
- 确定您的即时可交付成果(在您的示例中,将商品添加到购物车和结帐的能力)
- 定义您的上下文边界(在您的示例中,Checkout 可能是它自己的上下文边界,并且可能足够细粒度。比结帐更细粒度,您可能正在冒险进入您不想进入的纳米服务领域)
现在您有了上下文边界,这将是您的微服务。在实现该上下文边界时,您需要将其分解为自己的各个部分。从您的示例来看,您似乎有
- 价格/税收计算
- 库存管理
- 订单管理
然后,您可以确定上下文边界的每个部分需要哪些功能,并将它们分解为表示/控制器、服务和存储库。
例如,以订单管理为例。你可能想要这样的东西:
- Order Service 处理订单的业务逻辑和数据映射
- Order Repository 从您的数据存储中提取有关订单的数据
如果您的订单管理需求非常复杂,有很多业务规则,您可能会将其分解为多个服务/存储库以满足这些需求,或者它可能应该拥有自己的上下文边界...
我无法告诉您如何进行结帐(您询问了有关计算内容和控制交易的问题)。然而,这个设计是你决定做的。
一旦您准备好所有这些,您就可以确定您的数据存储需求和服务器需求。最初,您可能没有大量用户,因此每个服务可能都存在于同一个项目中的同一台服务器上,并且您可以在它自己的服务器上拥有一个数据库。但是请确保以一种以后可以拆分的方式编写所有内容,这样当您需要通过分布式系统处理更多用户的能力时,您可以在不重写大量代码的情况下这样做。
这是我在不知道你在做什么的情况下可以给你的最好的答案。我不会逐字逐句地执行我在此处提出的内容并实施它,而是会在此处接受建议并自行执行步骤以确定最适合您需求的设计。
TL;DR
- 定义您的域
- 将您的域分解为上下文边界
- 确定每个上下文边界
- 将这些部分分解为表示/控制器、服务和存储库。
- 一切就绪后,确定您的数据存储和服务器需求(开始时,可能为您的每个数据存储提供一台服务器(例如,一台服务器上的 SQL 和另一台服务器上的 NoSQL/Blob),以及一台用于微服务的服务器. 然后当你有更多用户需要处理时,分发你的微服务)
祝你好运!