如何在微服务架构下进行数据设计?

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 微服务是一个软件架构模式,对微服务的讨论大多集中在容器或其他技术是否能很好的实施微服务这些方面。本文将从以下几个角度来和大家分享在微服务架构下进行数据设计需要关注的地方,旨在帮助大家在构建微服务架构时,提供一个数据方面的视角:● 什么是微服务 ● 微服务的优势及架构特点 ● 微服务架构下的数据设计 ● 一个适合微服务架构的数据库1 什么是微服务按照 Martin Fowler 的定义,微服务是一个软件架构模式,通过开发一系列的小型服务的方式来实现一个应用。

微服务是一个软件架构模式,对微服务的讨论大多集中在容器或其他技术是否能很好的实施微服务这些方面。

本文将从以下几个角度来和大家分享在微服务架构下进行数据设计需要关注的地方,旨在帮助大家在构建微服务架构时,提供一个数据方面的视角:

什么是微服务
● 微服务的优势及架构特点
● 微服务架构下的数据设计
● 一个适合微服务架构的数据库

1 什么是微服务

按照 Martin Fowler 的定义,微服务是一个软件架构模式,通过开发一系列的小型服务的方式来实现一个应用。每一个这样的小服务通常都是运行在自己的进程里面,并且通过轻量级的HTTP API 方式进行通讯。

这些服务通常会以业务模块为界限,能够被单独开发部署,往往都会用自动化的部署工具来进行产品的发布。通过使用微服务方法,大公司可以更快推出新产品和服务,使得开发团队与业务目标保持一致。

2 微服务的优势

微服务方法体现出许多优势,包括更快的上线时间、灵活性、弹性、一致性以及相对更低的成本。

更快的上线时间

实施微服务架构可以使组织更快地将应用程序推向市场。对整体应用程序的更改(即使很小)需要重新部署整个应用程序堆栈,从而引入风险和复杂性。

相反,服务的更新可以立即提交、测试和部署,对个别服务的更改不会影响系统的其他部分。

更好的灵活性和可扩展性

微服务方法在扩展应用程序时也提供了灵活性。单片应用程序要求整个系统(及其所有功能)同时扩展。

使用微服务,只需要缩放需要额外性能的组件或功能。可以通过部署更多微服务实例来扩展服务范围,从而实现更有效的容量规划并降低软件许可成本,从而降低总体拥有成本。

弹性

使用单体应用程序时,组件的故障可能会危及整个应用程序。在微服务中,每项服务都是隔离的,以防止级联失败导致整个系统崩溃。如果单个微服务的所有实例均失败,则整体服务可能会降级,但其他组件仍可提供有价值的服务。

更容易的规模化

微服务使技术团队能够与组织需求保持一致,并且可以调整团队的大小以匹配所需的任务。通常,微服务团队规模较小,但是跨部门(如一般涵盖Ops、Dev、QA),并专注于整个应用程序的单个组件。

通过提供对个人服务的所有权,而不是功能区域,微服务还可以打破团队之间的孤岛,并改善协作。这种方法对于分布式和远程团队尤其强大。 例如,不同地点的团队可以独立发布和部署功能。

3 微服务的技术特点

让我们通过一个例子来了解微服务架构的技术特点。联邦银行的架构师 Jonnathan 非常不喜欢他的产品经理 Mandy,因为他觉得 Mandy 永远有无穷无尽的想法要实现,搞得他成天就在不断地修改代码。

但是 Mandy 是老板的红人,而且用户对产品的反响也不错,所以很多时候他只能默默的服从。这一天 Mandy 又成功的说服了老板要在他们的客户体验提升项目中增加舆情分析和 AI 客户服务模块,希望通过对社交媒体上有关联邦银行的所有评论进行实时的监控和分析来及时发现联邦银行的产品反馈或者用户体验问题。

Jonnathan已经预感到了这样前所未有的应用场景,会有太多的未知和太多的改变,于是这次决定尝试使用 Microservices 来构建这个应用。这个是 Jonnathan 设计的架构,系统要求对客户的社交账号,如Facebook、Twitter、Google+ 及 Snapchat 公开的信息及评论进行收集,并在某些合适的时候使用 AI 技术直接和用户通过社交工具进行互动。
详情了解https://dwz.cn/uTp9HTyM
image

在上图这个架构里面,Jonnathan 把4个不同社交媒体的数据采集和交互用 4 个独立的模块进行实现。并用一个 Feed Merge 服务,一个 Aggregate Service 把 4 个类似功能的微服务模块的数据和功能进行整合,提供给分析平台使用。

