本文共 3424 字,大约阅读时间需要 11 分钟。
在上一期文章里,我们介绍了多环境下的应用配置管理问题,从这期开始,我们会分两期文章详细聊聊多环境建设的问题:就是我们到底需要哪些环境?这些环境都有什么作用?环境建设的思路和方式是怎样的?
今天我就结合自己的经验和理解与你聊一聊持续交付中的线下多环境建设。
通常,我们主要按照环境所起到的作用,将环境分为两大类:
从建设角度来说,线下环境和线上环境,在网段上是要严格隔离的。这一点在做环境建设时就要确定网络规划,同时在网络设备或者虚拟网络的访问策略上要严格限定两个环境的互通,如果限制不严格,就极易引起线上故障,甚至是信息安全问题。
如果你维护过这样两套环境,我想你一定在这方面有过深刻的感受,甚至是痛苦的经历。
所以,从规划上,线上环境和线下环境是两套独立的区域,所有的应用、基础服务都是全套独立部署的。但是线下环境所需的资源往往是要少于线上环境,毕竟只有负责开发测试的少数人使用,不会有线上流量进来。如下图所示:
再往后,开发测试环境上,又会出现开发和测试的冲突和争抢,因为从场景上,业务开发团队可能要同时承担多个并行项目的研发,而且可能会有多个业务开发团队一起参与进来。
比如对于电商来说,到了年底,就集中会有“双11”、“双12”、“双旦节”以及“年货节”等等这样的大型营销项目,因为时间非常紧凑,所以就必须多项目并行。
这个时候,分解下来,对于我们的应用软件来说,有可能是存在多个开发分支的。到了项目联调和验证环节,就必然会存在同一个应用有多个版本需要同时发布和测试的情况,但是开发测试环境却只有一个,这就必然导致双方激烈的争抢。
所以这个时候,就必须建立解决冲突的方案,开始建设线下的第三套环境:项目环境。
项目环境可能有多套,一个项目对应一套环境,但是无论从资源成本还是维护成本方面考虑,项目环境仍然不会像集成测试环境那样形成一套完整的开发测试体系。
所以项目环境同开发测试环境一样,仍然是以最小化为原则来建设,也就是说,在这个环境里面,只部署同一项目中涉及变更的应用,而对于基础服务和不涉及项目需求变更的应用不做重复建设。如果对项目环境中不存在的应用有依赖,那么访问集成测试环境中对应的应用就可以了。
在这里,我们同样以简单的模型展示多个项目测试环境、开发测试环境与集成测试环境的关系:
不过,如果说随项目的增加就需要分别建设对应的项目环境,那么这对于开发、测试和运维来说都会有非常大的维护负担。所以通常情况下,我们会严格限制建设项目环境的起步线。
比如只有公司级大促、公司战略级的项目,或者超过一定人日的跨团队项目,才允许建立独立的项目环境。一般情况下,还是引导优先使用开发测试环境。
线下环境细分出集成测试环境、开发测试环境以及多个项目环境之后,带来的最大的成本其实不在资源上,而是在管理和维护上,而且单单就线下维护的工作量来说,甚至要超过线上维护的工作。
复杂度和涉及到的技术点有以下四个方面。
第三是环境的域名访问策略。这么多的环境,内外部DNS域名是保持一套还是多套,比如访问蘑菇街主页(www.mogujie.com),首页域名就一个,但是怎么能确保访问到我们所期望的环境上呢。这里有几种方式:
第一种,DNS服务保持一套,域名,特别是外部域名多套,每个环境分别配置一个不同的域名,比如开发测试环境,dev.mogujie.com。但是如果这样,下层的二级域名和二级目录等等都要跟着变动,而且对于项目环境来说,数量不固定,每次都换一个也不方便记忆和管理,所以这个方案基本不可行。
第二种,DNS服务保持一套,域名保持一套,但是做域名的hosts绑定,也就是自己来设置要访问域名所对应的环境。这样一来,如果相对固定的开发测试环境和集成测试环境所对应的hosts相对固定,那么只需要绑定一次就可以通用。但是项目环境始终在不断的变化中,绑定规则可能随时在变化,所以这种方案的复杂度在于对hosts配置的管理上。
第三种,DNS服务多套,也就是不同的环境中配置独立的DNS服务,这样可以减少繁琐的hosts绑定,但是也会提高多套DNS服务管理上的复杂度,而且对于项目环境有可能依赖集成测试环境中的服务,这时仍然会涉及本地DNS服务的hosts绑定。
第四种,对于公网域名,可以直接通过无线路由劫持的方式访问,可以在无线路由器上配置多个接入点,这样一来,连接不同的接入点,就会自动对应到不同环境的域名IP地址上去。
通常,对于公网域名来说,如果具备稳定的环境,如集成测试环境,直接通过第四种劫持方式指定到对应环境中去,这样最方便,这种方案在后续线上多环境建设中还会使用。
对于内部域名,则有多种方案,没有优劣,主要看场景和管理成本。我们选择的是第二种,即绑定hosts的方式。每个环境会对应一套hosts配置,当选择不同环境进行联调或访问时,就将hosts配置下发到对应部署应用的主机上。
在这里,我们仍然以模型展示第二、四种方案和多种线下环境之间的运行逻辑:
但是,无论采取哪种方式,我们可以看到,这个管理过程仍然是比较复杂繁琐的,必须要非常仔细地规划和部署,同时还需要配套的自动化工具支持,否则靠人管理是不现实的,所以最后一点就是自动化的配套。
最后,不知道你有没有感受到,单单一个线下环境就要如此复杂和繁琐,整个持续交付体系建设是多么的有挑战性,就可想而知了。
我们对线下环境稍微做个总结:
最后,在实际操作中,仍然会很多细节问题,这些问题会跟业务场景有关,针对这些场景又有可能有不同的建设要求,比如消息的消费问题会涉及全业务流程验证等等。
所以,留几个问题给你思考:在线下环境的建设过程中,你通常会遇到哪些问题?会有哪些独立环境?或者你有什么更好的经验和建议分享?
老师这个线下多项目环境按最小化部署我不太理解啊,比如一个a应用部署了两个开发环境,但是如果依赖的dubbo都是一套的话这个调用如何分离呢?
服务化框架要支持本单元(环境)调用优先,在框架能力强要做一些改造。不然就会出现你说的问题
转载地址:http://przwk.baihongyu.com/