什么是架构?架构是一个系统的基本组织结构,涵盖所包含的组件、组件之间的关系、组件与环境的关系、以及指导架构设计和演进的原则等内容。经常有人问架构重点需要关注多少属性,我们粗略的可以概括一下九点:
可修改性、可测试性、可扩展性、性能、可用性、安全性、可部署性、共享性。

      一、可修改性

  什么是可修改性?可修改性是指一个系统进行修改的容易程度,以及系统适应这些修改的灵活性。


  与可修改性相关的几个方面:可读性(readability)、模块化(modularity)、可重用性(reusability)、可维护性(maintainability)

       
可读性涉及要素:1)写得好。方法、函数、变量、类、模块是否简单明了。2)文档齐全。代码中注释是否齐全。3)结构规整。结构清晰明了、注释简介规范。

   提高可读性策略:1.提供显示接口;2.减少双向依赖;3.抽象公共服务;4.使用继承技术;5.使用延迟绑定技术。

      二、可测试性

  什么是可测试性?可测试性是指软件系统通过执行基本的测试来暴露其错误的难易程度。

  软件测试包括:功能测试(白盒测试、黑盒测试)、性能测试(负载测试、压力测试、可扩展性测试)、安全性测试、可用性测试、安装测试、可访问性测试。


  增强可测试性策略:1)降低系统复杂度(子系统)、2)高内聚低耦合、3)提供定义良好的接口、4)降低类的复杂性、5)正确的异常处理、6)无限循环和/或阻塞等待、7)依赖于时间的逻辑、8)并发性、9)内存管理。

      三、可扩展性


  什么是可扩展性?可扩展性重点关注的是代码和应用程序是否能符合将来未知的编码而进行的提前设计。比如:代码设计中我们尽可能要求功能的最小化原则,接口设计的高内聚低耦合原则,应用程序设计子系统等,都和可扩展性相关。

        四、性能

  什么是性能?性能是指系统能够满足吞吐量或时延要求程度的指标,用每秒执行事务的数量或单个事务耗费的时间来表示。

  性能复杂度一般用大写的O符合表示,定义为输入变化的响应情况,通常用执行代码所耗费的时间来表示。

  度量性能方法:1.使用上下文管理器度量时间 2.使用时间模块开计时代码 3.使用时间模块来度量代码性能 4.使用时间模块度量CPU时间 

      五、可用性


  程序设计的可用性主要包括以下几点:是否符合使用者的操作心里,是否满足性能要求,是否开发者能在系统真实运行的环境下进行相应的修改,是否程序可以进行友好的扩展而不是僵化设计。

      六、可扩展性

  可扩展性包括两种:水平扩展和垂直扩展。

  水平扩展包括:1)活跃冗余 2)热备份 3)故障检测或重启 4)缓存它 5)去偶 6)优雅降级 7)数据接近代码 8)按照SLA设计

  垂直扩展包括:1)向现有系统添加更多资源 2)更好地利用系统中的现有资源

      七、安全性

  安全性是软件重要的方面。信息系统安全架构需要包含以下几个方面:保密性、完整性、可用性、认证、授权、不可否认性。


  常见的安全漏洞:溢出错误(缓存溢出、算术溢出、整型溢出)、未经验证或验证不当的输入、不当的访问控制、加密问题、使用HTTP而没有使用HTTPS、不安全的认证、弱密码的使用、安全散列或秘钥的重用、弱加密技术、无效或过期的证书/秘钥、信息泄露、服务器的元信息、开放的索引页、开发的端口、静态条件、系统时钟漂移、不安全的文件(文件夹)操作等

  Python中常见的四种安全问题:读取输入、表达式求值、溢出错误、序列化问题。

  Web应用中的安全问题:服务器端模板注入、服务器端模板注入-回避、服务拒绝、跨站脚本攻击等

  安全编码的策略:输入验证、最简原则、最小特权原则、清理数据、授权访问、进行有效的测试、多层防御实践、定义安全需求、模型威胁、安全策略的架构和设计

     八、可部署性

  与可部署性相关的因素:模块结构、产品运行环境和开发环境、开发生态系统支持、标准化配置、标准化基础设施、容器的使用

     九、共享性


  面对现今互联网蓬勃发展,出现了很多大数据云计算的新理念,比如:BaaS、IaaS、PaaS、SaaS、DaaS、低代码等,我们可以理解为共享技术。比如云计算里的多租户、为什么要上云,都是为了最大化节约社会资源,增强系统的可共享性,而进行的创新。

  共享性涉及的要素:可分为软件共享性和硬件共享性。

  软件共享性的策略:虚拟机技术、云计算技术、大数据技术等;硬件共享性的策略:共享数据库、共享硬件系统等

           总纲


  系统架构需要关注的属性客观因素不外乎以上九大专题内容,不过真实的系统架构设计我们又不仅仅需要关注以上内容,还包括系统的主观因素,环境、相关利益者等都能制约系统的架构。我们需要灵活运用以上的知识,比如有的架构更关注安全性可能会舍弃部分的可用性,又比如我们为了增强系统的可修改性,可能系统的可部署性又需要折中处理。我们需要融汇贯通的理解主客观因素,平衡制约系统的主客观矛盾,所以我在总结篇介绍

  系统架构的核心理念:他强由他强,清风拂山岗;他横由他横,明月照大江;他自狠来他自恶,我自一口真气足。最终达到《无招》境界!