这里面每一个服务按照微服务的架构,每一个都是单独部署,在一个独立的容器内执行,并使用自己的一个数据库。

果不其然,系统上线一段时间后,Mandy 说 Google+ 上面几乎没有什么活动,不值得继续维护这样的一套系统。Jonnathan 这次毫无抱怨,直接把负责 Google+ 的容器停了,没有需要任何代码改动,甚至完全没有需要对整个系统进行停机。

image

刚下线 Google+,Mandy 又来提需求说最近合并了另一家银行,客户很多使用 Whatsapp。二话不说,Jonnathan 直接上了一个新的模块来处理 Whatsapp ,如下图。

image

又过了一段时间,这一次是他自己要对系统做调整了,原来 Snapchat 最近大火,他部署的系统频受压力,性能下降。为了解决这个问题,Jonnathan 果断增加了额外 2 台容器来同时支撑 Snapchat 信息的采集和处理。
image

感谢微服务架构,Jonnathan 在一系列的产品需求变化以及系统扩容需求下,可以从容应付。要实现微服务架构,需要你铭记以下几个微服务架构的应用设计原则。
image

解耦

在微服务架构中,应用程序被分解为小型的独立服务。服务通常专注于特定的离散目标或功能,并沿着业务边界解耦。按业务界限分离服务可让团队专注于正确的目标,并确保服务之间的自主性。

每项服务都是独立开发,测试和部署的,服务通常是作为独立的进程或软件容器分开的,通过网络和商定的 API 进行通信,尽管在某些情况下,网络可能在本地。通常部署相同微服务的多个实例,从而提供冗余和可扩展性。

轻量级 API

微服务之间的通信要使用轻量级 API,如 HTTP RESTful API。这样可以使得服务对 API 通信方案的依赖减到最小。

复杂的通信处理要在服务端进行,而不是像 ESB 或者 Data Pipeline 处理总线那样在数据传输过程中引入非常多的逻辑,导致微服务模块紧紧的绑定在这个数据管道上。

持续发布

微服务架构带来的一个非常显著的负面性就是众多实例的测试发布及管理。传统应用虽然开发复杂,但是部署和运维相对比较集中,一台数据库,2-4 个应用服务器就差不多了。但是微服务架构下单独服务的数量轻则 10-20,多则上百个,所以微服务架构一般需要配套的 CI/CD 方法来支撑。

数据与治理

数据的管理在微服务架构下也是和传统单体有很大的不同考量。大部分时候我们希望数据就和服务一样,要有充分的独立性,可以和某个服务一起部署,一起扩展,或者一起重构。

这通常意味着我们可能要在一个微服务架构应用内使用多个数据库实例。但是同样需要考虑到数据分布在多实例之间以后,往往还需要一些冗余,以及如何保持这些数据在这些系统中的一致性等问题。下面我们就着重来讨论微服务架构下的数据设计的一些考量因素。

4 微服务架构下的数据设计

从来没有一个 one-size-fits-all 的架构,所以在微服务架构下面,我们需要了解的,一样是几个关键的架构考量点。然后针对自己的实际应用,选择哪些考量点是更加重要的。

这篇文章的目的,主要就是跟大家来讨论从哪几个角度着手,来设计一个符合微服务架构原则的数据架构。比如说,我们可以从一系列的问题来开始这个讨论。

● 这么多微服务之间,我是否可以用一个数据库,还是多个数据库来支持多个微服务?
● 如果是多个数据库,我是否为每一个微服务挑选一个最合适的数据库,还是选择同一种类型的数据库?
● 我如何在微服务架构下扩展我的数据库?
● 当一个我依赖的服务需要修改数据库 Schema 的时候,是否会影响到我?
● 当微服务应用不断衍变的时候,我的数据库是否可以快速的响应应用需求变化?以上这些就是我们在微服务数据架构时候要关注的地方。
一库一服还是一库多服

无论是单体应用,还是微服务应用,有一点是肯定的:应用的各个模块之间都需要进行较为频繁的通信,通过一起协同合作,来实现应用的整体价值。

在单体应用中,这种通信是通过方法调用来完成的。在微服务中,则通过 API 调用来完成。这些模块或者服务间调用,大部分时候是为了共享数据。

