单体到微服务:电商平台架构的演变与可扩展性探索
目录
一、整体理解可扩展性
二、从电商平台架构发展看架构的可扩展性
(一)单体架构
(二)分布式架构
(三)SOA架构
(四)微服务架构
三、1号店App服务端架构升级说明
(一)V1.0架构
(二)V2.0架构
(三)V3.0架构
四、中台架构
(一)中台的定位与适用说明
中台定位
中台的适用性
(二)典型业务中台的结构:微服务的升级
通用基础业务平台
通用聚合服务层
通用中间件平台
(三)落地中台
渠道&应用
应用平台
业务中台
后台
(四)常见的中台名词及其定位
五、总结
参考文章链接及推荐阅读
干货分享,感谢您的阅读!
在快速发展的电商领域,如何应对激增的用户需求和不断变化的市场环境,成为了企业成功的关键。在这个过程中,架构的选择与设计起着至关重要的作用。本文将探讨1号店如何从传统的单体架构演变为灵活高效的微服务架构,以应对日益增长的业务需求。通过对这一转型过程的深入分析,我们将揭示可扩展性架构设计的核心原则,帮助电商平台在竞争激烈的市场中立于不败之地。无论你是技术从业者还是商业决策者,这篇文章都将为你提供宝贵的洞见和实践经验,让我们一起揭开电商架构演变的面纱。
一、整体理解可扩展性
可扩展性是软件架构中至关重要的特性,它确保系统能够在需求增长和规模扩大的情况下保持高效运行。
为实现可扩展性,首要考虑模块化设计,将系统分解为独立、低耦合的模块,使得扩展时能够有针对性地进行修改而不影响整体。同时,水平扩展和垂直扩展是两种常见的扩展策略,前者通过增加节点或服务器来分担负载,后者则通过提升单节点性能来处理更多请求。
弹性设计是实现可扩展性的关键,系统需要能够动态地分配和释放资源,以适应负载的波动。采用服务化架构,将系统拆解成小型服务单元,有助于独立开发和扩展。引入缓存和异步处理提高系统的响应性,而容器化和微服务则为部署和扩展提供了更便捷的方式。自动化工具和监控系统的使用可以实现对系统性能和负载的实时管理,确保系统在变化的环境中保持高效。
总体而言,良好的可扩展性设计是系统开发的核心目标,它赋予系统灵活性和高效性,使其能够适应未来的需求变化。
二、从电商平台架构发展看架构的可扩展性
国内电商平台架构发展的大致过程可参考如下:
(一)单体架构
单体架构是一种传统的软件设计模式,其中整个应用程序由一个单一的、紧密耦合的单元构成。在这种架构下,所有代码运行在一个进程中,而所有的数据通常存储在一个数据库中。
从上图中解释内容如下:
层级 | 表示层 | 业务层 | 数据访问层 | 数据库层 |
---|---|---|---|---|
责任 | 处理用户请求、展示数据,用户交互逻辑 | 实现应用核心业务逻辑,处理用户请求,执行业务规则和流程协调 | 管理与数据库交互,包括数据读取、写入、更新 | 存储应用数据,提供数据有效管理和检索 |
实现 | 前端框架、UI组件、处理用户输入和输出的业务逻辑 | 服务、业务逻辑组件、工具类,处理业务规则和逻辑 | 数据访问对象(DAO)、ORM工具,解耦业务逻辑与数据库交互 | 关系型数据库(MySQL、Oracle)或非关系型数据库(MongoDB),单体应用通常使用一个中心化数据库 |
优势 | 相对结构简单,易于理解和维护 | 简化协同工作,整个应用在一个代码库中 | - | - |
挑战 | 随着用户和数据增长,扩展性有限 | 随着应用庞大,修改一个模块可能对整个应用产生连锁效应 | 难以应对大规模数据和用户增长 | 技术栈更新或更改可能困难,整个应用共享相同的技术基础 |
在单体架构中,模块虽然在逻辑上独立,但在物理上并没有严格分离,导致系统在实际落地时,模块的职责和边界划分相对随意,模块之间的依赖关系也较为模糊。这使得模块结构的合理性很大程度上依赖于开发者个人水平。
在电商初期,业务相对简单,单体架构可以迅速实现系统的快速开发。然而,随着业务复杂度的增加,每个页面发展为独立的业务体系,模块数量急剧增加。在单体架构中,通过构建清晰的模块体系来支持系统的扩展变得困难。
代码都放在一个代码库里管理,当多团队并行开发时容易发生代码冲突,这进一步阻碍了系统的快速扩展。举例来说,eBay在过去因为单体架构的复杂性,甚至需要专门的团队负责代码合并和编译。
随着业务规模的扩大,单体架构的弊端变得显而易见,因此需要对系统进行拆分,将不同的业务模块拆分为独立的应用,采用分布式架构来更好地应对复杂性和实现团队的并行开发。这种架构变迁反映了业务和技术的发展,以满足系统更高的可扩展性和灵活性需求。
(二)分布式架构
分布式架构是一种软件设计和组织系统的方式,它将一个大型系统划分为多个独立的子系统,这些子系统可以在不同的计算机或服务器上运行,并通过网络进行通信和协作。这种架构的目标是提高系统的可扩展性、可靠性和性能。
关于分布式的具体架构可以参考下图:
关于分布式架构解释:
特点 | 描述 |
---|---|
定义 | 系统由多个独立的应用组成,这些应用通过API接口互相协作,形成一个整体。 |
组成 | 包括多个应用,每个应用负责不同的业务线。应用之间通过API接口进行通信。 |
API接口 | 在分布式架构中,API接口是应用的一部分,用于应用间通信。API相当于应用向外提供的窗口,展示底层业务逻辑,支持外部访问。 |
业务广度切分 | 分布式架构按照业务线进行切分,将大系统的业务复杂度分割成多个小业务的复杂度,降低整体复杂度。 |
耦合度降低 | 应用之间的耦合度低,支持多团队的并行开发。应用独立开发,各自负责特定的业务线,不同业务间的修改影响较小。 |
局限性 | - 自身业务需求和外部业务需求冲突时,可能导致API接口和底层业务逻辑的调整,影响整体系统的稳定性。 |
- 业务间可能重复造轮子,每个应用需要自行搭建一套完整的体系,导致资源浪费。 | |
适用场景 | 适用于业务相关性低、耦合少的业务系统。例如,企业内部的管理系统,服务于不同的职能部门,如财务系统和HR系统,按照分布式架构实现更为合适。 |
举例 | 在淘宝服务化改造之前,不同业务线的用户、商品、订单逻辑类似,导致整个系统有超过1/3的核心代码重复。分布式架构更适用于解决此类情况。 |
(三)SOA架构
传统SOA架构起源于企业信息化建设高潮,解决了不同供应商提供的系统之间的集成问题。在这一模式下,每个系统将所需功能封装为独立的服务,外部系统通过这些服务进行访问和集成,打通了信息孤岛。该架构的核心理念是面向服务,通过清晰的服务接口解决了技术异构性,使得不同系统能够协同工作。然而,它也存在一些限制,包括服务粒度较粗,导致功能复用受限,以及服务之间的调用可能带来单点故障和性能瓶颈。
一个传统的SOA架构,如下图所示:在SOA架构中,每个服务都对应一个现有的系统,所有这些服务都部署在一个中心化的平台上,我们称之为企业服务总线ESB(Enterprise Service Bus),ESB负责管理所有调用过程的技术复杂性,包括服务的注册和路由、各种通信协议的支持等等。
传统SOA架构主要用于解决遗留系统的集成问题。而新的SOA架构,它利用服务共享的思想,解决系统的重复开发问题。
举个淘宝的例子,淘宝的系统基本是自建的,系统相互打通的问题不大。但经过一段时间的自然生长,系统重复建设的问题很突出,前面也提到,有超过1/3的核心代码重复。针对这种情况,我们就可以通过服务化手段,把通用的逻辑和数据从各个业务系统里抽取出来,封装成独立的服务,提供给所有业务进行共享。
基于这个思路,淘宝花了2~3年时间,先后落地了用户、商品、订单、库存、店铺、营销等服务,搭建了共享服务体系。通过共享,淘宝不仅提升了开发效率和质量,也加强了系统的扩展能力。
新的SOA架构如下图所示:
特点 | 传统SOA架构 | 新SOA架构 |
---|---|---|
应用场景 | 主要用于解决系统集成问题 | 解决系统的重复开发问题,服务共享思想 |
核心思想 | 面向服务 | 以服务共享为核心思想 |
解决问题 | 解决异构系统集成问题 | 提高系统扩展能力,避免重复开发 |
服务特点 | 面向系统功能,较为粗粒度 | 面向通用逻辑和数据,提供给多个业务系统共享 |
目标效果 | 打通信息孤岛,解决企业内部系统通信问题 | 提高系统开发效率、质量,加强系统扩展能力 |
实例 | 传统企业内部系统集成,如ERP、OA等 | 淘宝通过服务化手段,共享用户、商品等服务 |
我们用表格简要概括传统SOA架构和新SOA架构的特点、应用场景以及实例。新SOA架构在强调服务共享和解决系统重复开发问题方面具有明显优势。
综合来看,相较于分布式架构,SOA架构在系统的扩展方面带来了一系列的优势:
- 首先,采用服务化思想,SOA架构能够实现更好的业务封装性,通过标准技术提供友好的业务能力输出。
- 其次,SOA服务不依附于特定应用,具有独立的部署和扩展性,避免了对现有系统的直接影响,提高了系统的灵活性。
- 最后,通过封装通用业务逻辑,SOA架构使得服务可供所有应用共享,有效解决了重复开发的问题,提高了整体的开发效率。
然而,值得注意的是,尽管SOA服务化的思想带来了这些优势,但在实际系统实现上可能面临一些挑战,包括架构的复杂性、落地难度较大等。在实施过程中需要仔细考虑这些挑战,以确保成功实现SOA架构的目标。
(四)微服务架构
在微服务架构中,每个微服务都负责端到端的业务,包括前端UI展示和后端业务逻辑。微服务的团队成员跨职能,包括产品、开发、测试、运维等,负责整个服务的生命周期管理。从某种程度上说,微服务可以被称为微应用或微产品,是对分布式架构拆分得更细的一种实践。微服务强调围绕业务进行清晰的业务和数据边界划分,并通过定义良好的接口输出业务能力,与SOA架构中的服务有相似之处,但微服务是去中心化的,不需要SOA架构中的集中管理方式(如ESB)。
微服务的一方面强调"哑管道",即客户端可以通过简单的技术手段(如HTTP)访问微服务,避免复杂的通信协议和数据编码支持。另一方面,微服务强调"智能终端",所有业务逻辑都包含在微服务内部,不需要额外的中间层提供业务规则处理。这使得微服务提供方能够自由选择语言和工具来实现微服务,使得服务的部署和维护更加灵活。从某种意义上来说,微服务可以被看作是轻量级的SOA服务。
因此,微服务兼有应用和服务的特征,可以被理解为:
微服务 = 小应用 + 小服务。
在实践中,微服务更常被看作是小服务而不是端到端的小应用,以便更好地适应实际开发和维护的需求。
如下图可帮助理解一个有序的层次化微服务体系大致是什么样子的。
在微服务架构的实践中,有一些经验和教训是值得注意的:
经验:
- 清晰的边界和接口定义: 在拆分微服务时,确保每个服务都有清晰的业务边界和接口定义。这有助于避免微服务之间的紧耦合,并促使服务的自治性。
- 适度拆分: 不要过度拆分微服务,以免引入过多的复杂性和管理开销。找到适度的拆分粒度,使得每个微服务可以独立开发和部署,同时保持整体系统的可维护性。
- 自动化测试和持续集成: 强调自动化测试和持续集成,确保每个微服务的质量和稳定性。这对于频繁部署和快速反馈是至关重要的。
- 监控和日志: 实施有效的监控和日志系统,以便追踪微服务的性能、健康状况和异常情况。这有助于快速诊断和解决问题。
教训:
- 分布式系统的挑战: 微服务架构引入了分布式系统的挑战,如服务发现、通信延迟、一致性等。对于这些挑战需要认真思考和妥善解决。
- 数据管理: 微服务的数据管理是一个复杂的问题,需要仔细考虑每个微服务的数据存储和一致性。共享数据可能导致微服务之间的依赖性增加。
- 服务依赖管理: 有效地管理微服务之间的依赖关系是至关重要的。服务的升级和变更可能会影响到依赖它的其他服务,需要有良好的版本管理和升级策略。
- 团队组织和沟通: 跨职能团队的构建和协作是微服务成功实施的关键。确保团队理解微服务的理念,并能够有效地沟通和协同工作。
总体而言,微服务的实践需要在理论和实践之间取得平衡。不同的项目和组织可能面临不同的挑战,因此根据实际情况调整微服务架构的实施策略。
三、1号店App服务端架构升级说明
2012年,当时的1号店App服务端架构采用的是传统的单体架构,所有的功能都运行在一个应用中。这样的架构在初始阶段是比较简单和易于管理的,因为业务规模相对较小,能够满足当时的需求。
然而,随着1号店App用户数量和业务复杂度的增加,单体架构逐渐显露出一些问题。首先,随着业务逻辑的增加,单体应用的代码变得庞大复杂,导致开发和维护的难度上升。其次,单体应用的扩展性有限,难以应对大规模用户的并发访问和快速业务变化。
为了解决这些问题,1号店决定进行架构升级,将单体架构改造为分布式的微服务架构。
(一)V1.0架构
首先,让我们聊一下1.0版本。在那个时期,1号店App的服务端架构采用了传统的单体架构。iOS和Android的App前端开发团队是外包的,而App的服务端由1号店内部的一个小型移动团队负责。该团队的主要职责是提供App前端所需的各种接口,这些接口使用HTTP+JSON通信协议。整体架构相对简单,服务端是一个单体应用,由移动团队维护所有对外接口。服务端内部包含多个Jar包,如商品搜索、商品详情、购物车等,这些Jar包包含各业务线的逻辑和数据库访问,由各业务线的开发者提供。
这个1.0版本的服务端本质上是一个单体应用,只是外部接口和内部Jar包分别由不同的团队提供。这种架构的优点和缺点都很明显。
优点之一是简单便利。App前端的外包团队只需与一个移动团队对接,通过现有的Jar包封装各业务线功能。这些Jar包可以直接从PC端应用中获取,如果有版本更新,业务线团队也只需同步给移动团队即可。
然而,这个设计并非完美,存在一些问题。首先,移动服务端对Jar包有紧密依赖,移动团队对业务团队提供的Jar包实现业务逻辑存在物理上的耦合。业务团队修改应用代码后,Jar包也随之修改。由于业务团队时常忘记同步新的Jar包给移动团队,或者新的Jar包调整了接口,导致App服务端功能问题或直接不可用。
其次,移动团队的职责过于复杂。服务端提供的是粗粒度接口,而业务团队的Jar包提供的是细粒度接口。因此,移动团队在Jar包基础上需要进行大量的业务逻辑聚合,这些逻辑通常跨足多个业务线,导致移动团队对所有业务逻辑都需要深入了解,这是一项难以完成的任务。
最后,团队并行开发面临困难。由于移动团队和业务团队通过物理Jar包集成,移动团队直接受到业务团队代码的影响,导致团队之间难以并行开发。一次大的App升级通常需要2~3个月的时间。
这种简单的服务端架构和团队合作模式在初期非常适合1号店,因为当时的主要目标是尽快推出App端。然而,随着移动端功能的逐渐完善,这种单体架构加物理Jar包耦合的方式成为了App进一步发展的瓶颈。
(二)V2.0架构
2013年,1号店App服务端架构升级到了V2.0。此时,1号店自行负责了App前端的开发,同时,服务端接口由各个业务线团队直接管理。这使得App前端能够直接对接多个后端应用提供的HTTP接口。每个业务团队现在负责其业务线的App接口,并以Web应用方式为PC端浏览器提供访问。为满足移动端需求,他们在Web应用中增加了一些REST接口,供App访问。这种架构下,移动接口和Web应用在同一工程内进行开发,部署和运行。
这种分布式系统架构使得每个业务线由不同团队负责,支持了团队之间的并行开发。同时,移动接口和PC端共享底层业务逻辑,有助于快速将PC端功能复制到App端。通过V2.0架构的升级,业务线团队的生产力得到释放,App的功能也快速丰富起来。
然而,这种方式也带来了一系列问题。首先是移动端和PC端相互干扰的问题。由于移动接口和Web应用在同一个业务线内物理上绑定,PC端代码修改会影响到移动接口,Web应用的发布也会导致移动接口被动发布,从而相互干扰。其次是重复开发问题,每个后端系统都需要单独支持系统级功能,导致通用需求变更时的重复工作和管理挑战。最后是稳定性问题,由于直连方式,一个后端系统出现问题会直接影响App整体的稳定性。
这些问题的根本原因在于在App端直接采用了PC端的做法,没有根据移动端自身特点进行架构设计。因此,随着App的发展,架构需要根据各自不同的特点进行演变。
(三)V3.0架构
在V3.0版本的服务端架构中,经历了两个主要的升级。
首先,我们对每个业务线的服务端进行了拆分,使得App接口和PC端接口在物理上独立,但它们仍然共享核心的业务逻辑。拆分后的架构如下图所示,原本的大服务端被分为三个独立的应用,包括一个App端接口应用、一个PC端Web应用,以及一个负责维护和部署核心业务逻辑的服务。
此外,架构改造还考虑了移动端的特点。一方面,每个移动端接口需要调用对应的后台服务,进行个性化的业务逻辑处理;另一方面,每个移动端接口都需要进行系统级的功能处理,如安全验证、接口监控等,这是共性的。因此,在架构上,我们需要将共性的系统级功能进行集中处理,将个性化的业务功能分散处理。
最终,结合服务端应用的拆分和对移动接口的改造,实现了服务端V3.0架构。在这个版本中,App前端通过移动网关访问服务端接口。该网关负责处理通用的系统级功能,包括通信协议适配、安全、监控、日志等。处理完后,通过接口路由模块,将请求转发到内部的各个业务服务,如搜索服务、详情页服务、购物车服务等。
对于PC端浏览器,直接访问相应的Web应用,如搜索应用、详情页应用等,这些应用同样访问相同的内部服务。需要注意的是,在当时尚未流行前后端分离,因此PC端有对应的Web应用,负责业务逻辑和UI展现。
四、中台架构
前台和后台是企业IT系统的一体两面。前台指面向C端的应用,如微信、淘宝,包括与前端配套的服务端。后台指企业内部系统,如ERP、CRM、仓库管理系统,主要为企业内部人员使用。传统企业仅有线下场景,通过后台完成所有业务流程;而互联网企业或逐步开展线上业务的传统企业需要前台和后台协作,完成业务闭环。
前台对外,需快速响应、低成本试错,满足消费者多变需求;后台对内,业务流程稳定,不宜频繁调整。前台要快,后台要稳,导致业务扩展时面临两类挑战:
- 营销思路变动快,前台易改,但后台调整耗时,影响面广,成本高;
- 后台系统老旧、性能差、接口不开放,前台对接困难,促销活动可能导致后台故障。
第一类挑战在互联网企业常见,前台灵活;第二类挑战在传统企业典型,后台商业套件难与新线上应用直接对接。前台和后台需要协作,但对业务稳定性和技术要求不同,存在脱节。为解决这一问题,中台架构应运而生,旨在实现前后台平滑对接。
(一)中台的定位与适用说明
中台定位
以麦当劳为例,通过对内部老系统进行包装,对外提供标准的API,将旧的IT基础设施转换成面向互联网的业务平台。新的C端应用可以快速基于这个业务平台构建,无需关心底层老系统的实现细节。这中间层即中台。
中台在企业中相当于商业操作系统,通过对后台的包装为前台提供全方位支持。需要注意的是,中台不仅仅是前后台之间的简单适配器,它本身会落地业务数据,具备完整的业务规则。类似于Windows操作系统,中台在适配硬件的基础上,进一步提供内存管理、进程调度等功能,为上层应用提供体系化的支持。
在互联网企业中,前后台虽然是同时建设的,但它们在功能上可能存在差异。前台通常追求快速创新,而后台则注重稳定性。因此,中台可以先承接前台的业务和数据,与前台构成C端业务的小闭环,支持快速创新。随着业务模式验证,中台和后台可以进一步彻底打通,形成业务的大闭环。中台的定位在于作为前后台之间的衔接层,既支持业务的灵活发展,又确保整体系统的稳定性。
中台的适用性
在发展过程中,一个出行平台从单一业务线如出租车逐渐扩展到多业务线,例如增加了快车、顺风车等。面对这种情况,有两种处理方式。
第一种是独立建设新业务线,导致各业务线之间存在大量重复代码,带来重复建设和多头维护问题,效率低下。
第二种是通过抽取各业务线中相同的核心逻辑,实现通用化,构建一个“山”字型的系统结构,其中上面三竖代表各业务线的定制应用,底下一横代表通用层,实现了业务逻辑和规则的统一。
“山”字型的系统结构能够实现一处建设、多处复用,一处修改、多处变化的优势,达到最大程度的复用效果。什么时候需要从“川”字型转为“山”字型呢?
一方面,与公司业务线的数量有关,业务线越多,考虑转为“山”字型的成本就越大,通常在开始第3条业务线时考虑。
另一方面,与业务线的相似度有关,相似度越高,更适合“山”字型。出行平台的各出行方式相似度高,适合“山”字型;而不同业务的相似度低,则可以考虑“川”字型,避免强行将它们整合在一起。
因此,中台实现了通用基础业务的平台化,通过适时的结构转变,实现企业级业务能力的快速复用。中台通过收敛业务场景和规则、提供标准接口、屏蔽底层系统复杂性以及统一数据模型,为企业在有限而相对固定的基础业务上,满足无限而快速变化的上层业务场景提供了支持。
(二)典型业务中台的结构:微服务的升级
中台可被看作是微服务架构的升级演进。在传统的微服务体系下,我们构建了一系列离散的服务,如商品服务、订单服务等。而在中台中,这些微服务得到了升级,演化为商品中心、订单中心等,每个中心更注重体系化,包括更强的业务通用能力、系统运营能力(例如监控、稳定性、性能强化)以及业务运营能力(例如商品中心自带配套的商品管理后台)。
每个服务中心都形成了一个微内核,围绕核心业务自成体系,这些微内核构成了一个有机整体,形成了基础业务平台,也就是中台。微服务的松散性逐渐演变为共享服务体系,最终形成中台,这是微服务架构向中台架构的自然演进。
当我们深入了解业务中台时,可以看到它通常包含三个层次,从上到下分别是通用聚合服务层、通用基础业务平台和通用中间件平台。
可以深入了解中台的三个关键组成部分,以及它们如何协同工作,提供全方位的支持:
通用基础业务平台
这一层承担了实现核心业务能力的责任。它提供了一系列通用的基础服务,例如用户认证、支付处理、订单管理等,这些服务是整个企业业务中不同模块通用的基础构建块。通过实现标准化的业务逻辑,通用基础业务平台确保了业务的一致性和可靠性。
其中的基础数据模型、业务规则和流程都得到了统一,从而为不同业务线提供了共享的业务逻辑基础。这降低了业务线之间的冗余开发,提高了开发效率。
通用聚合服务层
这一层通过对基础业务的巧妙组合,提供更高层次的抽象和更丰富的业务能力。通用聚合服务层的存在使得业务线可以更轻松地利用和组合基础服务,实现更灵活、更符合特定场景需求的业务逻辑。
通用聚合服务的设计注重易用性和可组合性,使得业务开发者能够更加专注于业务本身,而不必过于关注底层基础服务的复杂性。这样的设计使得业务线能够更加敏捷地应对市场需求变化,降低了开发的复杂度。
通用中间件平台
这一层致力于保障整个业务中台的稳定性和可靠性。通用中间件平台提供了一系列技术手段,包括监控、容错、自动化部署等,以确保中台的各个部分协同工作的稳定性。
它还可能涉及到安全性、性能优化等方面的工作,为中台的整体运行提供技术支持。通过这一层的存在,业务中台得以在迅速变化的市场中保持稳定,有效地应对各种挑战。
这三者的协同工作使得中台不仅仅是业务线的集合,更是一个有机整体,为企业提供了高效、稳定和灵活的业务支持。中台的设计目标是通过这种协同,使得企业能够更好地适应市场的快速变化,同时降低了业务开发和维护的成本。
总的来说,中台作为微服务的升级形态,不仅强调业务的分散和解耦,更注重基础业务能力的提升、业务运营的支持以及系统整体稳定性的保障,为企业的业务创新和快速响应变化提供了更为强大的支持。
(三)落地中台
落地中台对于互联网企业和传统企业来说确实有不同的挑战和侧重点。
特点 / 侧重点 | 互联网企业 | 传统企业 |
---|---|---|
结构特点 | 已有较为完善的基础服务体系,系统类似于“山”字型结构。 | 大量独立商业套件组成的遗留系统,系统类似于“川”字型结构。 |
基础服务强化 | 强化现有基础服务,提升性能、安全性、稳定性。 | 中台设计更侧重整合基础服务,使其更加协同工作。 |
灵活性和响应速度 | 追求高度灵活性,能够快速适应新的业务场景和需求。 | 需要中台具有整体业务流程的灵活性,能够适应企业的变革节奏。 |
技术创新 | 注重技术创新和工程实践,采用最新的技术架构和开发模式。 | 中台的实施可能涉及到对现有技术和架构的升级,但强调稳定性。 |
业务流程优化 | 中台设计更灵活,强调整个业务流程的优化。 | 对整体业务流程进行梳理、简化和标准化。 |
文化和组织变革 | 注重技术和创新文化,组织更扁平,便于快速决策。 | 中台的实施可能涉及到文化和组织方面的变革,包括培训和结构调整。 |
关注点 | 技术创新、快速响应市场变化、高度灵活性。 | 整体业务流程优化、文化和组织变革。 |
无论是互联网企业还是传统企业,中台的实施都需要深入了解企业的业务特点和文化,根据实际情况制定相应的战略和计划。成功的中台实施需要全面考虑技术、业务和组织层面的因素。
典型的传统企业中台架构设计如下:
整个中台架构从上到下分为四个层次:
渠道&应用
渠道&应用层,这是整个系统的对外部分,包括了各个应用的前端,如App、小程序、公众号等等,这些是需要定制的部分。同时,在对外部分,我们还会提供Open API,供上下游企业调用。
应用平台
应用平台是各个具体应用的母体,它包含了各个应用的服务端,比如小程序服务端、App服务端等等,这些服务端会针对具体场景,做流程编排和信息的聚合。
服务端和前端之间还有一个网关,网关实现前后端隔离,具体负责外部访问的安全验证和监控,以及内外部请求的路由和消息格式转换。
业务中台
业务中台是中台架构的核心,它包括一系列的通用基础服务,以及它上面的通用聚合服务和下面的技术平台,这个在前面已经详细介绍过了,我就不赘述了。
后台
后台包括两部分,第一部分是适配插件,用于连接商户内部系统和中台基础服务,比如,在中台的商品服务和后台ERP之间同步商品数据,在中台的会员服务和后台CRM之间同步会员信息。一般针对每个内部系统,都有一个适配插件,它起到了类似硬件驱动程序的作用,这个一般是定制化的。第二部分是企业内部系统,这个是企业的IT基础设施,业务最终会在这里落地。
中台的理念在于将企业的核心业务能力进行通用化,形成一个自成体系的中央枢纽。这个中台具备通用的业务基础服务和聚合服务,能够为面向消费者(C端)的互联网场景提供灵活、可复用的功能。
(四)常见的中台名词及其定位
中台类型 | 定位 | 主要职责 |
---|---|---|
业务中台 (Business) | 提供通用的业务逻辑和规则,为业务线提供共享能力 | 实现核心业务能力的复用,满足企业核心业务需求。 |
技术中台 (Technical) | 提供技术基础设施和服务,确保系统稳定性和可维护性 | 提供通用中间件、数据存储、计算资源等,支持业务中台和应用平台的开发和运行。 |
数据中台 (Data) | 集中管理和智能应用企业数据 | 提供数据的标准化、清洗、分析等服务,构建企业级的数据湖,支持业务和决策需求。 |
运营中台 (Operation) | 提供运维工具和服务,确保系统稳定运行 | 包括系统监控、性能优化、安全管理等服务,确保中台系统的稳定运行。 |
开发中台 (Development) | 提升开发效率和协作方式 | 提供开发工具、协作平台、代码管理等服务,支持团队协同开发和快速迭代。 |
这些中台名词并非严格的分类,有时候也可能在实际应用中交叉使用。不同组织和行业可能对这些概念有不同的理解,但总体目标都是通过中台思想实现业务的快速创新和核心能力的高效复用。
五、总结
通过1号店的案例,我们清晰地看到了从单体架构到微服务架构转型的必要性和实施过程。这一转型不仅提升了系统的可扩展性和灵活性,更为业务的快速响应能力奠定了基础。在数字化转型的浪潮中,1号店通过引入微服务架构,成功地将各个业务模块独立化,优化了资源的利用效率。
然而,架构转型并非一帆风顺,企业在实施过程中必须面对技术选择、团队协作和持续监控等多重挑战。成功的关键在于制定清晰的转型策略、保持开放的沟通以及建立高效的反馈机制,以确保每一步都能顺利推进。
展望未来,微服务架构将继续成为电商企业应对市场变化、满足用户需求的重要工具。1号店的经验为同行提供了宝贵的借鉴,鼓励更多企业探索适合自身发展的架构解决方案,以实现可持续的增长和创新。在这个竞争日益激烈的时代,敏捷和灵活性将成为电商企业胜出的制胜法宝。
参考文章链接及推荐阅读
架构实战案例解析_架构案例_后端架构-极客时间
推荐阅读(后续学习):
书名 | 作者 | 阅读链接 |
---|---|---|
《中台战略与实践》 | 马化腾 | 豆瓣链接 |
《企业IT架构转型之道》 | 马化腾、王坚 | 豆瓣链接 |
《微服务设计》 | Sam Newman | 豆瓣链接 |
《微服务架构与实践》 | 郭俊刚 | 豆瓣链接 |
《大型网站技术架构:核心原理与案例分析》 | 李智慧 | 豆瓣链接 |
相关文章:
单体到微服务:电商平台架构的演变与可扩展性探索
目录 一、整体理解可扩展性 二、从电商平台架构发展看架构的可扩展性 (一)单体架构 (二)分布式架构 (三)SOA架构 (四)微服务架构 三、1号店App服务端架构升级说明 ÿ…...
clickhouse-副本和分片
1、副本 1.1、概述 集群是副本和分片的基础,它将ClickHouse的服务拓扑由单节点延伸到多个节点,但它并不像Hadoop生态的某些系统那样,要求所有节点组成一个单一的大集群。ClickHouse的集群配置非常灵活,用户既可以将所有节点组成…...
C语言版解法力扣题:将整数按权重排序
1.题目描述 我们将整数 x 的 权重 定义为按照下述规则将 x 变成 1 所需要的步数: 如果 x 是偶数,那么 x x / 2 如果 x 是奇数,那么 x 3 * x 1 比方说,x3 的权重为 7 。因为 3 需要 7 步变成 1 (3 --> 10 -->…...
ubuntu18.04升级到ubuntu20.04
为了使用qt6,在ubuntu18.04上各种折腾失败,无奈只能升级到ubuntu20.04, 按照网上的教程没成功。自己摸索了 lsb_release -a df -h sudo apt update sudo apt upgrade -y sudo apt dist-upgrade -y sudo apt autoremove -y sudo apt clean sudo apt inst…...
【我的 PWN 学习手札】IO_FILE 之 stdin任意地址写
我们知道,stdin会往“缓冲区”先读入数据,如果我们劫持这个所谓“缓冲区”到其他地址呢?是否可以读入数据到任意地址?答案是肯定的。 注意!代码中的“-------”分隔,是为了区分一条调用链上不同代码片段&am…...
<mutex>注释 11:重新思考与猜测、补充锁的睡眠与唤醒机制,结合 linux0.11 操作系统代码的辅助(上)
(46)问题的起源: 因为上面的内核代码,我们编写多线程代码时,对手里的家伙事不那么自信。但我们知道,多线程在竞争锁时,若得不到锁,会进入睡眠,并会在被唤醒后重新尝试得…...
C/C++圣诞树
系列文章 序号直达链接1C/C爱心代码2C/C跳动的爱心3C/C李峋同款跳动的爱心代码4C/C满屏飘字表白代码5C/C大雪纷飞代码6C/C烟花代码7C/C黑客帝国同款字母雨8C/C樱花树代码9C/C奥特曼代码10C/C精美圣诞树11C/C俄罗斯方块12C/C贪吃蛇13C/C孤单又灿烂的神-鬼怪14C/C闪烁的爱心15C…...
upload-labs-master第21关超详细教程
目录 环境配置解题思路利用漏洞 操作演示 环境配置 需要的东西 phpstudy-2018 链接: phpstudy-2018 提取码:0278 32 位 vc 9 和 11 运行库 链接: 运行库 提取码:0278 upload-labs-master 靶场 链接: upload-lasb-ma…...
Python基础——数学运算
目录 1. 算术运算符 2. 比较运算符 3. 赋值运算符 4. 逻辑运算符 5. 成员运算符 6. 身份运算符 7. 三目运算符 Python数学计算通过多种运算符来执行,常用的运算符类型包括算术运算符、比较运算符、赋值运算符、逻辑运算符、成员运算符、身份运算符、三目…...
ubuntu 安装更新 ollama新版本
ubuntu 安装更新 ollama新版本 我这里是 2024-12-18 ollama 版本是 0.5.3 1手动下载 ollama-linux-amd64.tgz https://github.com/ollama/ollama/releases 2下载脚本 https://ollama.com/install.sh install.sh 和 ollama-linux-amd64.tgz 在相同路径下 修改:…...
汽车IVI中控开发入门及进阶(45):凌阳科技车载娱乐芯片
概述: Sunplus科技有限公司成立于1990年,是一家领先的多媒体和汽车应用芯片提供商,如DVD播放器、便携式DVD播放器、家庭娱乐音频产品、汽车信息娱乐和高级驾驶辅助系统(ADAS)。与此同时,凌阳正在为消费类、便携式和连接设备上的广泛应用提供高速I/O IP、高性能数据转换I…...
Linux export命令
本文来自智谱清言 --------- 在Linux系统中,export 是一个用来设置环境变量的命令。 环境变量是操作系统运行时用于存储有关系统环境的信息的变量,它们对于用户和程序都是可访问的。下面是关于 export 命令的一些基本用法: 基本语法 ba…...
AI自我进化的新篇章:谷歌DeepMind推出苏格拉底式学习,语言游戏解锁无限潜能
各位AI爱好者、技术研究者,大家好!今天我们来聊聊一个令人兴奋的AI研究新进展——谷歌DeepMind推出的“苏格拉底式学习”方法。这项研究的独特之处在于,它让AI在没有外部数据的情况下,通过“语言游戏”实现自我进化,这…...
【BUG】记一次context canceled的报错
文章目录 案例分析gorm源码解读gin context 生命周期context什么时候cancel的什么时候context会被动cancel掉呢? 野生协程如何处理 案例分析 报错信息 {"L":"ERROR","T":"2024-12-17T11:11:33.0050800","file"…...
JAVA前端开发中type=“danger“和 type=“text“的区别
在前端开发中,type 属性通常用于指定按钮或其他元素的样式或行为。不同的框架和库可能对 type 属性有不同的定义和用法。常见的框架包括 Bootstrap、Ant Design(antd)、Element Plus 等。下面我将分别介绍在这些框架中 type"danger"…...
sqlite3 支持位运算 和view和 triger
数据设置条件以后可以.根据门限自动调整其他的值 由数据库记录修改时间,及记录-> 网元设备的告警产生时间,设置超时清除时间,记录系统的原始时间戳 CPp 有 sqlite 支持 json 导出字符串,json 库将字符串,映射为结构体 triger update table 更新到一个 可设置参数列表 ,view …...
Mysql复习(一)
数据库系统的核心是( 数据库管理系统 )。 以下的标识符中符合标识符命名规则的有几个?(3个) 3abc7, abc73, bc73a, c73ab,*73abc 标识符的第一个字符允许包括哪些符号?( _ 或者 或者 #) 关系表达式运算的…...
Redis bitmaps 使用
应用场景: 记录id为 1 的用户,2024年12月签到情况,并统计; 记录 1号签到 zxys-redis:0>setbit 1:202412 1 1 记录 2号签到 zxys-redis:0>setbit 1:202412 2 1 记录 3号未签到 zxys-redis:0>setbit 1:202412 3 0 …...
计算无人机俯拍图像的地面采样距离(GSD)矩阵
引言 在无人机遥感、测绘和精细农业等领域,地面采样距离(Ground Sampling Distance,简称 GSD)是一个非常重要的指标。GSD 是指图像中每个像素在地面上实际代表的物理距离,通常以米或厘米为单位。GSD 决定了图像的空间…...
Java基础 | 数据库的命名规范
数据库的命名规范 1. 基本原则2. 命名规范详解2.1 命名禁止项2.2 命名规范3. 通用字段规范4. 特殊表命名建议 1. 基本原则 统一性:全库采用一致的命名规范简洁性:在表达清晰的前提下尽量简短规范性:遵循数据库标准规范可读性:命名…...
计算机网络基础(2):网络安全/ 网络通信介质
1. 网络安全威胁 网络安全:目的就是要让网络入侵者进不了网络系统,及时强行攻入网络,也拿不走信息,改不了数据,看不懂信息。 事发后能审查追踪到破坏者,让破坏者跑不掉。 网络威胁来自多方面:…...
Reactor
文章目录 正确的理解发送double free问题 1.把我们的reactor进行拆分2.链接管理3.Reactor的理论 listensock只需要设置_recv_cb,而其他sock,读,写,异常 所以今天写nullptr其实就不太对,添加为空就没办法去响应事件 获…...
介绍 Html 和 Html 5 的关系与区别
HTML(HyperText Markup Language)是构建网页的标准标记语言,而 HTML5 是 HTML 的最新版本,包含了一些新的功能、元素、API 和属性。HTML5 相对于早期版本的 HTML(比如 HTML4)有许多重要的改进和变化。以下是…...
已有 containerd 的情况下部署二进制 docker 共存
文章目录 [toc]学习目的开始学习dockerd启动 containerd准备配置文件启动 containerd 启动 docker准备配置文件启动 docker 环境验证停止 docker 和 containerd 学习目的 使用容器的方式做一些部署的交付,相对方便很多,不需要担心别人的环境缺少需要的依…...
Springboot @Transactional使用时需注意的几个问题
一、事务的隔离级别 在Springboot应用中,如果我们想实现方法一旦执行有异常产生,就触发事务回滚,可以在方法上面添加Transactional注解。如果应用采用mysql数据库,虽然mysql本身也有事务隔离机制,但在Sping数据库的应…...
西游记战力排名、笔记等
文章目录 战力排名对西游记的理解各个版本游戏题材西游记关卡和妖怪 西游记家喻户晓,没有谁不知道吧,无论是电视剧、影视,还是小说,乃至游戏,很多地方都有西游记的身影。 虽然知道,但总不如对三国啊、水浒啊…...
(2024.12)Ubuntu20.04安装ZED-SDK
一.官网地址 ZED SDK 4.2 - Download | Stereolabs 选择适配版本进行下载 二.安装程序 下载完成后,进入文件目录,打开终端,输入: chmod x ZED_SDK_Ubuntu20_cuda11.8_v4.2.2.zstd.run ./ZED_SDK_Ubuntu20_cuda11.8_v4.2.2.zst…...
Pytorch | 从零构建GoogleNet对CIFAR10进行分类
Pytorch | 从零构建GoogleNet对CIFAR10进行分类 CIFAR10数据集GoogleNet网络结构特点网络整体架构应用与影响Inceptionv1到Inceptionv2 GoogleNet结构代码详解结构代码代码详解Inception 类初始化方法前向传播 forward GoogleNet 类初始化方法前向传播 forward 训练过程和测试结…...
蓝桥杯刷题——day9
蓝桥杯刷题——day9 题目一题干解题思路一代码解题思路二代码 题目二题干解题思路代码 题目一 题干 小蓝最近在研究一种浮点数的表示方法:R格式。对于一个大于0的浮点数d,可以用R格式的整数来表示。给定一个转换参数n,将浮点数转换为R格式整…...
ffmpeg翻页转场动效的安装及使用
文章目录 前言一、背景二、选型分析2.1 ffmpeg自带的xfade滤镜2.2 ffmpeg使用GL Transition库2.3 xfade-easing项目三、安装3.1、安装依赖([参考](https://trac.ffmpeg.org/wiki/CompilationGuide/macOS#InstallingdependencieswithHomebrew))3.2、获取ffmpeg源码3.3、融合xf…...
分布式刚度编织,让可穿戴触觉更出色 ——Haptiknit
大家好!今天来了解一项非常有趣的科技成果 ——“Haptiknit:用于可穿戴触觉的分布式刚度编织”——《Haptiknit: Distributed stiffness knitting for wearable haptics》发表于《SCIENCE ROBOTICS》。在现代科技发展中,可穿戴触觉设备越来越…...
Elasticsearch:什么是查询语言?
查询语言定义 查询语言包括数据库查询语言 (database query language - DQL),是一种用于查询和从数据库检索信息的专用计算机语言。它充当用户和数据库之间的接口,使用户能够管理来自数据库管理系统 (database management system - DBMS) 的数据。 最广…...
PyQt介绍
**PyQt 和 PySide (Qt for Python) 简介** **PyQt** 和 **PySide** 是 Python 中用于开发图形用户界面 (GUI) 应用程序的两个主要框架,它们都是基于 Qt 库的绑定。Qt 是一个跨平台的应用程序开发框架,广泛用于创建图形用户界面、应用程序开发以及嵌入式…...
Oracle 数据库函数的用法(一)
Oracle数据库提供了大量的内置函数,可以用于完成各种操作,如字符串操作,数学计算,日期时间处理,条件判断,序列生成,聚合统计等。以下是一些常用的Oracle数据库函数: 一、oracle 使用…...
labelme标签批量转换数据集json_to_dataset
文章目录 labelme标签批量转换数据集json_to_dataset转换原理单张图片转换多张图片批量转换bat脚本循环法 标注图片提取标注图片转单通道 labelme标签批量转换数据集json_to_dataset 转自labelme批量制作数据集教程。 转换原理 在安装了labelme的虚拟环境中有一个labelme_js…...
《QT 5.14.1 搭建 opencv 环境全攻略》
《QT 5.14.1 搭建 opencv 环境全攻略》 一、引言二、准备工作(一)软件下载(二)系统环境确认 三、安装 QT 5.14.1(一)安装包下载与运行(二)环境变量配置 四、OpenCV 安装与配置&#…...
Sentry日志管理thinkphp8 tp8 sentry9 sentry8 php8.x配置步骤, tp8自定义异常处理类使用方法
tp8的默认使用的就是composer来管理第三方包, 所以直接使用 composer 来安装 sentry9 即可. 同时tp8和tp5的配置方式不太一样, 这里我们直接使用自定义异常类来处理Sentry的异常. 1. 安装 sentry9 包 # 安装 sentry9 包 composer require "tekintian/sentry9-php" …...
MySQL 基础:开启数据库之旅
MySQL 基础:开启数据库之旅 在当今数字化的时代,数据扮演着至关重要的角色,而数据库管理系统则是存储、管理和操作这些数据的强大工具。MySQL 作为一款广受欢迎的开源关系型数据库管理系统,被广泛应用于各类网站、应用程序以及企业…...
OpenTK 中帧缓存的深度解析与应用实践
摘要: 本文深入探讨了 OpenTK 中帧缓存的使用。首先介绍了帧缓存的基本概念与在图形渲染管线中的关键地位,包括其与颜色缓存、深度缓存、模板缓存等各类缓存的关联。接着详细阐述了帧缓存对象(FBO)的创建、绑定与解绑等操作,深入分析了纹理附件、渲染缓冲区附件在 FBO 中的…...
stm32制作CAN适配器5--WinUsb上位机编写
上次我们要stm32制作了一个基于winusb有canfd适配器,今天我们来制作一个上位机程序来进行报文收发。 上位机还是用以前写好的,只是更改下dll文件。 项目链接器,输入,附加依赖项中增加winusb.lib winusb初始化:#incl…...
【时间之外】IT人求职和创业应知【71】-专利费
目录 2025 ICT产业趋势年会召开,2024年度ICT十大新闻重磅揭晓 海纳致远数字科技申请定制化插件驱动的数据分析专利 阿波罗智联取得语音数据的处理方法、装置、设备和存储介质专利 心勿贪,贵知足。 感谢所有打开这个页面的朋友。人生不如意࿰…...
springboot vue 会员营销系统
springboot vue 会员营销系统介绍 演示地址: 开源版本:http://8.146.211.120:8083/ 完整版本:http://8.146.211.120:8086/ 移动端 http://8.146.211.120:8087/ 简介 欢迎使用springboot vue会员营销系统。本项目包含会员储值卡、套餐卡、计…...
Kafka快速扫描
Architecture 系统间解耦,异步通信,削峰填谷 Topic 消息主题,用于存储消息 Partition 分区,通过扩大分区,可以提高存储量 Broker 部署Kafka服务的设备 Leader kafka主分区 Follwer kafka从分区 高性能之道:…...
scala基础学习(数据类型)-字符串
文章目录 scala中的字符串引号单引号双引号三引号 常用内置函数length 获取字符串长度charAt 字符串元素访问substring 获取字串indexOf 获取字串位置replace 字符串替换toLowerCase,toUpperCase 字符串大小写转换trim 去除首位空白符split 字符串切割以及查看startsWith,endsW…...
网络架构与IP技术:4K/IP演播室制作的关键支撑
随着科技的不断发展,广播电视行业也在不断迭代更新,其中4K/IP演播室技术的应用成了一个引人注目的焦点。4K超高清技术和IP网络技术的结合,不仅提升了节目制作的画质和效果,还为节目制作带来了更高的效率和灵活性。那么4K超高清技术…...
如何优雅的关闭GoWeb服务器
以下内容均为Let’s Go Further内容节选以及作者本人理解。 这里创建了一个后台进程用于捕获关闭信号,在后台进程中,主要内容为: 创建一个缓冲通道 quit使用signal.Notify函数监听并捕获关机信号SIGINT,SIGTERM,在捕获关机信号后…...
Python爬虫(5) --爬取网页视频
文章目录 爬虫爬取视频指定url发送请求UA伪装请求页面 获取想要的数据解析定位定位音视频位置 存放视频完整代码实现总结 爬虫 Python 爬虫是一种自动化工具,用于从互联网上抓取网页数据并提取有用的信息。Python 因其简洁的语法和丰富的库支持(如 requ…...
simulink离散传递函数得到差分方程并用C语言实现
一. 创建连续时间的传递函数 G ( s ) s 2 217 s s 2 384 s 8989 G(s) \frac{s^2217s}{s^2384s8989} G(s)s2384s8989s2217s 二. 离散连续时间的传递函数G(s) 2.1 在matlab中用c2d函数双线性变换法离散G(s), 下面是matlab脚本代码 % 创建连续时间传递函数 …...
第十七届山东省职业院校技能大赛 中职组“网络安全”赛项任务书正式赛题
第十七届山东省职业院校技能大赛 中职组“网络安全”赛项任务书-A 目录 一、竞赛阶段 二、竞赛任务书内容 (一)拓扑图 (二)模块A 基础设施设置与安全加固(200分) (三)B模块安全事件响应/网络安全数据取证/…...
Redis内存碎片详解
什么是内存碎片? 你可以将内存碎片简单地理解为那些不可用的空闲内存。 举个例子:操作系统为你分配了 32 字节的连续内存空间,而你存储数据实际只需要使用 24 字节内存空间,那这多余出来的 8 字节内存空间如果后续没办法再被分配存储其他数…...