zoukankan      html  css  js  c++  java
  • 软件架构的核心思想

    前言

    welcome to chenqionghe's blog,架构能力其实更像是一种内功,需要我们不断地去学习,让我们用一张正能量的图片开启美好的学习生活,let's do it~

    一、软件架构的定义


    架构是一个系统的基本组织,涵盖所包含的组件,组件之间的关系、组件与环境的关系,以及指导架构设计和演进的原则等内容

    二、软件架构与设计

    软件架构和软件设计中都有“设计”的意思,但与后者相比,前者具有更高的抽象性和更广的范围

    • 软件架构关注如何对系统中的结构和交互进行较高级别的描述,它关注的是那些与系统骨架相关的决策问题,例如:功能、组织 、技术、业务和质量标准等。
    • 软件设计关注构成系统的部件或组件,以及子系统是如何组织的,关注的问题通常更接近代码或模块本身,例如:
      • 将代码分成哪些模块?如何组织?
      • 给不同的功能分配哪些类(或模块)?
      • 对于类“C”应该使用哪种设计模式?
      • 在运行时对象之间是如何交互的?传递什么消息?如何实施交互?

    三、软件架构的几个方面

    系统

    系统是以特定方式组织的组件集合,以实现特定的功能。
    软件系统是其软件组件的集合。一个系统通常可以划分为若干个子系统。

    结构

    结构是根据某个指导规则或原则来组成或组织在一起的一组元素的集合,可以是软件或硬件系统。
    软件架构可以根据观察者的上下文展示各个层次的结构

    环境

    软件系统所在的上下文或环境对其软件架构有直接的影响。
    这样的上下因素可以是技术、商业、专业、操作等

    利益相关者

    任何对某个系统及其成功与否感兴趣或关心的个体或团体,都是利益相关者。
    例如:架构师、开发团队、客户、项目经理和营销团队等

    四、软件架构的结构特征

    运行时结构

    在运行时创建的对象及其之间的交互方式经常决定部署架构。
    部署架构与可扩展性、性能、安全性和交互操作性等质量属性密切相关

    模块结构

    为了分解任务,如何拆分代码并把代码组织到模块和包中,这与系统的可维护性和可修改性密切相关,因为

    • 在代码组织过程中考虑到可扩展性的话,通常会将父类放在单独定义好的具有恰当文档和配置的包中,这样就可以轻易地通过增加外部模块进行扩展,而不需要处理太多的依赖关系
    • 对于那些依赖于外部或第三方开发者(库、框架等)的代码,通过会根据提供的安装或部署步骤,从外部源手动或自动地获取并补丁全部各种依赖。此类代码还提供多种文档(例如README、INSTALL)等,它们清楚地记录了这些步骤

    五、软件架构的质量属性

    质量属性是系统的可度量和可测试的特性,可用于评估系统在其指定环境中的非功能性需求方面的达成情况

    可修改性

    定义为对系统进行修改的容易程度,以及系统对理发进行调整的灵活性。
    这是讨论的修改不光是代码的修改、部署的修改,而是任何层次上的修改。
    一般架构师对可修改性的兴趣点如下:

    • 难点:对系统进行修改的难易程度
    • 成本:进行修改需要的时间和资源
    • 风险:任何与系统修改相关的风险

    代码可读性越强,其可修改性就越强,代码的可修改性与可读性成正比

    可测试性

    指一个软件系统支持通过测试来检测故障的程度。
    可测试性也可以认为是一个软件系统向最终用户和集成测试隐藏了多少bug
    一个系统的可测试性越好,它能隐藏的bug就越少。

    可扩展性

    指系统能够适应不断增长的负载需求,但同时要保证可接受的处理性能,一般分为两大类:

    • 横向(水平)扩展性。意味着通过向其中添加更多多的计算节点。
    • 纵向(垂直)扩展性。涉及系统单个节点中资源的添加或移除

    性能

    指系统在给定的计算资源内完成的工作量,完成的工作量和计算资源的比例(work/unit)越高,性能越高。

    计算资源的单位有以下几种

    • 响应时间。一个函数或执行单元运行所需要的时间。
    • 延迟。某个系统被激活并提供响应所需的时间。
    • 吞吐量。系统处理信息的某种比率。

    可用性

    指系统处于完全可操作状态的程度,以便在任何时候获得调用请求时可以执行的能力

    • 可靠性
      系统的可用性和可靠性密切相关,系统越可靠,可用性就越高。
    • 故障恢复能力
      影响可用性的另一个因素是从故障中恢复的能力,包括了故障检测、故障恢复、故障预防
    • 数据一致性
      CAP定理指出,系统的可用性与其数据一致性有密切联系。一致性和可用性一般膛会同时成立,因为可能通信失败,系统可以在一致性或可用性之间进行选择

    安全性

    避免被未经过身份验证的访问损害数据和逻辑,同时继续向通过谁的其他系统和角色提供服务的一种能力。

    可部署性

    指软件从开发环境到产品运行环境移交的难易程度。
    有以下相关因素:

    • 模块结构。
      将系统划分为易于部署的一个个子单元,则部署会容易
    • 产品运行环境与开发环境。与
      开发环境结构非常相似的产品运行环境会使部署
    • 开发生态系统支持。
      为系统提供成熟的工具链支持,允许各种依赖关系自动建立和验证等配置项内容,从而提高可部署性。
    • 标准配置。
      一个好的方式是开发者保持开发环境的配置结构和产品运行环境一致。
    • 标准化基础设施。
      将部署保持在一个标准化的基础设施上,提高可部署性
    • 容器使用
      随着Docker容器技术的普及,可以规范软件,减少启动/停止的开销,从而使部署更容易。

    六、其他常见概念

    内聚

    一个模块内相关联程度的度量,描述的是模块内的功能联系
    若一个模块之间各元素联系紧密,则内聚性就高(高内聚)
    如果能做到将模块做成一个功能类聚、独立性强、内部紧密结合才是一个理想的类聚模块,这对初学都来说,非常不容易,不光是个人技术能力的挑战,更是对某个领域业务水平的挑战。

    耦合

    各模块间相互联系紧密程度的一种度量。
    模块之间联系少,耦合性就越低,模块之间的相对独立性就越强。

    企业架构

    企业架构是一个定义企业结构和行为的概念蓝图。它确定了企业结构、流程、人员和信息流动如何与其核心目标相一致,以便有效地实现当前和未来的目标

    系统架构

    系统架构是系统的基本组织形式,由其结构和行为视图表示。该结构由两部分确定:构成系统的组件和组件的行为。组件的行为是指组件之间的交互,以及组件与外部系统之间的交互

    以上内容由chenqionghe整理,参考《软件架构-Python语言实现》,light weight baby~

  • 相关阅读:
    LintCode 17.子集
    JS时间操作
    Ajax总结
    Ajax请求文件下载操作失败的原因和解决办法
    遍历Map的几种方式
    java获取文件大小的方法
    Ajax详细介绍
    第31课
    30-React JSX IN DEPTH
    28-React state提升、组件组合或继承
  • 原文地址:https://www.cnblogs.com/chenqionghe/p/13158308.html
Copyright © 2011-2022 走看看