应用程序架构是如何演变的

news2024/12/23 22:09:03

【squids.cn】 全网zui低价RDS,免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等

如果您一直在开发或以某种方式参与应用程序架构,那么在过去的几年中您肯定看到了许多变化。有很多不同类型的架构和技术陆续出现然后消失,以至于有时很难跟踪它们。但是,当你反思它们时,它们不仅可以讲述过去的故事,还可以预示应用程序架构的发展方向。

在这篇文章中,我将讨论近几年来应用程序架构在我看来是如何演变的,以及每次演变的驱动因素是什么。我们将讨论单体架构、面向服务的架构(SOA)、微服务,最后是事件驱动架构(EDA)。让我们开始吧!

单体架构 

在过去,所有东西都是单体的。大团队会专注于一个单体应用程序,这个应用程序负责执行许多任务。单体架构允许您迅速地将原型组合在一个应用程序中,这个应用程序可以完成所有的事情。由于你不需要依赖其他团队,所以维护成本较低。然而,当应用程序被推送到生产并继续增长时,事情很快就会失控。

例如,一个典型的单体应用程序可能包括多个层次,如用户界面层、业务逻辑层、数据接口层和数据存储层。此应用程序会接受用户输入,处理它,应用业务逻辑,使用现有数据进行丰富,然后可能将其存储在关系型数据库中,供以后进行额外的处理。

单体架构有三个主要的缺点:部署慢、可扩展性差和相互依赖。单体应用程序更难调试和更新。大型应用程序需要大量的时间和努力来确定问题并部署更新,而当这些更新被推出时,需求可能已经发生了变化。

单体应用的第二个缺点是可扩展性差。一个应用程序能做的只有那么多。在当今的世界,计算资源比过去便宜得多,我们通过简单地为应用程序投入更多的计算资源,更容易地并行计算。一个过去运行在强大但非常昂贵的服务器上的单体应用程序,现在可以作为较小的应用程序并行运行在普通硬件上。此外,较慢的部署(我们之前讨论过的)使得快速扩展变得更加困难。

此外,在一个大型应用中,每一个小的改动都可能影响到应用的一个或多个其他部分。这增加了可能破坏重要功能的额外风险。例如,用户界面层的一个错误可能会影响整个应用程序。

在我之前的工作中,我曾在一个应用上工作,该应用提供了对跨资产市场数据(股票、外汇、大宗商品等)的访问。在一个版本中,我为股票用户推出了一个新功能,但由于我们的应用是单体的,我的这个小改动最终破坏了一个由外汇用户使用的应用的非常重要的功能。这两个功能是完全独立的,但由于它们是同一个代码库的一部分,它们有很多共享资源。不用说,外汇用户并不满意。

敏捷 vs. 瀑布 

很快,公司们开始意识到,他们需要找到一个更好的方法来构建他们的应用程序。大约在同一时间,敏捷方法论正变得越来越受欢迎。以前,公司主要使用瀑布方法论来开发应用程序,这意味着收集大量的需求,进行极端的规划,涵盖所有的边界情况,然后在一个大的爆炸中小心地发布具有所有功能的最终产品。

图片

对于某些行业,由于每次迭代所涉及的成本和/或监管要求,这是唯一的方法。而对于许多其他行业,敏捷方法论更为有效。敏捷方法论是关于在快速迭代中发布最小可行产品(MVP)。你失败得越快,知道什么不起作用,就越好。敏捷方法论,虽然已经存在了一段时间,但在2011年左右变得非常流行,当时敏捷联盟(是的,这是真的)创建了《敏捷实践指南》。敏捷认证和敏捷教练无处不在。不管你怎么努力躲藏,你的敏捷教练总会在每日晨会时找到你。

面向服务的架构 

随着敏捷方法论的推广,人们明确地认识到,拥有可以轻松更新和扩展的小型应用程序有着宝贵的优势。这引出了面向服务的架构。在单体架构中,一个应用程序自己做所有事情,而在面向服务的架构中,一个应用程序会被分解成基于其用途的几个较小的服务。正如IBM的这篇文章所提及的:

SOA的核心目的是通过格式良好、易于使用、同步的接口(如Web服务)来暴露系统中的数据和功能。

