「第二部:容器和微服务架构」(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通过以分布式微服务的形式获得真正的边界而从微服务中获益。但是,在有限的上下文中,不在微服务之间共享模型等想法也是您所希望的。


额外资源

相关实践学习
体验RDS通用云盘核心能力
本次实验任务是创建一个云数据库RDS MySQL(通用云盘),并通过云服务器ECS对RDS MySQL实例进行压测,体验IO加速和IO突发带来的性能提升;并通过DMS执行DDL,将数据归档到OSS,再结合云盘缩容,体验数据归档带来的成本优势。
目录
打赏
0
0
0
0
110
分享
相关文章
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——封装统一返回的数据结构
本文介绍了在Spring Boot中封装统一返回的数据结构的方法。通过定义一个泛型类`JsonResult<T>`,包含数据、状态码和提示信息三个属性,满足不同场景下的JSON返回需求。例如,无数据返回时可设置默认状态码"0"和消息"操作成功!",有数据返回时也可自定义状态码和消息。同时,文章展示了如何在Controller中使用该结构,通过具体示例(如用户信息、列表和Map)说明其灵活性与便捷性。最后总结了Spring Boot中JSON数据返回的配置与实际项目中的应用技巧。
98 0
|
25天前
|
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——使用 fastJson 处理 null
本文介绍如何使用 fastJson 处理 null 值。与 Jackson 不同,fastJson 需要通过继承 `WebMvcConfigurationSupport` 类并覆盖 `configureMessageConverters` 方法来配置 null 值的处理方式。例如,可将 String 类型的 null 转为 "",Number 类型的 null 转为 0,避免循环引用等。代码示例展示了具体实现步骤,包括引入相关依赖、设置序列化特性及解决中文乱码问题。
51 0
|
25天前
|
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——Spring Boot 默认对Json的处理
本文介绍了在Spring Boot中返回Json数据的方法及数据封装技巧。通过使用`@RestController`注解,可以轻松实现接口返回Json格式的数据,默认使用的Json解析框架是Jackson。文章详细讲解了如何处理不同数据类型(如类对象、List、Map)的Json转换,并提供了自定义配置以应对null值问题。此外,还对比了Jackson与阿里巴巴FastJson的特点,以及如何在项目中引入和配置FastJson,解决null值转换和中文乱码等问题。
55 0
云原生时代的应用架构演进:从微服务到 Serverless 的阿里云实践
云原生技术正重塑企业数字化转型路径。阿里云作为亚太领先云服务商,提供完整云原生产品矩阵:容器服务ACK优化启动速度与镜像分发效率;MSE微服务引擎保障高可用性;ASM服务网格降低资源消耗;函数计算FC突破冷启动瓶颈;SAE重新定义PaaS边界;PolarDB数据库实现存储计算分离;DataWorks简化数据湖构建;Flink实时计算助力风控系统。这些技术已在多行业落地,推动效率提升与商业模式创新,助力企业在数字化浪潮中占据先机。
64 12
|
25天前
|
微服务——MongoDB的数据模型
MongoDB采用文档(document)作为最小存储单位,类似关系型数据库中的行,使用BSON(Binary-JSON)格式存储数据。BSON是JSON的二进制扩展,支持内嵌文档和数组,新增了如Date、BinData等特殊数据类型,具有轻量、高效、可遍历的特点,适合非结构化与结构化数据存储。其灵活性高,但空间利用率略低。BSON数据类型包括string、integer、boolean等基本类型及date、object id等扩展类型。
42 0
基于阿里云容器服务Kubernetes版(ACK)的微服务架构设计与实践
本文介绍了如何基于阿里云容器服务Kubernetes版(ACK)设计和实现微服务架构。首先概述了微服务架构的优势与挑战,如模块化、可扩展性及技术多样性。接着详细描述了ACK的核心功能,包括集群管理、应用管理、网络与安全、监控与日志等。在设计基于ACK的微服务架构时,需考虑服务拆分、通信、发现与负载均衡、配置管理、监控与日志以及CI/CD等方面。通过一个电商应用案例,展示了用户服务、商品服务、订单服务和支付服务的具体部署步骤。最后总结了ACK为微服务架构提供的强大支持,帮助应对各种挑战,构建高效可靠的云原生应用。
基于阿里云容器服务(ACK)的微服务架构设计与实践
本文介绍如何利用阿里云容器服务Kubernetes版(ACK)构建高可用、可扩展的微服务架构。通过电商平台案例,展示基于Java(Spring Boot)、Docker、Nacos等技术的开发、容器化、部署流程,涵盖服务注册、API网关、监控日志及性能优化实践,帮助企业实现云原生转型。
微服务引擎 MSE:打造通用的企业级微服务架构
微服务引擎MSE致力于打造通用的企业级微服务架构,涵盖四大核心内容:微服务技术趋势与挑战、MSE应对方案、拥抱开源及最佳实践。MSE通过流量入口、内部流量管理、服务治理等模块,提供高可用、跨语言支持和性能优化。此外,MSE坚持开放,推动云原生与AI融合,助力企业实现无缝迁移和高效运维。
126 1
智慧工地云平台的技术架构解析:微服务+Spring Cloud如何支撑海量数据?
慧工地解决方案依托AI、物联网和BIM技术,实现对施工现场的全方位、立体化管理。通过规范施工、减少安全隐患、节省人力、降低运营成本,提升工地管理的安全性、效率和精益度。该方案适用于大型建筑、基础设施、房地产开发等场景,具备微服务架构、大数据与AI分析、物联网设备联网、多端协同等创新点,推动建筑行业向数字化、智能化转型。未来将融合5G、区块链等技术,助力智慧城市建设。
102 0
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
262 24

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等