「第二部:容器和微服务架构」(5) 每个微服务的数据主权

简介: 「第二部:容器和微服务架构」(5) 每个微服务的数据主权

微服务体系结构的一个重要规则是,每个微服务必须拥有其域数据和逻辑。正如完整的应用程序拥有自己的逻辑和数据一样,每个微服务也必须在自主生命周期中拥有自己的逻辑和数据,每个微服务都有独立的部署。

这意味着域的概念模型在子系统或微服务之间会有所不同。考虑企业应用程序,其中客户关系管理(CRM)应用程序、事务性采购子系统和客户支持子系统各自调用唯一的客户实体属性和数据,并且每个应用程序使用不同的有界上下文(BC)。


这一原则在领域驱动设计(DDD)中类似每个有界上下文或自治子系统或服务都必须拥有自己的领域模型(数据加上逻辑和行为)。每个限定于DDD的上下文都与一个业务微服务(一个或多个服务)相关。关于有界上下文模式的这一点将在下一节中展开。


另一方面,在许多应用程序中使用的传统(单片数据)方法是有一个单一的集中式数据库或只有几个数据库。这通常是一个标准化的SQL数据库,用于整个应用程序及其所有内部子系统,如图4-7所示。


传统方式数据管理


微服务的数据方式


在传统方法中,所有服务共享一个数据库,通常是在分层体系结构中。在微服务方法中,每个微服务都拥有其模型/数据。集中式数据库方法最初看起来更简单,似乎可以重用不同子系统中的实体,使所有内容保持一致。但实际情况是,最终会出现大量的表,这些表服务于许多不同的子系统,其中包括在大多数情况下不需要的属性和列。这就像试图使用相同的物理地图徒步走一小段路,坐一天的汽车旅行,学习地理知识。


通常只有一个关系数据库的单片应用程序有两个重要的好处:ACID事务和SQL语言,它们都可以跨与应用程序相关的所有表和数据工作。这种方法提供了一种轻松编写查询的方法,该查询组合来自多个表的数据。


然而,当您转到微服务体系结构时,数据访问变得更加复杂。即使在微服务或有界上下文中使用ACID事务,也必须考虑每个微服务拥有的数据是该微服务的私有数据,并且只能通过其API端点(REST、gRPC、SOAP等)同步访问,或通过消息传递(AMQP或类似)异步访问。


封装这些数据可以确保微服务是松散耦合的,并且可以彼此独立地发展。如果多个服务访问同一数据,架构更新将需要对所有服务进行协调更新。这将打破微服务生命周期的自主性。但是分布式数据结构意味着您不能跨微服务进行单个ACID事务。这反过来意味着您必须在业务流程跨越多个微服务时使用最终一致性。这比简单的SQL连接更难实现,因为您不能创建完整性约束或在单独的数据库之间使用分布式事务,我们稍后将解释这一点。类似地,许多其他关系数据库特性在多个微服务中不可用。


更进一步说,不同的微服务通常使用不同类型的数据库。现代应用程序存储和处理各种类型的数据,关系数据库并不总是最佳选择。对于某些用例,NoSQL数据库(如Azure CosmosDB或MongoDB)可能比SQL数据库(如SQL Server或Azure SQL数据库)具有更方便的数据模型,并提供更好的性能和可伸缩性。在其他情况下,关系数据库仍然是最好的方法。因此,基于微服务的应用程序通常使用SQL和NoSQL数据库的混合,这有时被称为polyglot持久化方法。


用于数据存储的分区多时隙持久化体系结构有许多好处。其中包括松散耦合的服务和更好的性能、可伸缩性、成本和可管理性。但是,它可以引入一些分布式数据管理挑战,如本章后面的“确定域模型边界”中所述。


微服务与有界上下文模式的关系

微服务的概念源自域驱动设计(DDD)中的有界上下文(BC)模式。DDD通过将大型模型划分为多个bc并明确它们的边界来处理它们。每个BC都必须有自己的模型和数据库;同样,每个微服务都拥有自己的相关数据。此外,每个BC通常都有自己的通用语言来帮助软件开发人员和领域专家之间的通信。

泛在语言中的这些术语(主要是域实体)在不同的有界上下文中可以有不同的名称,即使不同的域实体共享相同的标识(即用于从存储中读取实体的唯一ID)。例如,在用户配置文件有界上下文中,用户域实体可以在顺序有界上下文中与买方域实体共享标识。


因此,微服务就像一个有界上下文,但它也指定它是一个分布式服务。它被构建为每个有界上下文的单独进程,并且必须使用前面提到的分布式协议,如HTTP/HTTP s、WebSockets或AMQP。然而,有界上下文模式并没有指定有界上下文是分布式服务还是仅仅是单片部署应用程序中的逻辑边界(如通用子系统)。


需要强调的是,为每个有界上下文定义服务是一个很好的起点。但你不必把你的设计局限于此。有时,必须设计由多个物理服务组成的有界上下文或业务微服务。但归根结底,模式限制上下文和微服务都是密切相关的。

DDD通过以分布式微服务的形式获得真正的边界而从微服务中获益。但是,在有限的上下文中,不在微服务之间共享模型等想法也是您所希望的。


额外资源

