4+1视图是描述应用程序架构的绝佳方式 。每一个视图都描述了架构的一个重要侧面 。场景把视图中的元素如何协作串联在一起 。现在我们来看看为什么架构是如此重要 。
为什么架构如此重要
应用程序有两个层面的需求 。第一类是功能性需求,这些需求决定一个应用程序做什么 。这些通常都包含在用例(use case)或者用户故事(user story)中 。应用的架构其实跟这些功能性需求没什么关系 。功能性需求可以通过任意的架构来实现,甚至是非常糟糕的大泥球架构 。
架构的重要性在于,它帮助应用程序满足了第二类需求:非功能性需求 。我们把这类需求也称之为质量属性需求,或者简称为“能力” 。这些非功能性需求决定一个应用程序在运行时的质量,比如可扩展性和可靠性 。它们也决定了开发阶段的质量,包括可维护性、可测试性、可扩展性和可部署性 。为应用程序所选择的架构将决定这些质量属性 。
2 什么是架构的风格
在物理世界中,建筑物的建筑通常遵循特定的风格,例如维多利亚式、美国工匠式或装饰艺术式 。每种风格都是一系列设计决策,限制了建筑的特征和建筑材料 。建筑风格的概念也适用于软件 。David Garlan和Mary Shaw这两位软件架构学科的先驱定义了如下架构风格:
因此,架构风格根据结构组织模式定义了一系列此类系统 。更具体地说,架构风格确定可以在该风格的实例中使用的组件和连接器的词汇表,以及关于如何组合它们的一组约束 。
【什么是微服务架构?】
特定的架构风格提供了有限的元素(组件)和关系(连接器),你可以从中定义应用程序架构的视图 。应用程序通常使用多种架构风格的组合 。例如,在本节的后面,我将描述单体架构是如何将实现视图构造为单个(可执行与可部署)组件的架构样式 。微服务架构将应用程序构造为一组松散耦合的服务 。
分层式架构风格
架构的典型例子是分层架构 。分层架构将软件元素按“层”的方式组织 。每个层都有明确定义的职责 。分层架构还限制了层之间的依赖关系 。每一层只能依赖于紧邻其下方的层(如果严格分层)或其下面的任何层 。
可以将分层架构应用于前面讨论的四个视图中的任何一个 。流行的三层架构是应用于逻辑视图的分层架构 。它将应用程序的类组织到以下层中:
- 表现层:包含实现用户界面或外部API的代码 。
- 业务逻辑层:包含业务逻辑 。
- 数据持久化层:实现与数据库交互的逻辑 。
- 单个表现层:它无法展现应用程序可能不仅仅由单个系统调用的事实 。
- 单一数据持久化层:它无法展现应用程序可能与多个数据库进行交互的事实 。
- 将业务逻辑层定义为依赖于数据持久化层:理论上,这样的依赖性会妨碍你在没有数据库的情况下测试业务逻辑 。
让我们看一下克服这些弊端的替代架构:六边形架构 。
关于架构风格的六边形
六边形架构是分层架构风格的替代品 。如图2-2所示,六边形架构风格选择以业务逻辑为中心的方式组织逻辑视图 。应用程序具有一个或多个入站适配器,而不是表示层,它通过调用业务逻辑来处理来自外部的请求 。同样,应用程序具有一个或多个出站适配器,而不是数据持久化层,这些出站适配器由业务逻辑调用并调用外部应用程序 。此架构的一个关键特性和优点是业务逻辑不依赖于适配器 。相反,各种适配器都依赖业务逻辑 。
文章插图
图2 六边形架构的一个示例,它由业务逻辑和一个或多个与外部系统通信的适配器组成 。业务逻辑具有一个或多个端口 。处理来自外部系统请求的入站适配器调用入站端口 。出站适配器实现出站端口,并调用外部系统
业务逻辑具有一个或多个端口(port) 。端口定义了一组操作,关于业务逻辑如何与外部交互 。例如,在Java中,端口通常是Java接口 。有两种端口:入站和出站端口 。入站端口是业务逻辑公开的API,它使外部应用程序可以调用它 。入站端口的一个实例是服务接口,它定义服务的公共方法 。出站端口是业务逻辑调用外部系统的方式 。出站端口的一个实例是存储库接口,它定义数据访问操作的集合 。
推荐阅读
- 电脑为什么会死机?这几点原因需要了解一下
- 关于绿茶文化的介绍
- ELK交换机日志分析
- 茶叶,竟然是中国偷到印度的
- 关于白茶绿雪芽的来历介绍
- MongoDB是什么,怎么用?看完你就知道了
- 在Kubernetes上构建和部署Java Spring Boot微服务
- 柚子是凉性还是热性
- 五谷杂粮是哪5种
- 凿壁偷光的主人公是谁