软件开发就是把一个复杂的问题分解为一系列简单的问题,再把一系列简单的解决方案组合成一个复杂的解决方案。而软件开发中最大的挑战,就是即能够快速高效地针对需求、环境的变化做出改变,也能够持续提供稳定、高可用的服务。而软件架构,就是软件系统的骨骼与框架。

所谓架构,见仁见智,很难有一个明确或标准的定义;但架构并非镜花水月或阳春白雪,有系统的地方就需要架构,大到航空飞机,小到一个电商系统里面的一个功能组件,都需要设计和架构。抽象而言,架构就是对系统中的实体以及实体之间的关系所进行的抽象描述,是对物/信息的功能与形式元素之间的对应情况所做的分配,是对元素之间的关系以及元素同周边环境之间的关系所做的定义。架构能将目标系统按某个原则进行切分,切分的原则,是要便于不同的角色进行并行工作,结构良好的创造活动要优于毫无结构的创造活动。

软件架构的核心价值,即是控制系统的复杂性,将核心业务逻辑和技术细节的分离与解耦。软件架构是系统的草图,它描述的对象是直接构成系统的抽象组件;各个组件之间的连接则明确和相对细致地描述组件之间的通信。在实现阶段,这些抽象组件被细化为实际的组件,比如具体某个类或者对象。在面向对象领域中,组件之间的连接通常用接口来实现。架构师的职责是努力训练自己的思维,用它去理解复杂的系统,通过合理的分解和抽象,理解并解析需求,创建有用的模型,确认、细化并扩展模型,管理架构;能够进行系统分解形成整体架构,能够正确的技术选型,能够制定技术规格说明并有效推动实施落地。

软件架构分类

在笔者的知识体系中,实际上将架构分为业务架构、应用架构、基础架构这几大类,业务架构主要着眼于控制业务的复杂性,基础架构着眼于解决分布式系统中存在的一系列问题。往往可以将软件架构,分为以下几类:

  • 业务架构/解决方案架构:核心是解决业务带来的系统复杂性,了解客户/业务方的痛点,项目定义,现有环境;梳理高阶需求和非功能性需求,进行问题域划分与领域建模等工作;沟通,方案建议,多次迭代,交付总体架构。
  • 应用架构:根据业务场景的需要,设计应用的层次结构,制定应用规范、定义接口和数据交互协议等。并尽量将应用的复杂度控制在一个可以接受的水平,从而在快速的支撑业务发展的同时,在保证系统的可用性和可维护性的同时,确保应用满足非功能属性要求(性能、安全、稳定性等)。
  • 数据架构:专注于构建数据中台,统一数据定义规范,标准化数据表达,形成有效易维护的数据资产。打造统一的大数据处理平台,包括数据可视化运营平台、数据共享平台、数据权限管理平台等。
  • 中间件架构:专注于中间件系统的构建,需要解决服务器负载,分布式服务的注册和发现,消息系统,缓存系统,分布式数据库等问题,同时架构师要在 CAP 之间进行权衡。
  • 运维架构:负责运维系统的规划、选型、部署上线,建立规范化的运维体系。
  • 物理架构:物理架构关注软件元件是如何放到硬件上的,专注于基础设施,某种软硬件体系,甚至云平台,包括机房搭建、网络拓扑结构,网络分流器、代理服务器、Web 服务器、应用服务器、报表服务器、整合服务器、存储服务器和主机等。

单体分层架构

在 Web 应用程序发展的早期,大部分工程是将所有的服务端功能模块打包到单个巨石型(Monolith)应用中,譬如很多企业的 Java 应用程序打包为 war 包,最终会形成如下的架构:

巨石型应用易于搭建开发环境、易于测试、易于部署;其缺陷也非常明显,无法进行局部改动与部署,编译时间过长,回归测试周期过长,开发效率降低等。集中式架构分为标准的三层:数据访问层、服务层和 Web 层。

在 Web2.0 时代刚刚流行的时候,互联网应用与企业级应用并没有本质的区别,集中式架构分为标准的三层:数据访问层、服务层和 Web 层。

  • 数据访问层用于定义数据访问接口,实现对真实数据库的访问;
  • 服务层用于对应用业务逻辑进行处理;
  • Web 层用于处理异常、逻辑跳转控制、页面渲染模板等。

