微服务之:独立服务

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 考虑一下一家外卖公司 应用程序,它是一个在线食品配送应用程序。应用程序的客户端通过发出 HTTPPOST /orders请求来创建订单,并期望在 600 毫秒内得到响应。由于 该 应用程序使用微服务架构,实现订单创建的职责分散在多个服务中。POST请求首先被路由到,然后Order Service它必须与以下服务协作:• Restaurant Service- 了解餐厅的菜单和价格• Consumer Service- 知道下Consumer订单的状态• Kitchen Service- 创建一个Ticket,告诉厨师要做什么• Accounting Service- 授权消费者的信用卡

前提

考虑一下一家外卖公司 应用程序,它是一个在线食品配送应用程序。应用程序的客户端通过发出 HTTPPOST /orders请求来创建订单,并期望在 600 毫秒内得到响应。由于 该 应用程序使用微服务架构,实现订单创建的职责分散在多个服务中。POST请求首先被路由到,然后Order Service它必须与以下服务协作:

  • Restaurant Service- 了解餐厅的菜单和价格
  • Consumer Service- 知道下Consumer订单的状态
  • Kitchen Service- 创建一个Ticket,告诉厨师要做什么
  • Accounting Service- 授权消费者的信用卡

Order Service可以使用同步请求/响应来调用这些服务中的每一个。例如,它可能使用 REST 或 gRPC 实现服务间通信。

然而,使用同步请求/响应的一个主要缺点是它降低了可用性。这是因为如果 的任何Order Sevice合作者不可用,它将无法创建订单并且必须向客户端返回错误。

另一种方法是Order Service通过使用 CQRS 和 Saga 模式消除其及其协作者之间的所有同步通信。Order Service可以使用CQRS模式来维护餐厅菜单的副本,从而消除从Restaurant Service. 它可以使用Saga 模式异步验证订单。Order Service创建一个Order状态PENDING并返回一个响应给POST /order。然后它通过与其他服务进行异步通信来完成订单的创建。

这种方法的一个主要好处是它提高了可用性。即使其他服务之一不可用,也始终Order Service响应请求。POST /orders然而,使用 saga 完成订单创建的一个缺点是,对 saga 的响应POST不会告诉客户订单是否被批准。客户端必须通过定期调用来找出答案GET /orders/{orderId}。

问题

在处理同步请求时,服务应该如何与其他服务协作?

概念

  • 微服务架构通常将处理请求的责任分配给多个服务
  • 通常要求操作具有高可用性和低响应时间
  • 操作的可用性是处理请求时调用的服务的可用性的乘积: serviceAvailability numberOfSynchronouslyCollaboratingServices
  • 服务可以重试对失败的协作者的请求,但这会增加响应时间。

解决方案

设计一个服务,以便它可以响应同步请求,而无需等待任何其他服务的响应。

使服务自包含的一种方法是将所需的功能实现为服务模块而不是单独的服务。例如,我们可以合并Order Serviceand Restaurant Service。

使服务自包含的另一种方法是使用CQRS和Saga模式与其他服务协作。自包含服务使用 Saga 模式异步维护数据一致性。它使用 CQRS 模式来维护其他服务拥有的数据的副本。

示例

Order Service前面描述的 该 应用程序中的 是自包含服务的示例。createOrder()例如,该操作会查询拥有的数据的 CQRS 副本Restaurant Service以验证订单并为其定价,然后启动 saga 以完成订单的创建。

总结

这种模式有以下好处:

  • 提高可用性和响应时间

这种模式有以下缺点:

  • 使用 CQRS 的成本和复杂性增加
  • 增加使用 sagas 的复杂性
  • 使用 sagas 时不太直接的 API
  • 由于在服务中实现功能而不是作为单独的服务实现更大的服务
