高可用可伸缩微服务架构:基于Dubbo、Spring Cloud和Service Mesh
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3 从软件的生命周期看架构设计

一个典型的软件生命周期如图1-2所示。

图1-2

可以把这些阶段概括为3个大的周期:设计期(包括立项、计划、技术选型与方案等)、实现期(包括开发、测试、发布、实施等)、运行期(或维护期,包括修复bug、新增功能、多版本维护等)。

1.设计期

在设计期,软件作为一个成品还不存在,所以我们可以称之为概念形态。此时架构师、产品经理或需求分析师等人员利用自己的经验和能力,对系统的业务需求进行分析、拆解、抽象,对系统的非功能性需求进行分析,形成业务文档和技术文档,以及技术验证代码等。这个阶段,架构设计工作是重中之重,其中包括:

● 系统拆分,如何把系统拆解为不同的子系统、模块、业务单元;

● 技术选型,使用什么样的基础技术框架或脚手架;

● 技术验证,确定核心技术难点如何解决,检验能否满足期望指标;

● 接口规范,系统内部的不同部分以何种形式确定接口契约和数据通信方式;

● 集成方式,系统与外部其他业务系统如何进行集成;

● 技术规范,如何规范开发、测试、部署和运维的技术标准性;

● 部署方案,系统如何进行物理部署,需要多少台机器、什么配置,对网络有什么要求;

● 运维方案,系统如何进行技术性运维,如何实现日常监控、预警报警;

……

这个阶段总结一下就是:需求导向,架构先行(包括业务架构和技术架构)。很多项目因为前期的设计阶段考虑得不够充分,导致在开发和运行期出现大量问题。

2.实现期

这个阶段主要是编码与测试,为部署上线做好准备,是软件从设计到最终的生产系统的过程,我们可以称之为代码形态。此阶段需要考虑的技术类工作如下:

● 确保各项技术规范和技术指标的执行落地,保障高质量的代码;

● 指导研发人员和解决各类技术问题,提升研发团队效率;

● 制定测试的技术性方案和基准,包括自动化、性能、安全等方面;

● 配合准备部署环境,运维实施方案落地等;

实现期的主要任务是大量软件工程师根据设计期的设计进行编码。大量的技术人员,大家背景不同,知识储备不同,编程水平和习惯不同,努力程度不同。如何让所有工程师既能够按数量保障项目进度,又能够按质量保障软件品质呢?秘诀就在于:技术标准的精确统一,系统部件的良好拆分,此外最好有适合于此类项目的脚手架,随时能解决各位技术难点问题的“救火队”。系统部件的良好拆分,保障了任务可以拆散成一个个的小单元,分发给不同的开发者。技术标准的精确统一,可以实现不同个体的产出物最大程度的一致性。

这个时期因为业务调整或技术问题,可能会对架构设计的一些细节进行小范围的调整,以适应实际项目的建设需要。在这个过程中,同时需要根据实际变化,对现有的设计文档进行同步调整,以便精确地描述系统的状态及变化。

3.运行期

这个阶段系统上线、验收通过,已经初步稳定,然后开始进入维护阶段,成为设计期架构设计草图的一个可用实例,我们可以称之为实例形态。此时需要考虑:

● 发布上线相关基础性工作,包括是否使用持续集成(CI)、自动化发布等技术;

● 运维基础性工作,自动化运维、监控等相关技术;

特别是发布与运维工作,一般要作为整个研发团队的通用性基础设施来考虑。不同的业务线或系统,可以复用一套基础设施来服务于生产环境。进入维护期后,软件系统日常通过内外部用户反馈的问题和改进意见,不时需要修改代码发布补丁版本,或者调整配置以满足用户需要。经过较长一段时间,业务模式和内外部环境发生了比较大的变化后,系统简单的补丁维护可能已无法满足用户需求,需要大范围地添加新功能和修改旧功能的逻辑流程。此时就可以成立专门的团队,重复上面的步骤,基于现有系统重新做一些改造性的设计重构(设计期),再编码实现(实现期),最终发布一个较大的版本(运行期)。

在软件的整个生命周期里,架构师(或架构组)是一个项目或产品线的技术负责人。再大一点的组织,比如公司或研发中心级别层面也许还有架构部。架构师、架构组、架构部在不同层面对自己工作涉及的所有技术问题负责。其实上面罗列的这些工作汇总一下,再加上技术规划与执行落地、技术人才的选拔与培养等,可以作为项目组架构师或研发团队架构组的工作职责。