SOA 面向服务架构

SOA(Service-Oriented Architecture) 面向服务架构,是在互联网应用规模迅速增长,集中式架构已无法做到无限制地提升系统的吞吐量的背景下,产生的模块化开发、分布式扩展部署等相对宽泛的概念。

SOA 是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口联系起来。SOA 中的接口独立于实现服务的硬件平台、编程语言,采用中立的方式进行定义,这使得构建在各系统中的服务可以以一种统一和通用的方式进行交互。面向服务架构,它可以根据需求通过网络对松散耦合的粗粒度应用组件进行分布式部署、组合和使用。

MSA 微服务架构

微服务(Microservices Architecture Pattern)由 Martin Fowler 在 2014 年提出的,是希望将某个单一的单体应用,转化为多个可以独立运行、独立开发、独立部署、独立维护的服务或者应用的聚合,从而满足业务快速变化及分布式多团队并行开发的需求。如康威定律(Conway’s Law)所言,任何组织在设计一套系统(广义概念)时,所交付的设计方案在结构上都与该组织的通信结构保持一致,微服务与微前端不仅仅是技术架构的变化,还包含了组织方式、沟通方式的变化。

对于微服务,不同背景的人也有不同的见解,对于熟悉 SOA 的开发者,微服务是去中心化的分布式软件架构。SOA 更多强调重用,而微服务偏向于重写。SOA 偏向水平服务,微服务偏向垂直服务;SOA 偏向自上而下的设计,微服务偏向自下而上的设计。

微服务与软件工程,面向对象设计中的原理同样相通,都是遵循单一职责(Single Responsibility)、关注分离(Separation of Concerns)、模块化(Modularity)与分而治之(Divide & Conquer)等基本的原则。

Cloud Native 云原生架构

云原生是通过构建团队、文化和技术,利用自动化和架构来管理系统的复杂性和解放生产力。
— Joe Beda,Heotio CTO,联合创始人

Pivotal 是云原生应用的提出者,并推出了 Pivotal Cloud Foundry 云原生应用平台和 Spring 开源 Java 开发框架,成为云原生应用架构中先驱者和探路者。早在 2015 年 Pivotal 公司的 Matt Stine 写了一本叫做迁移到云原生应用架构的小册子,其中探讨了云原生应用架构的几个主要特征:符合 12 Factors 应用、面向微服务架构、自服务敏捷架构、基于 API 的协作以及抗脆弱性。2015 年 Google 主导成立了云原生计算基金会(CNCF),起初 CNCF 对云原生(Cloud Native)的定义包含以下三个方面:应用容器化、面向微服务架构、应用支持容器的编排调度。

云原生应用程序简单地定义为从头开始为云计算架构而构建应用程序;这意味着,如果我们将应用程序设计为预期将部署在分布式、可扩展的基础架构上,我们的应用程序就是云原生的。随着公共云将承载越来越多的算力,未来云计算将是主流的 IT 能力交付方式,CNCF 也对云原生进行了重新定义:云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用;云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式 API。

  • Codeless 对应的是服务开发,实现了源代码托管,你只需要关注你的代码实现,而不需要关心你的代码在哪,因为在整个开发过程中你都不会感受到代码库和代码分支的存在。
  • Applicationless 对应的是服务发布,在服务化框架下,你的服务发布不再需要申请应用,也不需要关注你的应用在哪。
  • Serverless 对应的则是服务运维,有了 Serverless 化能力,你不再需要关注你的机器资源,Servlerless 会帮你搞定机器资源的弹性扩缩容

这些技术组合搭配,能够构建容错性好、易于管理和便于观察的松耦合系统;再结合可靠的自动化手段,云原生技术能够使工程师轻松地对系统作出频繁和可预测的重大变更。由此可见,云原生是保障系统能力灵动性地有效抓手;云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。微服务架构非常适合云原生应用程序;但是,云原生同样存在着一定的限制,如果你的云原生应用程序部署在 AWS 等公有云上,则云原生 API 不是跨云平台的。

