软件架构模式

2020/10/16 软件架构

系统架构(System Architecture),软件架构(Soft Architecture)是 IT 领域常见的名词,架构设计是软件系统构建过程中极其关键的一部分。

系统架构为什么重要

我们知道摩尔定律——计算机硬件的能力大致每两年提高一倍的速度发展。然而软件开发的流程却没有这样的提速过程,开发成本也没有下降,系统架构的设计方法论和设计模式不断变化,而这个重要的流程依旧没有一个完全可靠和一劳永逸的解决方案。为什么?软件开发过程有什么特别的难题?有下面几点:

  1. 复杂性(Complexity)

    软件可以说是人类创造的最复杂的系统类型。软件的各个模块之间有各种显性或隐性的依赖关系,随着系统的成长和模块的增多,这些关系的数量往往以几何级数的速度增长。而理解运用这些复杂性的人并没有太多的变化。

  2. 不可见性(Invisibility)

    软件工程师能直接看见源代码,但是源代码不是软件本身。并且静态的源代码和运行的系统也不一样,软件运行环境的复杂性也增加了软件系统的不可预测性。软件系统不能以简单的方式描述出来,设计文档,描述说明,流程图,架构图这些也不过是让复杂的软件系统以更易于理解和易于交流的方式展示,却依旧不能完全描述系统的全貌。

  3. 易变性(Changeability)

    修改软件看似很容易,修改软件比修改硬件容易多了,修改软件系统也比修改一座巍立建筑物容易的多。所以人们自然地期待软件系统能够适应未来的变化。但变化却是复杂的,环境也是复杂的,这些复杂的情况往往让一个易于修改的事情却变成一件越来越困难的事情。

  4. 服从性(Conformity)

    软件系统不能独立存在,它总是运行在硬件上面,也总是要服从系统中其他组成部分的要求,也要服从用户的要求、行业的要求。

软件系统的以上特性使得系统架构的设计显得尤其重要。系统架构设计通过以下方式来解决上面的软件难题:

  • 抽象

    抽象是系统架构设计的重要一步。抽象是将复杂的概念简单化。在最高层次上,将软件系统抽象为对象过程两个高层次概念。对象可以是系统、组件、接口、类、方法等等不同层次的概念,过程是系统运行的方式和流程。抽象使具象的事物概念化,从而确定边界,易于理解,易于交流。

  • 分解

    分解与组合相互作用。分解就是将高层次的抽象概念分解成低层次的抽象概念,就是将实体分成小的部件或组成部分,在应对复杂度的诸多方式中,”分而治之“是一项基本策略,它把大问题持续分解成小问题,直到每一个小问题都能够解决为止。

  • 语言

    语言的边界就是世界的边界。领域语言、设计语言确定系统的whathowwhy。语言使系统显见于文档,设计图等等易于理解的层次,也使得系统的易变性被规范在可预见和可控制的范围之中。

几种架构模式

一起来看下常见的架构模式:Client-Server、Peer to Peer、MVC、Layered、Distribute-Cluster、Micro-Service、Even-Source、Hexagonal

Client-Server

640

client-server 模式以请求-响应方式工作,客户端发送请求信息,服务端接受请求,作出相应处理,然后发回响应信息

Peer to Peer

651

端对端服务模式(Peer to Peer,简称 P2P),亦称为“点对点模式”,是指通过互联网将个人与个人连接起来,绕开中心平台而直接提供服务、完成交易的模式。

MVC

img

Model-View-Controller,MVC 架构是面向对象编程的一大进步。服务将逻辑划分为三个不同的组建:Model——模型,即数据,通常存储在数据库中,在内存中进行逻辑操作。View——用户可见的组建,用于用户交互和数据展示,如 Web GUI。Controller——逻辑操作,连接 Model 和 View 的组件,操作 Model 逻辑和 View 交互展示逻辑

Layered

img

三层架构的经典和流行,以及大量 Web 后台框架对三层架构的靠近,使得 Web 后台开发简单到一个刚刚入门的开发人员就可以进行 web 开发。也正因为此,使得大部分 web 开发人员的思维受限于此,从而成为人人调侃的 CRUD-Boy。随着 MIS 系统时代的渐远,三层架构也开始在一些领域无法成为“银弹“。

除去经典的三层架构。在领域驱动设计中,Eric Evans 设计了一种经典的四层架构,其在用户界面层与业务逻辑层之间引入了新的一层,即应用层(Application Layer)。其余几层也相应的有所调整。

img

Distribute-Cluster

img

应用的迭代速度也不断变快。单体应用的模式已经不适合互联网的快速发展。这样,后台分布式集群架构越来越流行。

Micro-Service

微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间相互协调、相互配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常基于 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:服务监控和治理。监控是复杂系统必需的基础设施。系统感知、问题发现、性能定位都需要监控的加持。

img

Even-Source

事件溯源是最新流行一种应用程序体系结构模式。事件源将应用程序进行的状态更改建模为事件的不可变序列或“日志”。事件源不是在现场修改应用程序的状态,而是将触发状态更改的事件存储在不可变的日志中,并将状态更改建模为对日志中事件的响应。

imgevent-source

CQRS 模式通常基事件溯源模式。在传统的体系结构中,使用同一数据模型查询和更新数据库。这十分简单,非常适用于基本的 CRUD 操作。但是,在更复杂的应用程序中,此方法会变得难以操作。例如,在读取方面,应用程序可能执行大量不同的查询,返回具有不同形状的数据传输对象 (DTO)。对象映射可能会变得复杂。在写入方面,模型可能实施复杂验证和业务逻辑。结果,模型执行太多操作,过度复杂。

CQRS(命令查询的责任分离 Command Query Responsibility Segregation )将读取和写入操作分成不同的模型,使用 命令 更新数据,并使用 查询 来读取数据。

Hexagonal

img

六边形架构又称“端口和适配器模式”,是 Alistair Cockburn 提出的一种具有对称性特征的架构风格。在这种架构中,系统通过适配器的方式与外部交互,将应用服务与领域服务封装在系统内部。

六边形架构由以下三个组件组成:

  • Ports:又可以分为输入端和输出端,是系统与其他系统交互的接口。
  • Adapters:与其他系统的适配层,一方面防止核心系统和领域被外部影响,即防腐;另一方面方便 api 使用。
  • Domain:应用和模型是程序的核心。

六边形架构的核心理念是:应用通过”端口”跟外部进行交互。在传统的分层架构中很容易跨越层间的边界,把业务逻辑渗透到其它层中去。六边形架构重要的就是“边界”和“领域”。六边形架构的初衷是为了解决技术与业务系统的解耦合问题,以及技术与技术间的解耦合问题,这一架构从设计模式中来,从业务的实体服务出发,将面向接口的设计具体化的端口协议和适配器实现,服务自身实现独立性和完备性

Search

    Post Directory