目录
相关文章
|
1月前
|
消息中间件 监控 API
在Python中如何实现微服务架构,及相关的服务间通信方案?
Python微服务架构涉及服务划分、注册发现、通信协议选择(如HTTP、gRPC、消息队列)及服务间通信实现。每个服务应自治,有独立数据库和部署流程,并需考虑容错(如分布式事务、重试、熔断)和监控日志。API网关用于请求管理和路由。实际操作需根据需求和技术栈调整,并关注服务拆分和数据一致性。
64 5
|
1月前
|
Java API 微服务
【Spring Boot系列】通过OpenAPI规范构建微服务服务接口
【4月更文挑战第5天】通过OpenAPI接口构建Spring Boot服务RestAPI接口
125 0
|
4天前
|
监控 API 数据安全/隐私保护
构建高效后端服务:微服务架构的实践与挑战
【6月更文挑战第23天】在现代软件开发中,微服务架构已成为设计高性能、可扩展后端系统的首选模式。本文将深入探讨微服务的设计原则、实践方法及其面临的技术挑战,旨在为开发者提供一个全面的微服务实施指南。
18 3
|
16天前
|
消息中间件 运维 监控
微服务架构中的服务通信与数据一致性挑战
在微服务架构的海洋中,服务之间的通信和数据一致性问题犹如潜藏的暗礁和漩涡,随时可能威胁到整个应用的健康运行。本文将深入探讨微服务间通信机制的选择、数据一致性维护的策略,以及面对网络延迟和分区容忍性时如何保持系统的灵活性和健壮性。通过分析常见的模式和最佳实践,旨在为开发者提供一套应对这些挑战的航海图。
|
21天前
|
缓存 网络协议 算法
微服务架构之从类库到服务之服务发现
服务发现是分布式系统中的核心技术,其实现需要在可用性和一致性之间进行权衡。通过合理设计服务注册中心的架构,并采用有效的健康检查和缓存机制,可以提高系统的可靠性和可用性。不同的服务发现框架各有优缺点,选择适合的框架需要根据具体需求进行权衡和取舍。总之,服务发现的有效实现对于构建可靠的大型分布式系统至关重要。
16 3
|
1月前
|
缓存 微服务
01.【微服务架构】服务注册与发现:AP和CP,你选哪个? -- 客户端容错
【5月更文挑战第12天】客户端容错机制确保在服务端或注册中心故障时仍能正确发送请求。当服务端崩溃,由于延迟,客户端一段时间内仍会尝试发送请求。客户端应实施 failover 策略,即检测到调用失败后,切换到其他节点重试,并将故障节点从列表移除。延时通常等于服务端与注册中心心跳间隔加通知时间。若网络问题导致客户端无法访问服务端,客户端应发送心跳以检测服务端状态,成功则恢复,连续失败则视为崩溃。若客户端无法连接注册中心,它应使用本地缓存并考虑退出。
26 1
01.【微服务架构】服务注册与发现:AP和CP,你选哪个? -- 客户端容错
|
28天前
|
Kubernetes 负载均衡 开发者
构建高效后端服务:从微服务到容器化部署
【5月更文挑战第31天】本文深入探讨了现代后端开发中的关键概念,包括微服务的架构设计、容器化技术的运用以及它们如何共同提升应用的可扩展性、可靠性和性能。通过具体案例分析,我们将揭示这些技术是如何在实际开发中被实施的,并讨论它们对后端开发流程的影响。
|
7天前
|
NoSQL Java MongoDB
实战SpringCloud响应式微服务系列教程(第十章)响应式RESTful服务完整代码示例
实战SpringCloud响应式微服务系列教程(第十章)响应式RESTful服务完整代码示例
|
1月前
|
缓存 微服务
01.【微服务架构】服务注册与发现:AP和CP,你选哪个?-- 服务注册与发现模型
【5月更文挑战第1天】本文探讨了服务注册与发现的关键作用,在微服务架构中,这一概念常出现在面试中。文章深入讲解基础模型,包括服务端注册、心跳维持、客户端缓存及服务端下线流程,并强调了高可用性的重要性,涉及服务端崩溃检测、客户端容错和注册中心选型。通过分析客户端、注册中心和服务端之间的交互,提出如何应对潜在故障的策略,以构建稳定的微服务架构。
43 3
01.【微服务架构】服务注册与发现:AP和CP,你选哪个?-- 服务注册与发现模型
|
18天前
|
消息中间件 存储 监控
通过将大型应用拆分成一系列小型、独立的服务,微服务架构为后端开发带来了更高的灵活性、可扩展性和可维护性
【6月更文挑战第10天】本文探讨了构建高效微服务架构的后端开发最佳实践。微服务的核心原则是服务独立、去中心化、自治和轻量级通信,优势在于可扩展性、独立性、技术灵活性和团队协作。实践中,应注意服务的拆分粒度,选择合适的通信协议(如RESTful、RPC、消息队列),处理数据一致性与分布式事务,实施服务治理和监控,以及确保安全性与权限控制。未来,微服务将结合服务网格、容器化和云原生技术,持续发展和优化。
28 0

热门文章

最新文章