云原生应用的关键属性包括了:使用轻量级的容器打包、使用最合适的语言和框架开发、以松耦合的微服务方式设计、以 API 为中心的交互和协作、无状态和有状态服务在架构上界限清晰、不依赖于底层操作系统和服务器、部署在自服务、弹性的云基础设施上、通过敏捷的 DevOps 流程管理、自动化能力、通过定义和策略驱动的资源分配。云原生是分布式应用当下重要的发展路径,其终态应当是 Distributionless,所有与分布式相关的问题由云平台解,分布式应用的开发会跟传统应用的开发一样方便,甚至更加便捷。

云基础架构

虚拟机

虚拟机由某些特定的硬件和内核虚拟化组成,运行客户操作系统。称为管理程序的软件创建虚拟化硬件,其可以包括虚拟磁盘,虚拟网络接口,虚拟 CPU 等。虚拟机还包括可以与此虚拟硬件通信的内核。管理程序可以托管,这意味着它是一些在主机操作系统(MacOS)上运行的软件,如示例中所示。它也可以是裸机,直接在机器硬件上运行(替换你的操作系统)。无论哪种方式,管理程序方法都被认为是重量级的,因为它需要虚拟化多个部分(如果不是全部硬件和内核)。

VM 需要硬件虚拟化才能实现机器级隔离,而容器则只需要在同一操作系统内进行隔离操作。 随着隔离空间数量的增加,开销差异变得非常明显。

容器

在过去几年里,云平台发展迅速,但其中困扰运维工程师最多的,是需要为各种迥异的开发语言安装相应的运行时环境。虽然自动化运维工具可以降低环境搭建的复杂度,但仍然不能从根本上解决环境的问题。

Docker 的出现成为了软件开发行业新的分水岭,容器技术的成熟也标志着技术新纪元的开启。Docker 提供了让开发工程师可以将应用和依赖封装到一个可移植的容器中的能力,这项举措使得 Docker 大有席卷整个软件行业并且进而改变行业游戏规则的趋势,这像极了当年智能手机刚出现时的场景——改变了整个手机行业的游戏规则。Docker 通过集装箱式的封装方式,让开发工程师和运维工程师都能够以 Docker 所提供的镜像分发的标准化方式发布应用,使得异构语言不再是捆绑团队的枷锁。

容器是包含应用程序代码,配置和依赖关系的软件包,可提供运营效率和生产力。容器为我们提供了可预测的,可重复的和不可变的运行预期,容器的兴起是 DevOps 即服务的一个巨大推动因素,可以克服当今面临的最大安全障碍。容器化通过在操作系统级别进行虚拟化来使应用程序可移植,从而创建基于内核的隔离的封装系统。容器化的应用程序可以放在任何地方,无需依赖项运行或需要整个 VM,从而消除了依赖关系。

作为独立的单元,容器能够在任何主机操作系统,CentOS,Ubuntu,MacOS,甚至是像 Windows 这样的非 UNIX 系统中运行。容器还充当标准化的工作或计算单元。一个常见的范例是每个容器运行单个 Web 服务器,数据库的单个分片或单个 Spark 工作程序等,只需要扩展容器的数量就能够便捷地扩展应用。每个容器都有一个固定的资源配置(CPU,RAM,线程数等),并且扩展应用程序需要只扩展容器的数量而不是单个资源原语。当应用程序需要按比例放大或缩小时,这为工程师提供了更容易的抽象。容器也是实现微服务架构的一个很好的工具,每个微服务只是一组协作容器。例如,可以使用单个主容器和多个从容器来实现 Redis 微服务。

Kubernetes 与编排

随着虚拟化技术的成熟和分布式架构的普及,用来部署、管理和运行应用的云平台被越来越多地提及。IaaS、PaaS 和 SaaS 是云计算的三种基本服务类型,分别表示关注硬件基础设施的基础设施即服务、关注软件和中间件平台的平台即服务,以及关注业务应用的软件即服务。容器的出现,使原有的基于虚拟机的云主机应用,彻底转变为更加灵活和轻量的容器与编排调度的云平台应用。

