应用架构的演进:亚马逊的微服务实践

当你在亚马逊上购物时,或许不会想到,你看到的这个购物网站,其背后技术架构经历了什么样的变迁与升级。

还记得上世纪 90 年代,那个只卖书的网上书店吗?那时的亚马逊,不过是一个架构简单的网站,所有的功能都堆积在一个庞大的软件堡垒里。随着更多业务的增加、更新和迭代,这个软件堡垒愈发臃肿,扩展和维护变得非常困难。亚马逊意识到,单体架构已经严重影响到业务的发展。于是,决定将这个大堡垒拆分成小城堡,每个城堡通过通信接口互联,各自负责一个业务功能。

亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里让它成为你的技术宝库!

这就是微服务架构的雏形。小城堡比大堡垒更容易扩展和维护,但运营成本也提高了。

于是亚马逊又有了新的想法:既然 cloud 可以提供无限的计算资源,为什么我们还要自己搭建并运营这些小城堡呢?无服务器架构应运而生,开发者只需要编写并上传代码,剩下的服务器运维完全交给云平台。

从单体、到微服务、再到无服务器,亚马逊架构的演变可谓曲折,但每一次转变都让业务更加灵活。本文将通过一个具体的案例分享从单体,到微服务,再到无服务器,应用架构的演进都经历了哪些技术模式。之后,我们将一起深入探讨微服务和五服务器这两种新型架构,借助亚马逊的实践分析如何帮助企业应对数字化浪潮,从根本上构筑起业务的弹性。

单体构架应用系统的痛

image.png

这是一个在线点单系统,我们称他为 FTGO。FTGO 是一个典型的企业级 Java 应用程序,此时 FTGO 是一个单体应用架构,它由多个业务模块所组成:餐厅管理,订单管理,交付管理,账单管理,付款管理,以及消息管理。所有的服务集成在一起,共用一个数据库。围绕业务模块的是各种适配器。前端通过 REST API,WEB UI 适配用户各种终端的处理请求。后端的适配器,如用于支付、消息、邮件系统提供接口,与外部的系统集成。 在 FTGO 初期,当应用程序相对较小的时候,单体架构体现了一些优势:

  • 开发简单—IDE 和其他开发工具都专注于构建一个单独的应用程序;
  • 运维简单—开发人员可编写端到端的测试, 用于启动测试程序, 调用 REST API 并使用 selenium 进行 UI 测试
  • 部署简单—开发人员需需要将 WAR 文件复制到安装了 Tomcat 的服务器上即可。

但是很快,开发人员就发现了这个单体架构的应用有着巨大的局限性。业务的增长,需要 FTGO 不停的更新和迭代新的功能,于是研发团队不断扩充,代码库日趋庞大,应用架构变得越来越复杂。这个给运维管理带来了新的难题:

image.png

开发团队因为系统的复杂性受到了限制。在这样一个单体应用架构中,对于开发者来说 FTGO 的架构显得非常复杂和笨重,很难全部搞明白。于是无论是修复 bug,还是部署新功能都显得异常困难。应用的复杂性还表现在单一的代码库也变得越来越巨大。每一次变更都会让这个单一的代码库变得更加复杂,这给开发者全面理解代码带来困难,不能很好的理解代码,就无法保证每次变更的正确性。

生产效率降低。任何变更的部署都需要重新构建整个应用程序,运行所有测试套件以确保没有任何回归,并重新部署整个应用程序。即使只是对自己拥有的一小段代码进行单行更改,你仍然需要通过这个重量级流程。在单体应用架构时代,亚马逊有一个中央团队,其唯一的工作就是将这个单体应用程序部署到生产中。

沟通和协作成本高。开发人员通过共享的发布管道推动变更,这就会在生命周期的许多环节产生摩擦。任何一个变更,开发人员都需要大量的团队协调工作,来确保他们所做的变更不会影响别人的代码。 如果你想升级共享代码库以利用新功能,你需要说服其他人同时升级--祝你好运!如果你想为自己的功能快速推送一个重要的修复,你仍然需要将它与其他人正在进行的修改合并。经历过单体架构的工程师们都知道 "合并周五"吧?或者更糟糕的 "合并周"。当你通过交付管道推送变更时,变更需要在队列中等待手工测试的完成。对于一家努力创新和竞争的快速成长型公司来说,这种开销和迟缓是不可接受的

应用的微服务架构

当单体变得过大而无法有效扩展时,我们就需要做些改变。比如拆分成微服务。

image.png

这是一个典型的微服务应用架构。我们可以看到:

  • 微服务架构隐藏了内部实现细节,在不改变整体应用架构的前提下,我们可以独立变更和部署每个微服务,来提高灵活性和速度。单个服务的变更,不会对用户产生影响。这解决了服务升级带来的业务影响和服务体验,同时也避免破坏性变更,提高了可靠性。
  • 微服务相互协作通过 API 暴露和网络通信,每个服务都可以独立扩展,你不需要一台大机器(或几台),多个虚拟机或容器就可以完成工作,每个微服务只负责自己的领域(减少代码中的耦合),每个微服务都有自己专用的数据库(没有数据耦合)。API 和网络通信实现了服务的解耦,并支持自动化。
  • 作为开发人员,理解微服务比理解整个单体服务容易的多,这促进了新技术的产生,提高了业务的敏捷性。

