什么是系统架构(Architecture)
设计不仅仅指的是外观和感觉,它还包括运作方式。—— 史蒂夫·乔布斯
系统架构(System Architecture),软件架构(Soft Architecture)是 IT 领域常见的名词,架构设计是软件系统构建过程中极其关键的一部分。
系统架构为什么重要的架构模式都有哪些 【码哥字节】了解不同的架构设计所运用的不同设计哲学。
一起来看下常见的架构模式:Client-Server、Peer to Peer、MVC、Layered、Distribute-Cluster、Micro-Service、Even-Source、Hexagonal 逐个击破。
Architecture,原意建筑学,其实软件架构的概念就是源于建筑学。建筑学是建筑物设计和建造相关的艺术和技术的综合。建筑学是一门横跨工程技术和人文艺术的学科。它研究的是建筑物可资使用的空间、可供欣赏的形象,以及围绕空间、形象如何产生确立、调整美化等的一系列问题。并且其所研究的对象不仅是建筑物本身,更主要的是研究人们对建筑物的要求及其如何得以满足,研究建筑物实体从无到有的产生过程中相应的策划、设计、实施等。
建筑学研究建筑的规划、设计和实施。软件架构研究软件的规划、设计和实施。
在架构设计中,根据业务、技术、组织、灵活性、可扩展性以及可维护性等因素,将应用系统划分成不同的部分,使这些部分之间相互分工、相互协作,从而完成特定的需求。架构贯穿系统实现的整个过程,是软件系统实现的主要参考,是软件系统实现的蓝图。软件系统的规划、设计和实施依架构的设计而组织实施。
系统架构为什么重要
我们知道摩尔定律——计算机硬件的能力大致每两年提高一倍的速度发展。然而软件开发的流程却没有这样的提速过程,开发成本也没有下降,系统架构的设计方法论和设计模式不断变化,而这个重要的流程依旧没有一个完全可靠和一劳永逸的解决方案。为什么开发过程有什么特别的难题面几点:
-
复杂性(Complexity)
软件可以说是人类创造的最复杂的系统类型。软件的各个模块之间有各种显性或隐性的依赖关系,随着系统的成长和模块的增多,这些关系的数量往往以几何级数的速度增长。而理解运用这些复杂性的人并没有太多的变化。
-
不可见性(Invisibility)
软件工程师能直接看见源代码,但是源代码不是软件本身。并且静态的源代码和运行的系统也不一样,软件运行环境的复杂性也增加了软件系统的不可预测性。软件系统不能以简单的方式描述出来,设计文档,描述说明,流程图,架构图这些也不过是让复杂的软件系统以更易于理解和易于交流的方式展示,却依旧不能完全描述系统的全貌。
-
易变性(Changeability)
修改软件看似很容易,修改软件比修改硬件容易多了,修改软件系统也比修改一座巍立建筑物容易的多。所以人们自然地期待软件系统能够适应未来的变化。但变化却是复杂的,环境也是复杂的,这些复杂的情况往往让一个易于修改的事情却变成一件越来越困难的事情。
-
服从性(Conformity)
软件系统不能独立存在,它总是运行在硬件上面,也总是要服从系统中其他组成部分的要求,也要服从用户的要求、行业的要求。
软件系统的以上特性使得系统架构的设计显得尤其重要。系统架构设计通过以下方式来解决上面的软件难题:
-
抽象
抽象是系统架构设计的重要一步。抽象是将复杂的概念简单化。在最高层次上,将软件系统抽象为对象和过程两个高层次概念。对象可以是系统、组件、接口、类、方法等等不同层次的概念,过程是系统运行的方式和流程。抽象使具象的事物概念化,从而确定边界,易于理解,易于交流。
-
分解
分解与组合相互作用。分解就是将高层次的抽象概念分解成低层次的抽象概念,就是将实体分成小的部件或组成部分,在应对复杂度的诸多方式中,”分而治之“是一项基本策略,它把大问题持续分解成小问题,直到每一个小问题都能够解决为止。
-
语言
语言的边界就是世界的边界。领域语言、设计语言确定系统的、和。语言使系统显见于文档,设计图等等易于理解的层次,也使得系统的易变性被规范在可预见和可控制的范围之中。
几种架构模式
Client-Server
因此我们当前访问的大部分 站,如新闻咨询 站、博客 站等等都属于这种模式。
Peer to Peer
P2P 模式流行于文件分享与下载、计算与存储、即时通信和协同共享等领域。
MVC
MVC 模式在客户端和 H5 前端都比较流行。也一直是 Web 后端流行的架构模式,在 Java Web 领域催生的 Struts、Spring MVC 等 Web 后台框架,让曾经复杂的 Web 开发变成一种异常简单的开发。
随着前后端渐渐分离,之前的后台 MVC 已经将 View 完全交于前端,前后端通过相关协议通信,完成 View 数据的传输。
Layered
分层架构是运用最为广泛的架构模式,几乎每个软件系统都需要通过层(Layer)来隔离不同的关注点(Concern Point),以此应对不同需求的变化,使得这种变化可以独立进行。
单一职责原则,是系统设计开发重要的原则。分层架构就时时遵循单一职责原则。不同的层次相互隔离,承担不同的职责。
说起分层架构,最让人熟知的就是经典的三层架构。经典三层架构自顶向下由用户界面层(User Interface Layer)、业务逻辑层(Business Logic Layer)与数据访问层(Data Access Layer)组成。三层架构是简单 Client-Server 架构的升级。
除去经典的三层架构。在领域驱动设计中,Eric Evans 设计了一种经典的四层架构,其在用户界面层与业务逻辑层之间引入了新的一层,即应用层(Application Layer)。其余几层也相应的有所调整。
之上所提的架构都是在单体架构之下。单体架构和多服务架构是从服务的部署模式、运行模式来考虑。
单体架构有如下优势:
-
易于开发:借助于开发框架,单体应用的开发及其简单,开发人员也很少需要考虑系统、部署、 络等层次的问题。
-
易于测试:单体应用部署在一个进程中,环境简单。只要服务启动就可以测试所有的功能。
-
易于部署:往往只需要将应用打包成一个简单的包就可。
-
易于水平扩展:只需要将程序包部署多个服务即可。
单体应用的劣势:
-
维护成本增加:随着需求的增多,单体系统将越来越臃肿,维护的复杂性也将越来越大。
-
持续交互周期长:一方面维护困难,另一方面单体应用在并行开发,并行测试上将十分困难,单体应用十分不适合快速迭代的敏捷开发。
-
扩展性差:由于臃肿的系统,将导致系统扩展性变难。系统的升级也需要十分谨慎。
-
对新人不友好。
分布式系统拆分:
Micro-Service
微服务并没有一个严格的定义。以下是 Martin Fowler 描述的微服务:
微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间相互协调、相互配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常基于 HTTP 的 RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境。
微服务通常具有以下特性:
-
单一职责:业务独立,团队自主。职责单一的服务应该具有核心的领域,高内聚、低耦合,与其他系统和领域确定明确的边界。
-
轻量级通信:通信应该简单,轻量。与语言无关,与平台无关。
-
独立性:独立开发,独立测试和独立部署。
一切选择都是权衡的过程。微服务解决了单体应用的许多问题,自然也会带来相应的问题。分布式和集群的环境是复杂的,基于此的微服务架构也将具有相应的复杂度。
随着微服务的流行,微服务的很多问题也被越来越多的框架和服务解决掉了。我们以 Spring Cloud 技术栈为例:
-
SpringBoot:单体服务,快速创建项目,快速集成各种框架,易于测试,易于部署。
-
Feign:微服务独立部署,通过相关协议通信。Feign 就是一个简单的申明式通信框架,基于 HTTP restful。
-
Eureka:独立服务越来越多,服务实例也越来越多。服务治理便是必须的,Eureka 提供高可用的服务注册和服务发现功能。
-
Ribbon:Feign 只负责通信,Ribbon 提供客户端负载均衡,是系统优化的部分。
-
Hystrix:微服务将带来服务间复杂的依赖关系,分布式和集群的复杂度也将带来许多难以预料的问题。为防止复杂 络和复杂系统某一点的问题导致整个系统的雪崩状态,便有了 Hystrix,Hystrix 是 Spring Cloud 体系中优秀的断路器,可以在系统发生问题时进行服务降级,防止整体系统崩溃。
-
Zuul:统一 关,统一 关是以 Facade 模式,对外提供友好的接口,微服务化之后,服务将越来越多,越来越复杂,为了降低外部系统调用的复杂度,统一 关就是常用解决方案。
-
Config:服务划分越多,配置将越多,Spring cloud config 提供统一的配置管理。
-
Sleuth:服务监控和治理。监控是复杂系统必需的基础设施。系统感知、问题发现、性能定位都需要监控的加持。
事件溯源是最新流行一种应用程序体系结构模式。事件源将应用程序进行的状态更改建模为事件的不可变序列或“日志”。事件源不是在现场修改应用程序的状态,而是将触发状态更改的事件存储在不可变的日志中,并将状态更改建模为对日志中事件的响应。
CQRS(命令查询的责任分离 Command Query Responsibility Segregation )将读取和写入操作分成不同的模型,使用 命令 更新数据,并使用 查询 来读取数据。
Hexagonal
六边形架构由以下三个组件组成:
-
Ports:又可以分为输入端和输出端,是系统与其他系统交互的接口。
-
Adapters:与其他系统的适配层,一方面防止核心系统和领域被外部影响,即防腐;另一方面方便 api 使用。
-
Domain:应用和模型是程序的核心。
六边形架构的核心理念是:应用通过”端口”跟外部进行交互。在传统的分层架构中很容易跨越层间的边界,把业务逻辑渗透到其它层中去。六边形架构重要的就是“边界”和“领域”。六边形架构的初衷是为了解决技术与业务系统的解耦合问题,以及技术与技术间的解耦合问题,这一架构从设计模式中来,从业务的实体服务出发,将面向接口的设计具体化的端口协议和适配器实现,服务自身实现独立性和完备性。
参考:
《系统架构——复杂系统的产品设计与开发》丹尼尔·塞尔瓦
《构建之法——现代工程》邹欣
《微服务架构与实现》王磊
《领域驱动设计——软件核心复杂性应对之道》Eric Evans
《实现领域驱动设计》Vaughn Vernon
《Spring Cloud 微服务实战》翟永超
《工程学——无尽的前沿》欧阳莹之
《人月神话》Frederick P. Brooks, Jr.
推荐:
Tomcat 高并发之道原理拆解与性能调优
数据库系统设计概述
Tomcat 架构原理解析到架构设计借鉴
服务设计思考:平台化
经典 O(n2)比较类排序算法
关注 「码哥字节」更多好看
文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树使用JDBC操作数据库数据库操作93529 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!