然而容器单元越来越散落使得管理成本逐渐上升,大家对容器编排工具的需求前所未有的强烈,Kubernetes、Mesos、Swarm 等为云原生应用提供了强有力的编排和调度能力,它们是云平台上的分布式操作系统。容器编排是通常可以部署多个容器以通过自动化实现应用程序的过程。像 Kubernetes 和 Docker Swarm 这样的容器管理和容器编排引擎,使用户能够指导容器部署并自动执行更新,运行状况监视和故障转移过程。

Kubernetes 是目前世界范围内关注度最高的开源项目,它是一个出色的容器编排系统,用于提供一站式服务。Kubernetes 出身于互联网行业巨头 Google,它借鉴了由上百位工程师花费十多年时间打造的 Borg 系统的理念,安装极其简易,网络层对接方式十分灵活。Kubernetes 和 Mesos 的出色表现给行业中各类工程师的工作模式带来了颠覆性的改变。他们再也不用关注每一台服务器,当服务器出现问题时,只要将其换掉即可。业务开发工程师不必再过分关注非功能需求,只需专注自己的业务领域即可。而中间件开发工程师则需要开发出健壮的云原生中间件,用来连接业务应用与云平台。

Kubernetes、Service Mesh 和 Serverless 三者共同演绎不同层次的封装和向上屏蔽下面的细节。Kubernetes 引入了不同的设计模式,实现对各种云资源全新、有效和优雅的抽象和管理模式,让集群的管理和应用发布变成了件相当轻松且不易出错的事。被广泛采用的微服务软件架构将分布式应用的各种复杂度迁移到了服务之间,如何通过全局一致、体系化、规范化和无侵入的手段进行治理就变成了微服务软件架构下至关重要的内容。Kubernetes 细化的应用程序的分解粒度,同时将服务发现、配置管理、负载均衡和健康检查等作为基础设施的功能,简化了应用程序的开发。而 Kubernetes 这种声明式配置尤其适合 CI/CD 流程,况且现在还有如 Helm、Draft、Spinnaker、Skaffold 等开源工具可以帮助我们发布 Kuberentes 应用。

Service Mesh 通过将各服务所共用和与环境相关的内容剥离到部署于每个服务边上的 Sidecar 进程而轻松地做到了。这一剥离动作使得服务与平台能充分解耦而方便各自演进与发展,也使得服务变轻而有助于改善服务启停的及时性。Service Mesh 因为将那些服务治理相关的逻辑剥离到了 Sidecar 中且作为独立进程,所以 Sidecar 所实现的功能天然地支持多语言,为上面的服务采用多语言开发创造了更为有利的条件。通过 Service Mesh 对整个网络的服务流量进行技术收口,让异地多活这样涉及流量调度的系统工程实现起来更加优雅、简洁与有效,也能更加方便地实现服务版本升级时的灰度、回滚而改善安全生产质量。由于技术收口,给服务流量的治理和演进、排错、日志采集的经济性等疑难问题创造了新的发展空间。

欢迎关注公众号:“架构一线”,定期分享一些实战心得,互联网前沿技术等.