微服务之间的集成非常重要,有3种关键模式:

  • API 驱动模式
  • 事件驱动模式
  • 数据流模式

如果集成做好了, 微服务可以保持自治性。应用的向微服务架构改变,同时带来开发组织的改变:

  • 团队解耦,更小的团队独立架构、开发、部署和维护每个微服务,他们可灵活的选择工具来高效地自行发布。
  • 所有权是关键--每个团队服务都有一个所有者。所有者负责架构,所有者负责实施,所有者负责在生产中提供支持,所有者负责修复问题,所有者负责维护。
  • DevOps 原则--自动设置, 开发人员拥有生产支持.

image.png

微服务带来开发组织架构调整的前行者是亚马逊。

为了进一步提高业务的敏捷性,亚马逊将研发团队拆分成若干个“两个 pizza 可以喂饱的”小团队,每个“双 pizza 团队”都对其服务拥有完整的所有权和全部的责任。这意味着赋予团队自主决策的权力,然后信任他们对决策结果负责。如今,很多人将这种方法称为 DevOps,意思是让同一个团队同时负责服务的开发和运维。通过构建这种高度自治和负责任的小型团队,企业可以实现产品和技术的快速迭代。

微服务架构应用的构建,我们建议从应用设计入手。开发者可以借助 Domain Driven Design 来从业务角度进行规划和设计。

Domain Driven Design,简称 DDD, 它是一种软件开发的设计方法论,核心思想是通过领域建模对业务领域进行抽象和概念化,以此驱动软件设计。

image.png

这里有两个概念需要说明:
领域(Domain):是指软件要解决的主要问题领域。
领域模型(Domain Model):对领域进行抽象化建模的结果,反映业务领域的概念及业务规则。

DDD 提倡多层架构和明确定义的领域接口,来实现松耦合和高内聚的设计。DDD 也提倡语言统一,域专用语言、模型语言、代码语言保持一致。消除开发人员和领域专家在语言、理解等方面的鸿沟,实现软件系统和业务需求的高度契合。

image.png

当我们按照业务能力将业务拆成多个业务能力域,并构建每个域的业务模型,我们就可以通过微服务来设计这些各自独立且彼此依赖的业务模型。由于微服务是最小功能服务,可单独部署,用API交互,因此实现更广泛的用例。每个微服务都有自己的数据存储 ,围绕业务能力进行组织 。他们的状态是外部化 ,且每个微服务可选择适合他们的技术 。

小结

亚马逊在过去几年中已经大规模地将其基础设施转向微服务架构,目前采用亚马逊云上的多个服务来实现微服务,如使用 Amazon ECS、Amazon Lambda 来运行服务,Amazon API Gateway 提供 API 访问,Amazon SQS、Amazon SNS 用于服务间异步通信….这些服务充分利用云计算的优势,帮助亚马逊构建灵活、可靠、易于维护的分布式系统。

文章来源:
https://dev.amazoncloud.cn/column/article/65139d20659184378dd2c40c?sc_medium=regulartraffic&sc_campaign=crossplatform&sc_channel=CSDN

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/145617.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

二、BurpSuite Scan扫描

1.Scan details 解释:选择只是爬行还是爬行加代码审计 Scan Type:选择爬行或者代码审计URLs to scan:定义要扫描的网址。Burp将从这些网址开始进行爬行,并默认将包括指定网址文件夹下的所有内容。Protocol settings:使…

Unity2023打包首包从78Mb到3.0Mb-震惊-我做对了什么

(全程并没有使用AssetBundle , 历史原因,Resources目录还有不少资源残留) 曾经的我在2019打包过最小包10m左右,后来发现到了Unity2020之后暴增到40m,又加上2023版本URP,1个Unity输出包可能至少55M 如下图…

试图一文彻底讲清 “精准测试”

在软件测试中,我们常常碰到两个基本问题(困难): 很难保障无漏测:我们做了大量测试,但不清楚测得怎样,对软件上线后会不会出问题,没有信心; 选择待执行的测试用例&#…

【数据结构篇】堆

文章目录 堆前言基本介绍认识堆堆的特点堆的分类堆的操作堆的常见应用 堆的实现JDK 自带的堆手动实现堆 堆 前言 本文主要是对堆的一个简单介绍,如果你是刚学数据结构的话,十分推荐看这篇文章,通过本文你将对堆这个数据结构有一个大致的了解…

职业规划,什么是职业兴趣 - 我喜欢做什么?

能够在工作岗位上面做出成绩的人,都是结合自身兴趣,对职业进行合理规划的那一类。尤其是步入中年以后,能够创造出巨大价值的人,无一例外都是喜欢自己职业的人。没有将兴趣融入工作的人,只能够忍受默默无闻地活着&#…

