所有软件开发方法都要解决从需求到实践的转换问题,为了提高软件的质量,前辈们提出了分析工程和各种建模技术的需求,但是需求和设计之间的鸿沟还是很难逾越的,也就是说,缺乏从需求到设计进行衔接并做决策的中间过程,于是软件架构设计应运而生。
人们已经对架构设计提出了许多方法:工件驱动的方法、用例驱动的方法、模式驱动的方法、领域驱动的方法。这里展示一种经典的架构设计过程模型,它沿用了 RUP 中迭代增量的思想,由分析、描述、选择、构造和组合5个阶段组成,如图5.5所示。
图5.5
有兴趣的读者可以学习架构设计的元模型,来设计属于自己领域或者产品线的设计过程模型,其实下面的模型也是元模型的实例化。
如图5.5所示,系统依据需求规格说明书分析出功能需求和架构需求,通过用例和场景的描述,将需求分为关键的、次要的和可选的3类。关键需求决定架构,结合软件架构风格和通用知识选择最关键、影响最大的子系统分析设计并产生构件。组合就是定义构件接口,构件作为一个封闭的功能实体对外提供交互接口,并通过连接件将构件连接起来形成最终的软件架构描述。这是个不断迭代的过程,在每一次迭代中,都选取并实现一组用例和场景来确认并完善架构。
这个过程模型看似很流畅,架构师在设计时却很难把握它的正确性和精准性,而且用它构架的系统是否对后续设计开发形成一种原则上的指导是很难说的。我们知道,层次化分析是解决复杂问题的一般性方法,下面的方法将从层次化的角度来设计系统的架构模型,它将直接指导开发人员实现系统,是一种架构设计的理想方式。
接着讲讲架构设计方法之四层驱动模型。在软件开发过程中是存在多个层次的,对于每个层次,驱动其进行架构设计的因素也有所不同,所以更好的方式是,区分和建立必要的层次,从而形成一种层次化的多因素驱动的软件架构设计模型。我们将整个软件架构的设计划分为4个层次:目标层、信息层、构件层和实现层。同时,软件的整体复杂性也通过这4个不同的抽象层次清晰地刻画出来。模型中的每一层都有一种因素驱动着建模设计的进行:目标层的驱动因素是所要实现系统的各种相关角色;信息层的驱动因素是目标层中的各种目标;构造层的驱动因素是信息层中的各种信息及其信息活动;实现层的驱动因素是构件层中的类、对象、对象交互等各种面向对象设计的元素,实现层所产生的接口、类及其属性、方法的具体语言代码及实现框架则对接下来的编码实现阶段直接提供支持。
一般来说,软件架构需要关注性能、可用性、伸缩性、扩展性和安全性这5个要素,下面分别对这5个要素进行讲解。
性能
性能是架构设计的一个重要方面,任何软件架构设计方案都必须考虑可能带来的性能问题。也正是因为性能问题几乎无处不在,所以优化网站性能的手段非常多。
◎ 浏览器端:可以使用浏览器缓存、页面压缩传输、合理布局页面、减少Cookie传输等手段,甚至可以使用CDN加速功能。
◎ 应用服务器端:可以使用服务器本地缓存和分布式缓存,也可以通过异步操作方式来加快响应。在高并发请求的情况下,可以将多台应用服务器组成一个集群共同对外服务,提高整体处理能力,改善性能。
◎ 数据库服务器端:可以使用索引、缓存、SQL性能优化等手段,还可以使用NoSQL数据库来优化数据模型和存储结构等。
◎ 衡量架构性能的一系列指标:重要的指标有响应时间、TPS、系统性能计数器等,通过这些指标可以确定系统设计是否达标。
可用性
可用性即系统不间断地提供服务的时间。几乎所有网站都承诺7×24 小时提供服务,但任何网站都不可能完全做到,总会有一些不可用的时间,扣除这些不可用的时间后,就是网站的可用时间。一些架构可以做到4个9以上的可用性,也就是99.99%。
让架构高可用的主要手段是冗余,应用部署在多台服务器上同时提供服务,数据存储在多台服务器上相互备份,任何一台服务器都不会影响应用的整体可用,通常的实现手段是将多台服务器通过负载均衡设备组成一个集群。
衡量一个系统架构设计是否满足高可用的目标,就是假设系统中任何一台或者多台服务器宕机,以及出现各种不可预期的问题,而这时系统整体是否依然可用。
伸缩性
大型网站需要面对大量用户的高并发访问和海量数据存储,网站通过集群的方式将多台服务器组成一个整体共同提供服务。所谓的伸缩性是指通过不断向集群中加入服务器来缓解不断增加的整体上的用户并发访问压力和数据存储需求。
衡量架构伸缩性的主要标准就是能否用多台服务器构建集群,是否容易向集群中添加新的服务器,加入新的服务器后是否可以提供和原来的服务器无差别的服务,以及集群可容纳的总服务器数量是否有限制。
扩展性
不同于其他架构要素主要关注非功能性需求,网站的扩展性架构直接关注网站的功能需求。网站在快速发展,功能也在不断扩展,能够快速响应需求的变化,是设计网站可扩展架构的主要目标。
衡量网站架构扩展性好坏的主要标准就是在网站增加新的业务产品时,是否可以实现对现有产品透明、无影响,不同产品之间是否很少耦合等。网站可扩展架构的主要手段事件驱动架构和分布式服务。事件驱动通常利用消息队列实现,通过这种方式将消息生产和处理逻辑分离。
服务器服务则是将业务和可复用服务分离,通过分布式服务框架进行调用。在新增产品时,可以通过调用可复用的服务来实现自身的业务逻辑,对现有产品没有任何影响。
安全性
互联网是开放的,网站的安全架构就是保护网站不受恶意访问和攻击,避免网站的重要数据被窃取。衡量网站安全架构的标准就是针对现存和潜在的各种攻击和窃密手段,是否有可靠的应对策略。