架构漫谈:业务架构、应用架构与基础架构相关推荐

  1. 架构漫谈(三):如何做好架构之识别问题

    2019独角兽企业重金招聘Python工程师标准>>> 架构漫谈(三):如何做好架构之识别问题 作者: 王概凯  来源: InfoQ  发布时间: 2016-04-17 10:47  ...

  2. 超融合架构的优缺点_知道 超融合基础架构吗

    一"融合"架构的起源 "融合"架构最初的解决方案通常包括了服务器.SAN存储和网络(以太网或InfiniBand).一般是由单一供应商提供的包括服务器.存储和网 ...

  3. 架构漫谈(1):什么是架构

    今天阅读了架构漫谈第一章,什么是架构,文章讲的很详细,语言描述很生动.下面就是文章的内容: 为什么会产生架构? 想象一下,在最早期,每个人都完全独立生活,衣.食.住.行等等全部都自己搞定,整个人类都是 ...

  4. spring架构初学者_完整的厨师和基础架构初学者指南

    spring架构初学者 by Mohak Puri 由Mohak Puri 完整的厨师和基础架构初学者指南 (A complete beginner's guide to Chef and infra ...

  5. 软件架构万字漫谈:业务架构、应用架构与云基础架构

    软件架构万字漫谈:业务架构.应用架构与云基础架构 本部分节选自<软件架构设计> 软件开发就是把一个复杂的问题分解为一系列简单的问题,再把一系列简单的解决方案组合成一个复杂的解决方案.而软件 ...

  6. 《架构漫谈》阅读笔记

    这个礼拜,我精读了架构漫谈这本书,感觉自己对架构方面的知识有了更为深刻的了解.感觉学习了架构之后,能对自己的学习和实践有更大的帮助.在这个学期众多的结组任务中,我们可以通过架构的知识,来界定小组目标系 ...

  7. 《架构漫谈》阅读感想

    谈及架构,源于建筑. 一想到建筑,就能想到一块空间,有墙,有门,有窗. 用墙围住的一块密闭的盒子空间,通过门窗与外界保持沟通. 空间内根据住户的生活需求不同,划分为各个房间,有不同的功用. 然后人们对 ...

  8. SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)...

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:Restful 基础架构 2.具体内容 对于 Rest 基础架构实现处理是 SpringCloud 核心所在,其基本操 ...

  9. 数据中心基础架构 22 年演进

    01 前言 当今世界正处在信息技术(IT)创新的黄金时代.由机器学习.物联网和大规模可扩展应用支持的云计算.移动应用.大数据分析的巨大力量正在重塑商业和社会的方方面面.而这场IT复兴的中心,则是超大规 ...

  10. IOS-组件化架构漫谈

    2019独角兽企业重金招聘Python工程师标准>>> 组件化架构的由来 随着移动互联网的不断发展,很多程序代码量和业务越来越多,现有架构已经不适合公司业务的发展速度了,很多都面临着 ...

最新文章

  1. 【高并发、高性能、高可用】系统设计经验分享!
  2. RANSAC与 最小二乘(LS, Least Squares)拟合直线的效果比较
  3. 第二十四章——文件管理的代码保存
  4. python 编程(编写汽车保养时间表)
  5. angular--解决angular图片加载失败问题
  6. jQuery基础简介
  7. java使用Websocket获取HttpSession出现的问题与解决
  8. P1165 日志分析 洛谷
  9. 16个美艳时尚的的网站设计作品欣赏
  10. 辛普森 matlab,利用MATLAB软件编写辛普森求积公式程序
  11. 华为笔记本怎么激活windows_HUAWEI MateBook笔记本怎么激活Office?
  12. 手机及电脑的护眼模式开启
  13. 名片识别,史上最简单的集成攻略来啦!附有SDK包
  14. Linux安装iso镜像中的软件
  15. 阿里天池项目:淘宝电商数据分析(mysql)
  16. DeepTech深科技专访丨分布式系统开源项目领跑者Alluxio获5000万美元C轮融资
  17. 极限理论总结03:中心极限定理(CLT)与Edgeworth展开
  18. MSP432学习01--新建keil空工程
  19. 统一身份认证简单对接流程
  20. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java基于2023最新SSM计算机毕业设计选题大全(附源码+LW)之JAVA的社区疫情防控管理信息系统的设计与实现khjit

热门文章

  1. 人员、账户主数据管理介绍
  2. 网络安全季度总结:盘点2021年第一季度国内网络安全大事件
  3. nest.js实战之Interceptor转换响应
  4. linux apache fcgi,Apache结合spawn-fcgi使用FastCGI模式
  5. 传感器与检测技术(一)
  6. Http头信息(二)——请求头信息(一)
  7. beifen---http://vdisk.weibo.com/s/uhCtnyUhD0Ooc
  8. WIN10+Ubuntu双系统(UEFI启动方式)
  9. 【毕业设计】3-基于单片机的公交车智能播报到站运行位置指示系统(原理图+源码+论文)
  10. Zemax学习笔记——实战练习加深坐标断点和多重结构的理解