Unity 内存性能分析器 (Memory Profiler)

一、 安装 安装有两种方式一: add package : com.unity.memoryprofiler方式二: From Packages : Unity Registry 搜索 Memory Profiler 二、 使用 打开:Windows - > Analysis - > Memory Profiler 打开MemoryProfiler界面&#xff0…

蓝桥杯每日一题2023.9.30

蓝桥杯大赛历届真题 - C&C 大学 B 组 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 对于此题,首先想到了dfs进行一一找寻,注意每次不要将重复的算进去,故我们每次循环可以记录一个开始的位置,下一次到这个位置时,…

细胞机器人系统的概念

摘要 本文讨论了一种新型机器人系统的理论和工程的概念基础。该系统由协作完成任务的自主机器人单元组成。本文在描述了该系统与细胞自动机和神经网络的相关性和差异后,建立了该系统的基础属性及其对机器人单元结构的影响、它们操作的空间以及它们完成全局任务的算法…

深入理解操作系统- - 进程篇(1)

目录 进程解释: process in memory(进程在内存中包含什么) : 并发的进程: 进程定义: 个人定义: 书本定义: 进程状态: 进程何时离开CPU: 内部事件: 外部事件: 进…

C++ -- 学习系列 std::deque 的原理与使用

一 deque 是什么? std::deque 是 c 一种序列式容器,其与 vector 类似,其底层内存都是连续的,不同的地方在于, vector 是一端开口,在一端放入数据与扩充空间,而 deque 是双端均开口,都可以放…

pip version 更新

最近报了一个错: 解决办法: 在cmd输入“conda install pip” conda install pip 完了之后再输入: python -m pip install --upgrade pip ok.

C++ AB组辅导课

C AB组辅导课 蓝桥杯C AB组辅导课 第一讲 递归与递推 Acwing1、整数划分(递归)2、acwing92. 递归实现指数型枚举10凑算式(全排列)11李白打酒(全排列)12、棋牌总数(递归)13、剪邮票(递归)14、1050. 鸣人的影分身 (递归或动态规划(记忆化搜索))15、方格分割 (dfs思维&…

Win10自带输入法怎么删除-Win10卸载微软输入法的方法

Win10自带输入法怎么删除?Win10系统自带输入法就是微软输入法,这个输入法满足了很多用户的输入需求。但是,有些用户想要使用其它的输入法,这时候就想删除掉微软输入法。下面小编给大家介绍最简单方便的卸载方法吧。 Win10卸载微软…

Oracle物化视图(Materialized View)

与Oracle普通视图仅存储查询定义不同,物化视图(Materialized View)会将查询结果"物化"并保存下来,这意味着物化视图会消耗存储空间,物化的数据需要一定的刷新策略才能和基表同步,在使用和管理上比…

【网络安全】网络安全之信息收集和信息收集工具讲解,告诉你黑客是如何信息收集的

一,域名信息收集 1-1 域名信息查询 可以用一些在线网站进行收集,比如站长之家 域名Whois查询 - 站长之家站长之家-站长工具提供whois查询工具,汉化版的域名whois查询工具。https://whois.chinaz.com/ 可以查看一下有没有有用的信息&#xf…

Linux服务器安装Anaconda 配置远程jupyter lab使用虚拟环境

参考的博客: Linux服务器安装Anaconda 并配置远程jupyter lab anaconda配置远程访问jupyter,并创建虚拟环境 理解和创建:Anaconda、Jupyterlab、虚拟环境、Kernel 下边是正文了。 https://www.anaconda.com/download是官网网址,可…

7.网络原理之TCP_IP(上)

文章目录 1.网络基础1.1认识IP地址1.2子网掩码1.3认识MAC地址1.4一跳一跳的网络数据传输1.5总结IP地址和MAC地址1.6网络设备及相关技术1.6.1集线器:转发所有端口1.6.2交换机:MAC地址转换表转发对应端口1.6.3主机:网络分层从上到下封装1.6.4主…

django 实现:闭包表—树状结构

闭包表—树状结构数据的数据库表设计 闭包表模型 闭包表(Closure Table)是一种通过空间换时间的模型,它是用一个专门的关系表(其实这也是我们推荐的归一化方式)来记录树上节点之间的层级关系以及距离。 场景 我们 …

网页采集工具-免费的网页采集工具

在当今数字化时代,网页采集已经成为了众多领域的必备工具。无论是市场研究、竞争情报、学术研究还是内容创作,网页采集工具都扮演着不可或缺的角色。对于许多用户来说,寻找一个高效、免费且易于使用的网页采集工具太不容易了。 147SEO工具的强…

Spring Mvc的相关知识

一、初识MVC 1.Spring Mvc 是控制层的Spring框架,替换Servlet,除了它以外,还有 struct1和 struct2 区别: 1.struct1被struct2 取代 2.struct2:采用 prototype多例模式,内存消耗快,经常会出现内存…