微服务之:独立服务

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 考虑一下一家外卖公司 应用程序,它是一个在线食品配送应用程序。应用程序的客户端通过发出 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
  • 由于在服务中实现功能而不是作为单独的服务实现更大的服务
目录
相关文章
|
2月前
|
Cloud Native Java API
聊聊从单体到微服务架构服务演化过程
本文介绍了从单体应用到微服务再到云原生架构的演进过程。单体应用虽易于搭建和部署,但难以局部更新;面向服务架构(SOA)通过模块化和服务总线提升了组件复用性和分布式部署能力;微服务则进一步实现了服务的独立开发与部署,提高了灵活性;云原生架构则利用容器化、微服务和自动化工具,实现了应用在动态环境中的弹性扩展与高效管理。这一演进体现了软件架构向着更灵活、更高效的方向发展。
|
3月前
|
监控 负载均衡 安全
微服务(五)-服务网关zuul(一)
微服务(五)-服务网关zuul(一)
|
4月前
|
开发框架 IDE .NET
【Azure 微服务】Service Fabric中微服务在升级时,遇见Warning - System.Collections.Generic.KeyNotFoundException 服务无法正常运行
【Azure 微服务】Service Fabric中微服务在升级时,遇见Warning - System.Collections.Generic.KeyNotFoundException 服务无法正常运行
【Azure 微服务】Service Fabric中微服务在升级时,遇见Warning - System.Collections.Generic.KeyNotFoundException 服务无法正常运行
|
2月前
|
Kubernetes 负载均衡 Docker
构建高效后端服务:微服务架构的探索与实践
【10月更文挑战第20天】 在数字化时代,后端服务的构建对于任何在线业务的成功至关重要。本文将深入探讨微服务架构的概念、优势以及如何在实际项目中有效实施。我们将从微服务的基本理念出发,逐步解析其在提高系统可维护性、扩展性和敏捷性方面的作用。通过实际案例分析,揭示微服务架构在不同场景下的应用策略和最佳实践。无论你是后端开发新手还是经验丰富的工程师,本文都将为你提供宝贵的见解和实用的指导。
|
2月前
|
监控 API 持续交付
构建高效后端服务:微服务架构的深度探索
【10月更文挑战第20天】 在数字化时代,后端服务的构建对于支撑复杂的业务逻辑和海量数据处理至关重要。本文深入探讨了微服务架构的核心理念、实施策略以及面临的挑战,旨在为开发者提供一套构建高效、可扩展后端服务的方法论。通过案例分析,揭示微服务如何帮助企业应对快速变化的业务需求,同时保持系统的稳定性和灵活性。
46 9
|
2月前
|
监控 安全 Java
构建高效后端服务:微服务架构深度解析与最佳实践###
【10月更文挑战第19天】 在数字化转型加速的今天,企业对后端服务的响应速度、可扩展性和灵活性提出了更高要求。本文探讨了微服务架构作为解决方案,通过分析传统单体架构面临的挑战,深入剖析微服务的核心优势、关键组件及设计原则。我们将从实际案例入手,揭示成功实施微服务的策略与常见陷阱,为开发者和企业提供可操作的指导建议。本文目的是帮助读者理解如何利用微服务架构提升后端服务的整体效能,实现业务快速迭代与创新。 ###
65 2
|
2月前
|
消息中间件 Kafka 数据库
微服务架构中,如何确保服务之间的数据一致性?
微服务架构中,如何确保服务之间的数据一致性?
|
2月前
|
运维 Kubernetes 开发者
构建高效后端服务:微服务架构与容器化技术的结合
【10月更文挑战第18天】 在数字化转型的浪潮中,企业对后端服务的要求日益提高,追求更高的效率、更强的可伸缩性和更易于维护的系统。本文将探讨微服务架构与容器化技术如何结合,以构建一个既灵活又高效的后端服务体系。通过分析当前后端服务面临的挑战,介绍微服务和容器化的基本概念,以及它们如何相互配合来优化后端服务的性能和管理。本文旨在为开发者提供一种实现后端服务现代化的方法,从而帮助企业在竞争激烈的市场中脱颖而出。
28 0
|
3月前
|
消息中间件 Kafka 数据库
微服务架构中,如何确保服务之间的数据一致性
微服务架构中,如何确保服务之间的数据一致性
|
3月前
|
消息中间件 缓存 NoSQL
构建高效后端服务:微服务架构的深度实践
本文旨在探讨如何通过采用微服务架构来构建高效的后端服务。我们将深入分析微服务的基本概念、设计原则以及在实际项目中的应用案例,揭示其在提升系统可维护性、扩展性和灵活性方面的优势。同时,本文还将讨论在实施微服务过程中可能遇到的挑战,如服务治理、分布式事务和数据一致性等问题,并分享相应的解决策略和最佳实践。通过阅读本文,读者将能够理解微服务架构的核心价值,并具备将其应用于实际项目的能力。 ##