微服务 API 调用和依赖设计
Microservices API calls and dependency design
关于 API 依赖性(服务调用的 API )是否有设计微服务的最佳实践?
例如,如果我有一个 "Order Management" (OM) 服务,显然它需要调用 "User Management" (UM) 服务,因为它需要查询用户信息(送货地址、电子邮件、等)很多次。如果我让我的 OM 在需要用户信息时一直调用 UM,这将产生对 UM 服务的大量依赖。
据我所知,服务应该是自治的并且尽可能分离 - 但现在我得到了一个 OM 服务,每次 UM 服务停止时它都会停止。
在 Google 上搜索后,我找到了 3 个备选方案:
- 一旦在 UM 模块中创建了用户数据,就使用基于事件的编程来复制用户数据,因此它总是被复制到 OMtable 内部
- 使用数据库的复制机制将数据从UM复制到OM数据库
- 将用户数据作为嵌套复制到订单对象中json以消除订单查询和更新的依赖性(但我想初始订单创建仍需要调用 UM)
这里是否有应对挑战的最佳实践,或者是否有决定采用哪种设计方法的经验法则?
微服务是一种 SOA(面向服务的架构)。因此,如果有一项服务执行所需的工作单元,那么为什么不调用它而不是参与不直接绑定到调用服务的数据模型的后端。如果您遇到某种性能或架构问题,我只会走避免 UM 服务调用的路线。甚至性能问题也可能在仍然从 OM 服务调用 UM 服务的同时得到解决。
As far as I understand services are supposed to be autonomous and as decoupled as possible - but now I got a OM service that will go down everytime UM service go down.
这个论点可以用来说明为什么要使用 UM 服务,这样 OM 服务就不必参与(耦合)UM 的内部工作。如果 OM 耦合到 UM 的后端并且 UM 决定完全改变它的工作方式,比如从关系数据库到无 sql 实现,那么这将导致更多的工作,因为它会影响 OM。
1.Use the event-based programming to replciate user data as soon as user data is created in UM module so it is always replicated into a table inside OM
我担心的是,您正在实施 UM 服务并将其放入 OM 服务中。同样,如果您遇到 performance/arch 个问题并且您可以处理将 UM 服务逻辑耦合到 OM 服务中,我只会走这条路。
2.Use database's replciation mechanism to replicate data from UM onto OM database
将 UM 的后端耦合到 OM。
3.Copy user data into order object as nested json to eliminate dependency for order query and update (but I suppose initial order creation will still need to call UM)
如果减少对 UM 的调用次数,这将很有用。请记住这样做的成本,这可能是携带这些额外信息的性能损失,这可能是也可能不是问题。 OMJSON通信越少,调用UM服务越多,这个方案越理想。但是,如果 UM 服务只被调用一次(比如在订单流程结束时),但 OM JSON 传递了很多次,也许这个解决方案的成本超过了它的价值。
你说的是限界上下文(Bounded Context,BC),也就是DDD模式。如果服务边界对应于 BC,则 DDD 非常适合 SOA。 BCs 是系统的自治部分,彼此之间不共享任何共同的业务逻辑。在设计你的 BC 时,你不应该考虑任何关于数据库或其他横切关注点的想法。你应该牢记让你的代码尽可能具体,然后你不应该被诱惑重用代码。在业务方面,为可重用的系统部分保留 Web 服务。如果可以的话,更喜欢最终一致性(那么你应该能够使用通知而不是直接调用 WS)。
关于最终一致性(如果可能),我会选择第一个选项。
关于 API 依赖性(服务调用的 API )是否有设计微服务的最佳实践?
例如,如果我有一个 "Order Management" (OM) 服务,显然它需要调用 "User Management" (UM) 服务,因为它需要查询用户信息(送货地址、电子邮件、等)很多次。如果我让我的 OM 在需要用户信息时一直调用 UM,这将产生对 UM 服务的大量依赖。
据我所知,服务应该是自治的并且尽可能分离 - 但现在我得到了一个 OM 服务,每次 UM 服务停止时它都会停止。
在 Google 上搜索后,我找到了 3 个备选方案:
- 一旦在 UM 模块中创建了用户数据,就使用基于事件的编程来复制用户数据,因此它总是被复制到 OMtable 内部
- 使用数据库的复制机制将数据从UM复制到OM数据库
- 将用户数据作为嵌套复制到订单对象中json以消除订单查询和更新的依赖性(但我想初始订单创建仍需要调用 UM)
这里是否有应对挑战的最佳实践,或者是否有决定采用哪种设计方法的经验法则?
微服务是一种 SOA(面向服务的架构)。因此,如果有一项服务执行所需的工作单元,那么为什么不调用它而不是参与不直接绑定到调用服务的数据模型的后端。如果您遇到某种性能或架构问题,我只会走避免 UM 服务调用的路线。甚至性能问题也可能在仍然从 OM 服务调用 UM 服务的同时得到解决。
As far as I understand services are supposed to be autonomous and as decoupled as possible - but now I got a OM service that will go down everytime UM service go down.
这个论点可以用来说明为什么要使用 UM 服务,这样 OM 服务就不必参与(耦合)UM 的内部工作。如果 OM 耦合到 UM 的后端并且 UM 决定完全改变它的工作方式,比如从关系数据库到无 sql 实现,那么这将导致更多的工作,因为它会影响 OM。
1.Use the event-based programming to replciate user data as soon as user data is created in UM module so it is always replicated into a table inside OM
我担心的是,您正在实施 UM 服务并将其放入 OM 服务中。同样,如果您遇到 performance/arch 个问题并且您可以处理将 UM 服务逻辑耦合到 OM 服务中,我只会走这条路。
2.Use database's replciation mechanism to replicate data from UM onto OM database
将 UM 的后端耦合到 OM。
3.Copy user data into order object as nested json to eliminate dependency for order query and update (but I suppose initial order creation will still need to call UM)
如果减少对 UM 的调用次数,这将很有用。请记住这样做的成本,这可能是携带这些额外信息的性能损失,这可能是也可能不是问题。 OMJSON通信越少,调用UM服务越多,这个方案越理想。但是,如果 UM 服务只被调用一次(比如在订单流程结束时),但 OM JSON 传递了很多次,也许这个解决方案的成本超过了它的价值。
你说的是限界上下文(Bounded Context,BC),也就是DDD模式。如果服务边界对应于 BC,则 DDD 非常适合 SOA。 BCs 是系统的自治部分,彼此之间不共享任何共同的业务逻辑。在设计你的 BC 时,你不应该考虑任何关于数据库或其他横切关注点的想法。你应该牢记让你的代码尽可能具体,然后你不应该被诱惑重用代码。在业务方面,为可重用的系统部分保留 Web 服务。如果可以的话,更喜欢最终一致性(那么你应该能够使用通知而不是直接调用 WS)。
关于最终一致性(如果可能),我会选择第一个选项。