作者:徐桂林
1、背景
在软件发展的几十年历程中,人们一直在孜孜不倦地追求用更快的速度交付更高质量的软件及服务。无论是不断革新的软件工程思想,还是持续优化的编程语言及工具,亦或是纷纷出现的可复用开发、测试框架,无不大大提高了整个软件开发及交付的效率。但是,与此同时,软件系统复杂度急速上升,可靠性要求越来越高,这让软件快速交付依然非常具有挑战。尤其是进入互联网和云计算时代,市场竞争异常激烈,人们对于软件交付的周期已经从原来的以季度、年度为单位缩短到以天计算,以便在市场中快速试错,找到真正的用户需求。这些都给传统的软件开发、测试体系提出了巨大的挑战。
最近几年,公有IaaS云快速发展,人们已经认识到云计算带来的强大敏捷性和低成本优势。在越来越多软件及服务的生产环境直接部署和运行在IaaS云上的同时,企业级用户也在积极尝试利用IaaS云服务来改进自己的软件开发、测试体系。但是,由于发展路径问题,国内的公有云开发人员还是习惯于以包年包月的方式使用IaaS云服务,并没有充分发挥出云计算弹性、灵活和按需服务的优势。随着国内IaaS云开始普遍提供API,国内的开发人员必定也会逐步体会到弹性云计算带来的具体优势,并逐步适应这种新模式。因此,使用云来加速开发测试也正离国内开发者越来越近,并将会被广泛接受。
2、传统开发、测试中的挑战
在软件开发、测试中,一般需要经过开发、测试,验收和上线四个阶段,同时也对应有四个环境:开发环境,测试环境,验收环境和生产环境,即所谓的DTAP。整个流程如下所示:
在这样一个复杂且冗长的流程中,需要不断地涉及到环境的准备以及应用程序的部署。而且涉及人员也非常多,包括开发、测试和运维。面对这些挑战,传统的软件开发测试体系中普遍存在一系列问题:
- 获取基础设施(硬件、软件和网络等)非常困难,而且基础设施的交付周期也非常长。由于采购基础设施多为一次性投入,成本还非常大,企业在做这样决定都非常谨慎。除非是已经被市场验证的想法和产品,企业一般不太容易快速决定相关采购。即使决定采购,从下单到交付仍然是一个漫长的过程(常常以月为单位计算)。所以为了避免影响工程进度或者节省成本,经常会看到多位开发测试人员(甚至多个产品团队)共用一套开发或者测试环境,然后就会出现为协调使用基础设施而邮件漫天飞的场景。更为糟糕的是很多好的想法和构思因为冗长的基础设置准备过程而错失市场机遇,甚至直接就胎死腹中。
- 部署和维护各种开发及测试环境令人头痛。当我们有了足够的硬件资源来支持开发、测试后,另外一个问题又随之而生。如何管理、部署这么多环境,如何让这么多环境保持一致。例如,使用的Linux内核是不是一个版本吗?都装了统一版本的Python吗?大家在不同的环境上是用一致的代码做测试吗?这样的问题必然会影响到整个团队的开发效率,最后非常有可能的结果就是大家还是会回到只用一个公共开发测试环境(这样又开始重新相互影响),亦或土豪公司会再招个专职的人员来维护这些环境(于是,这个人会成为新的单点,他/她一不在场时大家都傻眼了)。除了开发、测试环境之间的一致性维护工作外,保持开发及测试环境和生产环境的一致同样具有挑战。因为某个配置的不一致导致测试通过的代码在生产环境不工作是常有的事情。因为某个新功能需要升级第三方依赖库,在测试环境做了升级而生产环境却忘了也隔三差五的来一次。于是穷尽各种细节的环境描述,部署文档便塞满了公司内部的Wiki或者某个文档管理平台。当然,这些文档基本上是在完成的那一刻就已经过时,让后来的阅读者只会越看越糊涂。
- 开发及测试环境无法完全复现生产环境的场景。在实际运营中,生产环境总是承受最严酷的考验(大流量的请求,频繁的攻击等)。但是,由于成本和意识上的一些问题,大家在开发及测试环境中很难复现这些场景并进行预先的测试。而且很多问题(尤其是在分布式系统中)都是在规模到达一定程度后才会出现,通常开发及测试环境都很难模拟出生产环境的规模。
- 人为的割裂IT、开发、测试和运维部门也是在传统软件开发、测试体系中经常碰到的问题。这个直接导致流程的冗长和信息沟通的不畅,尤其是在系统非常复杂时,需要让各个不同部门之间的人能对整个系统有一致理解是非常不容易的事情。
由于上面这些普遍存在的问题,软件开发人员的生产效率受到极大影响。当然,人们也在思想层面和实践层面不断改进这个流程,其中最近几年盛行的DevOps思想得到了广泛的认同。个人认为DevOps思想中最关键的点在于打破传统软件开发过程中的人为割裂和“残酷无情”的推动自动化流程。前者意味着用统一的方式管理整个DATP流程和环境,而后者则是通过可复用的自动化工具和脚本把整个流程和环境部署、维护的知识固化下来,变成可直接操作的行动。
3、云计算带来了新可能
由于前面所述的各种挑战和问题,以及DevOps思想的广泛认同,越来越多的公司开始行动起来改进既有的开发、测试流程,各种打着DevOps标签的辅助工具也涌现出来。但是工程人员在获取基础设施方面的效率仍然无法令人满意(这个问题尤其在创业公司和中小企业里面更为明显)。幸好,云计算(尤其是公有IaaS云)的到来极大地改变了这个现状。具体体现在下面几个方面:
- 云计算提供了近乎无限量的基础设施资源,而且你在任何时候都可以立马获得。笔者就亲自经历过一个下午启动2000台云主机进行测试的真实场景。有多少公司可以一次批准采购2000台机器的预算,而且之前让一个下午就立马到位这么多服务器也基本是不可能的。另外,你获取这些基础设施资源的过程是完全“自助”式的,不需要依赖任何专门的IT或者网络工程师。
- 云计算提供了全新的基础设施资源成本模式,从原来的一次购买变成了按需付费。你只需要为自己具体使用的基础设施资源量付费。在云计算时代,1000台机器计算1个小时和让1台机器运行1000个小时的成本竟然是相等的。
- 云计算让基础设施资源“可编程”。在传统IT时代,基础设施资源总是显得冰冷、生硬,程序员拿它无可奈何。你要组建一个虚拟网络或者获取个公网IP都得走申请流程,找运维人员。而且,绝大部分公司为了简化管理成本或者安全考量,还会对基础设施的使用制定一堆或合理,或不合理的规则制度,这都极大地限制了程序员的手脚。在云时代,绝大部分的公有或者私有IaaS云提供商都支持API(还没有提供API的也都在加班加点的准备API中)。程序员可以非常灵活的调用这些API,使用标准的基础设施单元构建自己应用的基础设施架构。
在解决了软件开发人员获取基础设施资源困难的同时,云计算还带来了大量额外的好处。目前,主流的公有IaaS云服务商在提供基础设施云服务的同时,还会提供如数据库服务,监控服务,队列服务,通知服务等一系列常见组件。这些服务同样即插即用,按需付费。而且这些云服务都是由一流工程师开发,富有经验的人员运维,经过了严酷的实际生产环境考验。开发人员完全可以信任他们。
4、云时代的开发和测试
前面讨论了DevOps思想和IaaS平台各自的优势,而这两者恰恰又是可以很好结合来达到更好的效果。尤其是在帮助开发人员加速软件开发测试效率,缩短交付周期上非常有用。这种加速主要体现在下面几个方面:
- 利用IaaS平台加速开发和测试人员获取基础设施的效率。在云时代,开发和测试人员可以在分钟级别、以非常低的成本获得想要的基础设施,而且这些基础设施还不需你投入人力、财力来维护。同时,由于基础设施获取的便捷性和低成本,它让原来受限于基础设施而无法并行的事情现在得以完全并行展开。例如,每个开发人员都可以获得一个和生产环境完全一致的基础设施并行开发,开发和测试的工作也可以并行推进,各种不同想法也能并行得到快速验证。
- 利用DevOps思想和可编程的IaaS资源融合软件开发的各个阶段,打破原来存在的人为割裂,加速整个流程的迭代速度。如前面所述,软件开发过程中一般包括开发、测试、验收和生产几个阶段,每个阶段都可以有自己独立的运行环境,而且每个阶段甚至是由各自独立的人员来负责。在云时代,所有的基础设施和应用程序的运行环境都可以通过自动化流程一体化管理,且所有的部署、交付工作都是自动化完成。因为是一体化管理,各个环境的不一致性就能得到很好的控制,可以极大地避免因为环境问题导致的开发流程受阻。如此同时,开发人员可以利用IaaS公有云提供的大量低成本资源更容易地在开发、测试和验收环境中模拟出更多原来只能在生产环境中才能出现的场景,如大规模的流量压力,大量用户同时在线等。这样可以更早发现系统的性能瓶颈,设计和实现的缺陷。
- 通过直接使用大量的通用云服务来减少工作量,加速软件上线周期。毫无疑问,通过直接复用IaaS服务商提供的如数据库服务,监控服务等也大大加速了开发和测试流程。当然,要想在开发和测试中利用好这些通用云服务,你最好要把自己的开发测试体系和云紧密联系起来。
由于上面的这些明显的优势,越来越多的开发团队已经开始用IaaS加DevOps的方式改进自己的开发测试体系。为了让开发人员更容易地使用IaaS云服务支撑云环境下的开发测试,大量基于IaaS的DevOps工具也都把提升软件开发及测试效率作为一个重要的设计目标。在国内,FIT2CLOUD就是一个基于IaaS的DevOps及团队协作工具,它可以帮助开发人员降低使用公有云构建一个好开发测试体系的难度。其提供的服务包括:
- 集成市面上主流公有云(包括阿里云、AWS、青云、UCLOUD和腾讯云等),且已经利用API打通这些公有云的主要服务。用户只需要在FIT2CLOUD界面做些简单配置就能够构建一个用于开发或者测试的集群。
- 基于模板的快速资源创建和释放功能。你可以把开发测试流程中不同阶段需要用到的环境保存为FIT2CLOUD的模板,在需要的时候,团队内的任何人都可以在分钟级别获得一个完整的,用于开发、测试的基础设施。而且在不需要的时候及时释放掉,从而降低基础设施的使用成本。
- 基于脚本(如Shell、Python等)的全栈自动化工具。你可以把开发测试过程需要的各种重复性步骤(包括部署、管理等)脚本化,然后让FIT2CLOUD集中管理你的脚本,并在流程的各个指定阶段自动按需执行。这样能够把开发测试流程中的大量Knowledge固化下来变成可直接操作的行动(即 Deployment as code),而不依赖大量晦涩难懂的文档和特定人的大脑记忆。
- 提供自动水平扩容的支持。你在FIT2CLOUD内部按照虚机组管理集群内的虚拟机,并给虚机组设置自动扩容的条件,当条件满足时会自动启动更多的虚拟机加入服务。该功能用于压力测试非常方便。