主题: 软件架构介绍
软件架构定义
- 概念:软件架构是系统的组织结构,作为软件系统的蓝图,指导程序员开发软件的交互组件。
- 组成:包括软件系统的基本结构,并解释系统的行为。
- 功能:定义组件间的交互方式、操作环境以及设计软件的原则。
软件架构的重要性
- 利益相关者需求平衡:满足不同利益相关者的需求,并作为团队成员间沟通的基础。
- 设计决策:架构代表早期的设计决策,这些决策会影响后续的编码实现。
- 适应性:良好设计的架构允许在需求变化时保持敏捷。
- 软件系统寿命:即使实现细节发生变化,也能延长软件系统的寿命。
软件架构的影响
- 非功能性需求:如性能、可扩展性、可维护性、互操作性、安全性和管理性。
- 技术栈选择:架构设计指导技术栈的选择,技术栈包括软件、编程语言、库和框架。
- 生产环境:架构推动关于软件发布环境的决策,包括运行和交付应用程序给最终用户的基础设施,如服务器、负载均衡器和数据库。
软件架构设计产生的成果物
- 软件设计文档(SDD):包含技术规范,指明设计应如何实现,提供软件的功能描述和设计考虑。
- 架构图:展示组件、它们之间的交互、约束和范围,显示设计中使用的架构模式。
- 统一建模语言(UML)图:使用通用的、与编程语言无关的符号来沟通结构和行为。
总结
- 软件架构:作为应用程序的蓝图,代表其底层组织结构。
- 良好架构设计的重要性:作为团队成员间沟通的基础,代表早期设计决策,一旦开发开始难以改变,并适应开发过程中的需求变化。
- 架构设计的影响:影响技术栈选择、生产环境,产生的成果物包括SDD、架构图和UML图。
主题: 软件设计与建模
软件设计概述
- 定义:在开发之前记录软件的结构组件和行为属性的过程。
- 目的:通过建模来表达其设计,包括创建软件解决方案及其子组件的可视化或图表表示,以及它们之间的交互。
结构化设计(Structured Design)
- 概念:将软件问题概念化为组织良好的较小解决方案元素,称为模块和子模块。
- 重点:强调组织以实现解决方案,模块应具有高内聚和低耦合。
- 耦合:模块间的通信,系统应设计为模块间的弱关联,以便一个组件的变化对另一个组件的影响最小。
- 应用:常用于服务导向架构和基于微服务的架构模式。
行为模型(Behavioral Models)
- 定义:描述系统的行为,而不解释如何实现该行为。
- UML(统一建模语言):一种标准化的建模语言,用于可视化表示复杂软件系统的架构、设计和实现。
- 优点:
- 规划功能,节省时间和金钱。
- 帮助新团队成员快速上手。
- 促进技术与非技术受众之间的沟通。
- 帮助开发者轻松导航源代码。
UML图
- 分类:结构图和行为图。
- 结构图:描述系统的静态方面,如系统的组件、它们之间的关系和环境。
- 行为图:描述系统的动态方面,如状态转换图和交互图。
状态转换图(State Transition Diagram)
- 定义:一种UML图,包含状态和事件的集合,描述系统的不同状态以及引起状态变化的事件。
交互图(Interaction Diagram)
- 定义:用于模拟软件系统的动态性质,帮助可视化对象及其关系。
- 序列图:一种交互图,显示对象之间的通信相对于时间的关系。
总结
- 结构化设计:将软件问题分解为组织良好的较小解决方案元素。
- 行为模型:描述系统的行为,不解释实现方式。
- UML图:帮助开发者在编码前快速了解项目,提前规划功能,轻松导航源代码。
- 状态转换图:描述系统状态和引起状态变化的事件的行为模型。
- 交互图:描述交互对象之间的通信。
主题: 面向对象分析与设计(OOAD)
面向对象编程(OOP)基础
- 核心概念:OOP 语言(如 Java、C++、Python)中,对象包含数据和定义对象可以执行的行为。
- 示例:创建代表病人的对象,包含取消预约的行为。
类(Classes)与对象(Objects)
- 类:对象的通用版本,作为对象的蓝图或模板,包含属性(properties)和方法(methods)。
- 实例化(Instantiation):在代码中创建特定对象的过程,此时类的通用属性被赋予具体值。
- 对象:从类创建的具体实体,具有具体的数据和行为。
面向对象分析与设计(OOAD)
- 应用:适用于可以被分解为相互作用的对象的系统,便于多名开发者同时在应用的不同部分工作。
- UML 图:用于展示系统的静态结构和动态行为,包括行为和结构图。
类图(Class Diagrams)
- 定义:一种结构化的 UML 图,用于展示对象之间的关系。
- 组成:
- 类:每个框代表一个类,显示其属性。
- 属性:对象的数据和可用行为(方法)。
- 关系:显示类之间的继承和其他关系。
- 继承:子类继承父类的属性,并且可以添加额外的属性和方法。
示例
- 医疗人员类图:护士、医生和技术员是医疗人员的子类;专科医生是医生的子类。
总结
- OOAD:基于交互对象的行为规划软件系统的过程。
- 对象:包含数据和定义其行为的实体。
- 类:作为对象蓝图的实体。
- 类图:展示对象间关系的 UML 结构图。
主题: 应用程序架构方法
组件(Components)
- 定义:组件是封装功能的个体单元,作为应用程序的一部分与其他组件一起工作。
- 特性:
- 可重用性:设计用于在不同应用程序中重复使用。
- 可替换性:应易于用另一个组件替换。
- 独立性:设计上不依赖其他组件。
- 可扩展性:能够添加行为而不改变其他组件。
- 封装性:将数据和方法捆绑在一起,隐藏内部状态,不暴露具体实现。
- 非上下文特定性:设计使其在不同环境中运行,通过传递数据设置内部状态。
组件示例
- API:可作为组件,如果它能在多个系统和应用程序中重用。
- 数据访问对象:数据库的接口,可以在应用程序不知情的情况下切换用户到不同的数据库。
- 控制器(controller):决定特定事件需要调用哪些其他组件的组件,控制数据在两个其他组件间的流动。
组件化架构(Component-Based Architecture)
- 重点:设计分解为逻辑组件,提供比面向对象设计更高的抽象级别。
- 要求:定义、组合和实现松散耦合的独立组件,使它们协同工作创建应用程序。
服务(Services)
- 定义:类似于组件,也是功能的单元,但设计为独立部署并被多个系统重用。
- 业务需求:专注于解决业务需求。
- 关键区别:服务只有唯一、始终运行的实例,多个客户端与之通信。
服务示例
- 信用检查:检查客户信用的服务。
- 贷款计算:计算月度贷款支付的服务。
- 抵押贷款处理:处理抵押贷款申请的服务。
服务导向架构(SOA)
- 定义:服务松散耦合,通过网络上的通信协议相互通信。
- 特点:支持构建分布式系统,通过通信协议向其他应用程序提供服务。
分布式系统(Distributed Systems)
- 定义:多个服务位于不同机器上的系统,通过通信协议(如HTTP)传递消息来协调交互。
- 特性:
- 对最终用户来说,表现为单一的、连贯的系统。
- 共享资源,如硬件、软件和数据。
- 容错性,即使某个节点或服务失败,系统也继续运行。
- 多个活动并发运行,减少延迟,提高吞吐量。
- 可扩展性,随着用户数量的增加而扩展。
节点(Nodes)
- 定义:网络上任何可以识别、处理和传输数据到其他节点的设备。
- 组成:分布式系统由多个相互连接的节点组成,节点在SOA中运行一个或多个服务。
架构类型
- 分布式系统:可能使用客户端-服务器、三层、对等或微服务等基本类型的架构。
总结
- 组件:具有可重用性、独立性、可替换性、可扩展性、封装性和非上下文特定性。
- 组件化架构:将系统分解为逻辑独立组件。
- 服务:由组件构成,独立部署,可被多个系统重用。
- SOA:服务通过网络上的通信协议松散耦合并相互通信。
- 分布式系统:在不同机器上运行多个服务,对最终用户来说表现为单一的、连贯的系统。
主题: 软件架构模式
架构模式定义
- 架构模式:在软件架构中重复使用的解决方案,突出系统内部元素和结构的共性。
架构模式类型
-
两层架构(2-tier):
- 定义:也称为客户端-服务器架构,服务器托管和管理大多数资源与服务,客户端通过界面请求数据或服务。
- 示例:文本消息应用、数据库客户端与数据库服务器的连接。
-
三层架构(3-tier):
- 定义:由多个水平层组成,每层只与直接相邻的层通信,分为表示层、中间层(业务逻辑处理)、数据层。
- 示例:Web应用程序,使用Web服务器提供用户界面,应用服务器处理用户输入,数据库服务器处理数据管理。
-
对等架构(Peer-to-Peer, P2P):
- 定义:由既是客户端又是服务器的节点组成的去中心化网络,节点之间直接共享资源。
- 示例:文件共享、即时消息、协作、高性能计算,如加密货币(比特币、以太坊)。
-
事件驱动架构:
- 定义:侧重于事件的生产者和消费者,生产者监听并响应触发器,消费者处理事件。
- 示例:网约车应用(如Lyft和Uber),客户发出乘车请求事件,该事件被路由到服务提供者。
-
微服务架构:
- 定义:将应用程序功能分解为模块化组件(服务),通过API进行通信。
- 示例:社交媒体网站,用户账户可以请求多种服务,如添加朋友、目标广告推荐、显示内容。
架构模式特点
- 两层架构:客户端和服务器。
- 三层架构:三个互相交互的层。
- 事件驱动:由消费者响应的动作。
- 对等:由充当客户端和服务器的去中心化节点网络组成。
- 微服务:作为单一系统行为的松散耦合的独立服务,服务间通信由编排处理。
模式组合
- 组合性:两种或以上的模式可以结合使用,但并非所有模式都能相互兼容(如P2P和2-tier不兼容)。
总结
- 架构模式是解决软件架构问题的重复性解决方案。
- 不同架构模式可能共享相关特性。
- 架构模式的选择取决于系统架构师对软件系统需求的判断。
主题: 应用程序部署环境
应用程序环境定义
- 组成:包括运行应用程序所需的硬件和软件资源,如应用代码、软件栈、依赖的库、第三方应用、中间件、操作系统、网络组件、物理或虚拟硬件、内存和存储。
预生产环境
- 开发环境:开发者的工作站,积极编码应用程序的平台。
- QA/测试环境:QA团队测试应用程序组件的环境。
- 暂存环境:尽可能复制生产环境的平台,但不面向普通用户。
生产环境
- 定义:包括运行应用程序的完整解决方案堆栈,包括硬件、软件和额外的基础设施组件。
- 用户:面向所有用户。
- 要求:必须考虑应用程序的负载、安全性、可靠性和可扩展性等非功能性需求。
- 复杂性:比预生产环境更复杂。
部署选项
-
本地部署(On-Premises Deployment):
- 位置:系统及其基础设施位于组织内部,通常在防火墙之后。
- 责任:组织负责系统、硬件、相关基础设施和运行应用程序所需的维护。
- 成本:通常比云部署更昂贵。
-
云部署:
- 公有云:在云服务提供商拥有的硬件上,通过互联网使用软件支持的基础设施,硬件和服务与其他公司共享。
- 提供商:Amazon Web Services (AWS)、Microsoft Azure、Google Cloud Platform、IBM Cloud。
- 私有云:云基础设施专为单一组织独家使用,可以在本地运行或由服务提供商拥有、管理和操作。
- 优势:增强安全性,提供完全定制的灵活性。
- 混合云:公有云和私有云的结合,优化成本、安全性、可扩展性和灵活性。
- 公有云:在云服务提供商拥有的硬件上,通过互联网使用软件支持的基础设施,硬件和服务与其他公司共享。
总结
- 应用程序环境:包括开发、测试/QA、暂存和生产环境。
- 生产环境:必须考虑负载、安全性、可靠性和可扩展性等非功能性需求。
- 部署选项:可以在传统的本地硬件上部署,或在公有云、私有云或混合云平台上部署。
主题: 生产部署组件
生产环境部署组件
- 定义:生产环境中部署应用程序所需的常见组件。
防火墙(Firewall)
- 目的:监控网络之间的流量,基于一组安全规则允许或阻止请求数据。
- 功能:作为网络间的屏障,阻止病毒、恶意软件和黑客访问内部网络。
负载均衡器(Load Balancer)
- 目的:在多个服务器(服务器场)之间高效分配网络流量。
- 位置:位于客户端和服务器之间。
- 功能:防止服务器流量过载,确保没有单个服务器超负荷工作,管理并发客户端请求,并快速可靠地返回正确数据。
服务器类型
-
Web 服务器:
- 功能:提供网页、文件、图像和视频等内容给客户端。
- 响应:主要响应来自Web浏览器的超文本传输协议请求。
-
应用服务器:
- 功能:运行业务逻辑,将应用程序提供给客户端,而不是客户端自己运行应用程序。
- 主要任务:启用客户端与服务器端应用程序代码之间的交互。
-
代理服务器:
- 功能:作为中间服务器,处理两个层级之间的请求。
- 用途:负载均衡、系统优化、缓存、作为防火墙、隐藏请求源、加密、扫描恶意软件等。
数据库服务器
- 定义:存储在计算机上的相关数据集合,可通过多种方式访问。
- 管理:通常由数据库管理系统(DBMS)控制。
- 功能:控制数据的流动和存储,DBMS连接数据库服务器和应用程序,以便应用程序可以检索或操作数据库中存储的数据。
总结
- 生产环境组件:包括防火墙、负载均衡器、Web和应用服务器、代理服务器以及数据库服务器。
- 防火墙:监控网络间流量的安全设备。
- 负载均衡器:在服务器之间分配网络流量。
- Web 服务器:向客户端提供内容。
- 应用服务器:运行业务逻辑并提供应用程序。
- 数据库服务器:通过数据库管理系统存储和控制数据流动。