回到我们关于单体应用的例子,它可以被分解成多个较小的服务:

  • 用户界面服务。

  • 业务逻辑服务。

  • 数据集成服务。

  • 数据存储服务。

每个服务都负责一个特定的用例。它们都独立存在,并通过基于简单对象访问协议(SOAP)的同步API进行通信。然而,随着你组织中服务数量的增长,为每个服务编写一个与其他所有服务通信的接口会变得越来越困难。这时,你会从企业服务总线(ESB)中受益。ESBs允许开发人员解耦他们的服务(请参阅下面的图)并使整体架构更加灵活。

图片

解耦服务图

解耦您的服务

面向服务架构的多个好处包括:

  • 快速推出。

  • 更容易调试。

  • 可扩展性。

  • 职责明确。

  • 对其他服务/组件的依赖性较少。

由于这些明显的优势,大多数公司开始采纳面向服务的架构以及敏捷方法论,但他们几乎不知道,云计算的革命即将到来。

微服务 

面向服务的架构最终为微服务架构铺平了道路,它们有很多相似之处,但在一些细微之处有所不同。

我认为导致微服务架构产生的最重要因素是廉价和灵活的基础设施。由于水平扩展你的基础设施并在集群上而不是在强大的服务器上运行你的服务变得如此容易,所以鼓励开发人员编写可以轻松在集群上并行运行的软件。大约在同一时期,出现了大量的分布式应用和框架,如Hadoop,它普及了map-reduce编程模型。

此外,大约在2015年,AWS变得非常流行。那时AWS已经存在了一段时间,但大约在2015年,基础设施即服务(IaaS)的整个概念真正起飞,而且非常方便地启动EC2实例变得很便宜。初创公司是第一个采用IaaS的,不久之后被中小型公司所追随。经过大量的争论和讨论,大型公司最终接受了IaaS,并决定采用混合云方法。

图片

分布式云基础设施是很好的,但有一个问题。与你自己的数据中心中的少量服务器相比,它非常难以预测和管理。在分布式云基础设施上稳健地运行一个应用程序绝非易事。很多事情可能会出错。你的应用程序的一个实例或你的集群上的一个节点可能会静默地失败。你如何确保你的应用程序可以继续运行,尽管出现这些故障?答案是微服务。

微服务是一个非常小的应用程序,负责一个特定的用例,就像在面向服务的架构中一样,但它与其他服务完全独立。它可以使用任何语言和框架开发,并可以部署在任何环境中,无论是本地还是公共云。此外,它们可以轻松地在不同地区的多个不同服务器上并行运行,以提供并行性和高可用性。例如,一个小的数据应用程序可以在一个计算集群的5个实例上运行,这样如果一个实例失败,其他4个会确保你的数据应用程序继续运行。

将你的服务分解为多个微服务意味着它们需要相互通信。与依赖企业服务总线和同步API的面向服务架构不同,微服务利用了消息代理和异步API

容器化 

正如面向服务架构的转变受到敏捷方法论的推动一样,微服务运动也受到了容器化的推动。HackerNoon的这篇文章很好地描述了容器化:

容器化涉及将一个应用程序及其所有相关的配置文件、库和依赖性捆绑在一起,使其能够在不同的计算环境中高效且无错误地运行。

图片

Docker,最初于2013年发布,是最受欢迎的容器平台。如今,几乎所有现代软件都可以通过docker来运行。随着云基础设施的兴起,确保在新环境中、特别是在云上运行软件,docker变得极其重要。

随着微服务的普及,服务网格的概念也随之兴起,该网格允许服务主要使用请求/应答消息模式保持连接。Nginx在其博客上对服务网格有很好的解释:

服务网格是一个可配置的、低延迟的基础设施层,设计用于处理使用应用程序编程接口(API)的应用程序基础设施服务之间基于网络的大量进程间通信。

图片

在2014年,Google开源了Kubernetes,允许你编排你的微服务。借助docker和Kubernetes,部署和管理云上的分布式微服务变得容易得多。在过去的几年中,这两种技术变得越来越受欢迎。如今,大多数新兴的初创公司都编写原生云微服务,可以通过docker轻松部署,并通过Kubernetes编排,许多大型公司正在与Pivotal这样的公司合作,轻松地将他们的应用迁移到云上。