共享数据最贱的方式当然就是采用一种共享数据库的模式,也就是单体应用常用的方式。应用可以有多个系统模块,但一般都是只有一个数据库。如下图左边,3 个微服务模块,后面共享一个数据库,简称一库多服务。

image

这种架构模式通常会被认为是微服务架构下的反范式,它的问题在于:

● 单点故障:一个数据库倒下,整批服务全部停止。何来的服务独立性?
● 数据在同一个地方,会给贪图方便的开发或者 DBA 工程师编写很多数据间高度依赖的程序或者工具。
● 无法针对某一个服务进行精准优化或扩展,如上文所讲的 Snapchat 的例子。
所以一般推荐的做法,是为每一个微服务准备一个单独的数据库,也即一库一服(Database per Service)模式。如上图右侧所示。这种模式更加适合微服务架构,它满足每一个服务是独立开发、独立部署、独立扩展的特性。

需要对一个服务进行升级或者数据架构改动的时候,不会影响到其他的服务。需要对某个服务进行扩展的时候,也可以手术式的对某一个服务进行局部扩容。另外,如果某些服务对数据库有特殊的需求,这种模式也为下文所讲的混合持久化(Polyglot Persistence)提供了可能性。

混合持久化 vs 多模数据库

混合持久化在大型互联网公司是一个比较风行的模式。它秉承的原则就是为特别的任务提供最好的工具。比如说,如果我希望提供一个高并发低延迟的共享用户会话方案(Shared Session Storage), Redis 可能是一个非常理想的选择。

如果我是在实现一个产品目录,涉及到大量不定结构的商品数据及属性的建模管理,我可能会采用模式灵活,动态 Schema 的 MongoDB 来作为我的数据库解决方案。如果我希望支持非常强大的全文搜索,ElasticSearch 则是行业中的佼佼者。

image

微服务的功能分块独立部署为这种架构模式提供了非常好的基础,如上图左侧所示就是个典型的混合持久化的案例:

混合持久化:Polyglot Persistence

多模数据库:Multi- model Database

当然,有句话说的是架构师的工作就是每天做不断的取舍(Trade Off),因为选择往往是让人很纠结。混合持久化的优势很明显,可以让每个单独的服务使用到最佳的工具和技术。

但是它的弊端也是不容忽视:部署、监控、备份、升级等数据库管理工作从来都是一件困难但是重要的任务。引入多个不同的数据库,也意味着对系统管理维护的复杂度和成本提高了很多。

这种情况下可能需要比较有资源的公司或者团队才可以使用。这也解释了这个模式为何在大型互联网公司得到较多的采用与推广。

针对于其他小型规模的用户,或者是缺乏足够掌握各种新型技术人才的公司来说,另一种更为可行的模式可能是多模数据库(Multi-model)。如上图右侧所示,多模数据库的特征是:

● 依然是一库一服务(为一个服务部署一个单独的数据库)。
● 但是使用的是同一种类型,支持多种场景的数据库,如 NoSQL 中间为功能最全面的 MongoDB。
● 虽然是多实例,但是只需维护一种类型的数据库,管理上和人员配备上都较为简单。
如果你在开发的应用是一款企业级产品,会交付到客户环境部署安装,则运维管理的简单性将在技术选型中占据非常重要的一个比重,无疑这种情况下多模数据库更加适用。

微服务扩展你的数据

微服务架构的一大裨益是其灵活的扩展性。以上面的 Snapchat 为例,如果需要采集或处理的数据量快速增长,在我们增加应用服务实例的同时,支撑数据存储的模块也要相应扩充。

image

AFK Partners 在他们的 Scale Cube 一文里对性能扩展提出了这样的观点,要设计一个真正意义上的可扩展系统,我们必须考虑3个维度,如上图所示:

● X 轴,系统复制(横向扩展)
● Y 轴,非重叠功能的拆分(微服务)
● Z 轴,数据的分区(Sharding)
一个好的数据架构,在微服务体系内,应该具有同样的可扩展、易扩展性质,从而不给微服务架构拖后腿。关于数据分区扩展有两种做法:

● 应用数据分区
● 数据库分区
应用数据分区,顾名思义,就是在应用端对数据的存储进行分区管理。比如说,一个社交应用可以按国家或地区为界把用户的数据分发到不同数据库实例里面。这样的话每个数据库实例只需要存储一部分数据,从而实现海量的数据管理能力。