相关文章
|
2天前
|
消息中间件 监控 架构师
构建高效微服务架构:从理论到实践
【5月更文挑战第30天】 在当今快速迭代和竞争激烈的软件市场中,微服务架构以其灵活性、可扩展性和独立部署能力受到企业的青睐。然而,随着服务的增多,确保系统的高效性和稳定性成为开发团队必须面对的挑战。本文将深入探讨构建高效微服务架构的关键策略,包括服务划分、通信机制、数据一致性和容错处理,并通过具体实例分析如何在不牺牲系统性能的前提下实现服务的解耦与自治。文章旨在为开发人员和架构师提供一套实用的方法论,帮助他们在设计和维护微服务系统时做出明智的决策。
|
2天前
|
Kubernetes 开发者 Docker
构建高效微服务架构:Docker与Kubernetes的协同应用
【5月更文挑战第30天】 在当今软件开发领域,微服务架构已成为实现系统模块化、提升可维护性及扩展性的关键策略。本文深入探讨了如何通过Docker容器化技术和Kubernetes集群管理,共同构建一个既高效又可靠的后端微服务环境。我们将剖析Docker和Kubernetes的核心功能,以及它们如何相辅相成,支撑起现代化的云原生应用程序部署和管理。文章还将提供具体实践案例,帮助开发者理解将理论应用于实际开发过程中的步骤和考虑因素。
|
2天前
|
消息中间件 Java 数据库
构建高效可靠的微服务架构:后端开发的终极指南
【5月更文挑战第30天】 随着现代软件开发的复杂性日益增加,微服务架构已成为组织解决庞大系统问题的有效手段。本文将深入探讨如何构建一个既高效又可靠的微服务系统,涉及关键组件的选择、网络通信的最佳实践以及保证系统稳定性的策略。通过一系列实际案例与性能分析,我们将揭示后端开发在设计微服务时必须考虑的核心要素,并提供一套综合性解决方案,以指导读者实现强大的后端架构。
|
2天前
|
监控 数据管理 开发者
构建高效微服务架构:后端开发的现代实践
【5月更文挑战第30天】 在当今软件开发领域,微服务架构已成为提高系统可维护性、扩展性和开发效率的关键方案。本文深入探讨了构建高效微服务架构的策略,包括服务划分原则、通信机制、数据管理以及持续集成与部署的最佳实践。通过分析具体案例和最新技术趋势,文章旨在为后端开发者提供一套全面的指导,帮助他们在不断变化的技术环境中保持竞争力。
|
2天前
|
监控 关系型数据库 持续交付
构建高效微服务架构:后端开发的最佳实践
【5月更文挑战第30天】随着现代应用的复杂性日益增加,微服务架构已成为众多企业和开发者的首选。本文将深入探讨如何构建一个高效的微服务系统,包括关键的设计原则、技术栈选择、以及确保系统稳定性和扩展性的实践方法。我们将通过实际案例分析,揭示后端开发中实现敏捷性和可维护性的策略,为追求卓越的软件工程师提供实用的指导。
|
2天前
|
运维 负载均衡 安全
探索微服务架构下的服务网格
【5月更文挑战第30天】 在当今日益复杂的分布式系统设计中,微服务架构已成为一种主流解决方案。然而,随着服务的增多和网络交互的复杂化,传统的服务发现与负载均衡机制变得不再适应。本文将探讨服务网格这一创新概念,它是一种专门针对微服务架构设计的基础网络设施,旨在提供更高效、动态且可靠的服务间通信。通过分析其工作原理及带来的优势,我们将深入了解服务网格如何简化微服务的管理并提升系统的整体性能。
|
2天前
|
设计模式 JavaScript Java
构建高效微服务架构:后端开发的新范式
【5月更文挑战第30天】 在现代软件开发的快速演变中,微服务架构已经成为推动技术创新和服务模块化的关键驱动力。本文将深入探讨如何构建一个高效的微服务架构,涵盖从基本概念理解到实践应用的全方位分析。我们将讨论微服务的核心原则、设计模式、技术栈选择以及它们如何促进系统的可伸缩性、灵活性和容错能力。通过具体案例研究和最佳实践分享,文章旨在为后端开发者提供一套实用的指南,帮助他们在构建和维护复杂系统时做出明智决策。
|
2天前
|
存储 设计模式 运维
探索微服务架构下的系统监控策略
【5月更文挑战第30天】 在当今的软件开发领域,微服务架构已成为一种流行的设计模式,它通过将应用程序拆分为一系列小型、松耦合的服务来提高系统的可维护性和扩展性。然而,这种分布式的特性也带来了新的挑战,尤其是在系统监控方面。本文将深入探讨在微服务架构下,如何实施有效的系统监控策略,确保服务的高可用性和性能优化。我们将讨论监控的关键指标、工具选择以及面对复杂微服务环境下的监控策略设计。
|
2天前
|
负载均衡 监控 API
微服务架构中的API网关模式
本文将深入探讨微服务架构中的一个重要组件——API网关。我们将了解API网关的作用、实现方式以及它如何提高系统的可扩展性和安全性。通过实际案例分析,我们将展示API网关在微服务架构中的应用和优势。
|
12天前
|
Prometheus 监控 Cloud Native
构建高效稳定的Docker容器监控体系
【5月更文挑战第20天】 在微服务架构日益普及的今天,Docker作为其重要的实现技术之一,承载着大量应用的运行。然而,随之而来的是对于容器健康状态、资源使用情况以及性能指标的监控需求急剧增加。本文旨在探讨构建一个高效且稳定的Docker容器监控体系,不仅涵盖了监控工具的选择与配置,还详细阐述了监控数据的分析与处理流程。通过精心设计的监控策略和实时响应机制,我们能够确保系统的稳定性,并及时发现及处理潜在的问题。