云基础设施和分布式微服务的兴起导致了大量为监控微服务(它们消耗了多少内存)、自动化(自动跨服务器持续部署微服务)和资源管理(为最便宜的AWS资源竞标)提供服务的初创公司的诞生。如果你曾参加过AWS峰会,那么你就知道我在说什么。

事件驱动的架构 

随着我们继续捕获越来越多的数据,我们继续找到创造性的方法来使用它。随着IoT(如Alexa微波炉)和可穿戴设备(如Apple Watch)的兴起,有了大量的时序数据或事件。

在我们面前有这么多的屏幕(智能手机、智能手表、平板电脑、笔记本电脑等)可以立即推送通知,公司发现变得更加事件驱动非常重要。他们的用户期望在重要事件发生时获得实时通知。例如,当我的Delta航空公司应用程序通知我航班延误或开始登机时,它都是实时的。它不等我手动检查或仅在固定间隔时检查事件。

在这个勇敢的新事件驱动的世界中,微服务是围绕事件设计的。它仍然相对较新,并正在迅速地在各个行业中普及。

结论 

在这篇文章中,我的目标是向您展示在我看来,应用程序架构在过去几年中如何受到不同技术和需求的影响和发展。当大多数公司尝试采用微服务和云时,其他公司则走在前面并采用了事件驱动的架构。在我看来,可预见的未来是以事件驱动的方式设计的微服务。

作者:Himanshu Gupta

更多内容请关注公号【云原生数据库

squids.cn,云数据库RDS,迁移工具DBMotion,云备份DBTwin等数据库生态工具。

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

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

相关文章

Windows端口封禁图文教程

文章目录 方式一:打开secpol.msc方式二:Microsoft 管理控制台参考文档 方式一:打开secpol.msc WIN键R输入secpol.msc 在本地安全策略窗口中,选中“IP安全策略,在本地计算机”,右键右侧空白处,选…

ubuntu2004上安装openjdk6

今天因为工作需要要在Ubuntu2004上安装openjdk6,还是有点麻烦的. 这里记录一下过程。 Step 1: openjdk的下载地址在这里,选择对应的架构并将openjdk开头的包全部下载回来。 Step 2: 安装的时候系统缺少以下依赖: …

3d模型轻量化方法以及工具平台

3D模型轻量化是指减少3D模型的文件大小,以便在需要更快的数据传输或更快的渲染速度时使用。 一、以下是几种常见的3D模型轻量化方法: 1、移除不必要的细节:模型中可能存在一些细节,但这些细节对于渲染或使用模型并不重要。通过移…

基于springboot实现乐校园二手书交易管理系统【项目源码+论文说明】

基于springboot实现乐校园二手书交易管理系统演示 摘要 在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括乐校园二手书交易管理系统的网络应用,在外国二手书交易管理系统已经是很普遍的方式,不过国内的…

如何实现两栏布局?这篇文章告诉你所有的细节!

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 ⭐ 专栏简介 📘 文章引言 一、背…

031-从零搭建微服务-监控中心(一)

写在最前 如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):mingyue: 🎉 基于 Spring Boot、Spring Cloud & Alibaba 的分布式微服务架构基础服务中心 源…

正点原子嵌入式linux驱动开发——外置RTC芯片PCF8563

上一章学习了STM32MP1内置RTC外设,了解了Linux系统下RTC驱动框架。一般的应用场合使用SOC内置的RTC就可以了,而且成本也低,但是在一些对于时间精度要求比较高的场合,SOC内置的RTC就不适用了。这个时候需要根据自己的应用要求选择合…

Halcon 常用通道Scale灰度元操作整理

一、说明 我们将常见的,基于图层信号幅度的操作集中展现出来,以便以后见到相关的操作不会产生唐突。至于这些算子在项目中的灵活应用,我们将在项目中具体指定。 二、基于数量(Scale)的操作 2.1 亮度(Scale)调整 scale_image_max(Image:ImageScaleMax::)