数据库分区,就是由数据库的路由节点来完成数据分区的任务。数据库分区的优势是显然的,它对应用透明、扩展快速、无须下线等。如果你的应用有潜在扩充的需求,选择一个能够自动扩展的分布式数据库是一个比较明智的选择。

动态模式支持及快速开发能力

这是一个很多架构师可能会忽略,但是非常重要的关注点。我们在迭代式开发 DevOps 微服务上的很多努力,都是为了快速开发,快速上线,以及快速响应变化的需求。

从数据架构师的角度来看,如何不成为在这个快速开发方法模式中的一个瓶颈,有一个很重要的环节就是是否有一个能够及时响应变化的数据模型。

传统的数据库都是强模式,需要对 Schema 进行清晰定义, 在需求修改导致模型修改的时候需要对数据库进行模式升级,是一个需要下线、耗时并且是高成本的运维操作。

image

在新一代的 NoSQL 数据库产生之前,我们并不需要考虑这个问题,但是以 MongoDB、Cassandra 等为代表的 NoSQL 代表的是灵活建模。

动态支持模式变化的特征使得它们成为敏捷开发和微服务体系内一个有力的竞争者,在选型的时候也是一个重要的考量因素之一。我们说一库一服的架构使得对一个服务的数据库模式修改不会影响到其他服务。

但是如果使用一个动态模式(有时候有人会说无模式)的数据库,则在该服务本身模式修改的时候也可以最小化运维成本。

一个适合微服务架构的数据库

红杉资本的合伙人 Matt Miller 是公认的微服务技术领域专家。他广被传播的“微服务生态图”详尽的列出了微服务架构的相关技术栈。在这里他推荐了 MongoDB 作为主要的数据管理方案。

image

MongoDB 是一个分布式文档型数据库,它有以下特性使它非常适合于微服务架构,其主要特点包括: 多模数据库(Multi-model)、原生 JSON 数据结构API、动态模式、无模式(Dynamic schema)、数据变化流(Change Stream)、横向扩展能力(Sharding)。

多模数据库

MongoDB 从 3.4 版本起在多模数据库场景上提供了不少功能模块,比如说,使用聚合框架。现在开发者可以使用:

● $graphLookup 来实现类似于图数据库的查询。
● $facet 来实现分面搜索。
● 内存引擎功能,用于支持类似于 Redis 的高速缓存。
● 全文检索,用于实现搜索类型场景。
动态模式

这一点一直是 MongoDB 获得开发者青睐的主要原因之一。MongoDB 无须显式的定义数据模式即可让你开始往数据库写入。

当数据模型有变化时候,比如说在迭代式开发中非常常见的就是增加一些字段,MongoDB 数据库不需要对其进行修改 Schema 操作,而是可以直接在同一个集合(表)里直接写入新版本的文档。这个对于需要实现快速迭代,快速交付的微服务应用开发是一个非常重要的特性。
image

数据变化流

微服务架构中由于其分布特性,传统的强事务机制不再适用。数据的一致性一般需要通过一些基于 Event Sourcing 或者事件驱动模型的解决方案。Mongo DB 3.6 版本推出的数据更改流,可以用来实现一个类似于 Kafak 一样的 Message Queue,为各个微服务间的数据协调提供一个简单易用的线程方案。

横向扩展能力

MongoDB 一向以其强大的横向扩展能力著称。不少 MongoDB 用户迁移的主要原因就是使用 MongoDB 的 Sharding 技术可以突破关系型数据库在数据量和性能上的瓶颈。
image

MongoDB 的 Sharding 有几个特征使得其非常适合微服务架构使用:

● 弹性扩展:可以扩容也可以缩容。
● 无缝扩展:无须停机,就可在线扩容。
● 自动均衡:无须应用参与即可实现数据的自动均衡,完全透明。一个基于 MongoDB 的微服务参考架构图。
image

详细了解更多内容可点击查看

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
9天前
|
API 数据库 开发者
构建高效可靠的微服务架构:后端开发的新范式
【4月更文挑战第8天】 随着现代软件开发的复杂性日益增加,传统的单体应用架构面临着可扩展性、维护性和敏捷性的挑战。为了解决这些问题,微服务架构应运而生,并迅速成为后端开发领域的一股清流。本文将深入探讨微服务架构的设计原则、实施策略及其带来的优势与挑战,为后端开发者提供一种全新视角,以实现更加灵活、高效和稳定的系统构建。
16 0
|
8天前
|
Kubernetes 安全 Java
构建高效微服务架构:从理论到实践
【4月更文挑战第9天】 在当今快速迭代与竞争激烈的软件市场中,微服务架构以其灵活性、可扩展性及容错性,成为众多企业转型的首选。本文将深入探讨如何从零开始构建一个高效的微服务系统,覆盖从概念理解、设计原则、技术选型到部署维护的各个阶段。通过实际案例分析与最佳实践分享,旨在为后端工程师提供一套全面的微服务构建指南,帮助读者在面对复杂系统设计时能够做出明智的决策,并提升系统的可靠性与维护效率。
|
2天前
|
监控 JavaScript 安全
构建微服务架构下的API网关
【4月更文挑战第15天】在微服务架构中,API网关扮演着至关重要的角色。它作为系统的唯一入口,不仅负责请求的路由、负载均衡和认证授权,还涉及到监控、日志记录和服务熔断等关键功能。本文将探讨如何构建一个高效且可靠的API网关,涵盖其设计原则、核心组件以及实现策略,旨在为后端开发人员提供一套实用的指导方案。
14 4
|
3天前
|
监控 负载均衡 API
构建高性能微服务架构:后端开发的最佳实践
【4月更文挑战第14天】 在当今快速发展的软件开发领域,微服务架构已成为构建可扩展、灵活且容错的系统的首选方法。本文深入探讨了后端开发人员在设计和维护高性能微服务时需要遵循的一系列最佳实践。我们将从服务划分原则、容器化部署、API网关使用、负载均衡、服务监控与故障恢复等方面展开讨论,并结合实际案例分析如何优化微服务性能及可靠性。通过本文的阅读,读者将获得实施高效微服务架构的实用知识与策略。
|
5天前
|
运维 监控 自动驾驶
构建可扩展的应用程序:Apollo与微服务架构的完美结合
构建可扩展的应用程序:Apollo与微服务架构的完美结合
27 10
|
11天前
|
运维 负载均衡 网络协议
探索微服务架构下的服务发现机制
【4月更文挑战第6天】 随着现代软件工程的发展,微服务架构因其灵活性、可扩展性而日益受到重视。在此架构模式下,服务发现成为了确保系统高可用性和弹性的关键组件。本文将深入探讨微服务环境中服务发现的核心概念、实现方式以及面临的挑战,旨在为开发者提供一套明晰的服务发现指南和实践建议。
|
15天前
|
负载均衡 网络协议 Java
构建高效可扩展的微服务架构:利用Spring Cloud实现服务发现与负载均衡
本文将探讨如何利用Spring Cloud技术实现微服务架构中的服务发现与负载均衡,通过注册中心来管理服务的注册与发现,并通过负载均衡策略实现请求的分发,从而构建高效可扩展的微服务系统。
|
23天前
|
负载均衡 测试技术 持续交付
高效后端开发实践:构建可扩展的微服务架构
在当今快速发展的互联网时代,后端开发扮演着至关重要的角色。本文将重点探讨如何构建可扩展的微服务架构,以及在后端开发中提高效率的一些实践方法。通过合理的架构设计和技术选型,我们可以更好地应对日益复杂的业务需求,实现高效可靠的后端系统。
|
23天前
|
监控 持续交付 API
构建高效可扩展的微服务架构
在当今快速迭代和竞争激烈的软件市场中,构建一个高效、可扩展且易于维护的后端系统变得尤为重要。微服务架构作为一种流行的分布式系统设计方式,允许开发者将应用程序划分为一系列小型、自治的服务,每个服务负责执行特定的业务功能。本文将探讨如何利用现代技术栈搭建一个符合这些要求的微服务架构,并讨论其潜在的挑战与解决方案。我们将涵盖服务划分策略、容器化、服务发现、API网关、持续集成/持续部署(CI/CD)以及监控和日志管理等关键主题,以帮助读者构建出既可靠又灵活的后端系统。
|
25天前
|
监控 Kubernetes 持续交付
构建高效可扩展的微服务架构:后端开发实践指南
在数字化转型的浪潮中,企业对软件系统的要求日益提高,追求快速响应市场变化、持续交付价值成为核心竞争力。微服务架构以其灵活性、模块化和独立部署的特点,成为解决复杂系统问题的有效途径。本文将深入探讨如何构建一个高效且可扩展的微服务架构,涵盖关键设计原则、技术选型及实践案例,为后端开发者提供一条清晰的指导路线,帮助其在不断变化的技术环境中保持竞争力。
126 3