微信批量添加好友,让你的人脉迅速增长

在这个数字化时代,微信作为中国最流行的社交平台之一,已经成为了人们生活中不可或缺的一部分。它的广泛使用为我们提供了无限的社交可能性。你是否曾为了扩大人脉圈子而犯愁?今天,我将向你揭示一个高效添加微信好友的秘密武器&…

Camtasia2024破解版百度云网盘下载

真的要被录屏软件给搞疯了,本来公司说要给新人做个培训视频,想着把视频录屏一下,然后简单的剪辑一下就可以了。可谁知道录屏软件坑这么多,弄来弄去头都秃了,不过在头秃了几天之后,终于让我发现了一个值得“…

居舍系列再续“异国的相遇2023”艺术项目

跨越四城感知艺术声浪,以科技与艺术探索旅行中的情绪共鸣 太古酒店集团旗下居舍系列再度开启两年一度的艺术项目“异国的相遇 2023”(Encounters Across Cultures)新篇章 — 当艺术与科技同频 ,以艺术为媒介,将科技赋予…

16 用于NOMA IoT网络上行链路安全速率最大化的HAP和UAV协作框架

文章目录 摘要相关模型仿真实验仿真结果 摘要 优化无人机到HAP的信道分配、用户功率和无人机三维位置来研究上行安全传输解决非凸问题,采用K-means聚类算法,将成对的用户划分成不同的组,每个簇可以有相应的无人机服务,然后将构造…

NAT技术与代理服务器

目录 一、NAT与NAPT技术 1.NAT技术 2.NAPT技术 (1)四元组的唯一性 (2)数据的传输过程 (3)NAPT的缺陷 二、代理服务器 1.正向代理和反向代理 2.代理服务器的应用 (1)游戏加…

16、Python --案例实操:控制台打印【 菱形 】和 【 圆 】

目录 控制台打印菱形控制台打印圆 控制台打印菱形 # 控制台打印菱形# 层数 num 8 # 打印上半部分 for i in range(num):# 第一行if i 0:print( * (num - 1 - i) *)else:print( * (num - 1 - i) * (i * 2 - 1) * *)# 打印下半部分 for i in range(num - 1):if i num …

Qt重定向QDebug,Qt/C++开源作品39-日志输出增强版V2022

Qt重定向QDebug,自定义一个简易的日志管理类 Chapter1 Qt重定向QDebug,自定义一个简易的日志管理类0.前言1.最简单的操作运行结果2.实现一个简易的日志管理类 Chapter2 Qt::Qt Log日志模块Qt Log日志模块官方解释官方Demo思路 Chapter3 QT日志模块的个性…

Vue3 创建项目

1 桌面打开 CMD窗口,使用vue create 项目名创建项目。 2 选择Manually select features 自定义配置 3 选择配置:使用空格确认/取消,回车确定: Babel 降级处理 CSS Pre-processors CSS预处理器 Linter/Formatter 代码检查 4 选择vu…

「滚雪球学Java」:基础程序设计(章节汇总)

🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!&#xf…

Vue3:将表格数据下载为excel文件

需求 将表格数据或者其他形式的数据下载为excel文件 技术栈 Vue3、ElementPlus、 实现 1、安装相关的库 下载xlsx 和 file-saver 库 npm install -S file-saver npm install -S xlsx引入XLSX库和FileSaver库 import XLSX from xlsx; import FileSaver from file-saver;…

华为OD机考算法题:高效的任务规划

题目部分 题目高效的任务规划难度难题目说明 你有 n 台机器编号为 1 ~ n,每台都需要完成一项工作, 机器经过配置后都能独立完成一项工作。 假设第 i 台机器你需要花 分钟进行设置, 然后开始运行, 分钟后完成任务。 现在&#x…

虹科培训 | 虹科携手PLCopen开展IEC 61131-3国际工程师培训

文章来源:虹科工业控制 阅读原文:https://mp.weixin.qq.com/s/MLYhBWiWx7qQSApx_3xhmA (一)课程背景 什么是IEC 61131-3? IEC 61131-3 是工业自动化行业唯一得到大量应用的组态编程语言国际标准;主导制定…