线下环境细分出集成测试环境、开发测试环境以及多个项目环境之后,带来的最大的成本其实不在资源上,而是在管理和维护上,而且单单就线下维护的工作量来说,甚至要超过线上维护的工作。

复杂度和涉及到的技术点有以下四个方面。

第一是网段规划。每个环境都要有独立的网段,比如整个线下环境要独立占用一个 B 段,项目环境和开发测试环境相对较小,可以独立占用一个 C 段。虽然不需要做网络策略上的隔离,但是为了便于管理,如分配回收资源以及部署应用,还是要在逻辑上区分出来。同时,网段规划也是为下面的单元化调用做准备。

第二是服务化框架的单元化调用。这一点需要服务化框架支持,比如上面我们提到的项目环境,到了联调阶段就需要一组应用单独联调,而不能跨项目环境调用。同时,对于项目中依赖的未变化的应用,就需要调用集成测试环境中稳定版本的应用。这个服务调用的基本规则就是基于上述网段的规划来建立的,规则要放到服务化的注册中心,也就是 ConfigServer 这个部件中保存,同时需要服务化框架支持规则调用,优先支持本单元调用,本单元不存在可以调用集成测试环境单元。

第三是环境的域名访问策略。这么多的环境 ,内外部 DNS 域名是保持一套还是多套,比如访问蘑菇街主页(www.baidu.com),首页域名就一个,但是怎么能确保访问到我们所期望的环境上呢。这里有几种方式:

  • 第一种,DNS 服务保持一套,域名,特别是外部域名多套,每个环境分别配置一个不同的域名,比如开发测试环境,dev.baidu.com。但是如果这样,下层的二级域名和二级目录等等都要跟着变动,而且对于项目环境来说,数量不固定,每次都换一个也不方便记忆和管理,所以这个方案基本不可行。
  • 第二种,DNS 服务保持一套,域名保持一套,但是做域名的 hosts 绑定,也就是自己来设置要访问域名所对应的环境。这样一来,如果相对固定的开发测试环境和集成测试环境所对应的 hosts 相对固定,那么只需要绑定一次就可以通用。但是项目环境始终在不断的变化中,绑定规则可能随时在变化,所以这种方案的复杂度在于对 hosts 配置的管理上。
  • 第三种,DNS 服务多套,也就是不同的环境中配置独立的 DNS 服务,这样可以减少繁琐的 hosts 绑定,但是也会提高多套 DNS 服务管理上的复杂度,而且对于项目环境有可能依赖集成测试环境中的服务,这时仍然会涉及本地 DNS 服务的 hosts 绑定。
  • 第四种,对于公网域名,可以直接通过无线路由劫持的方式访问,可以在无线路由器上配置多个接入点,这样一来,连接不同的接入点,就会自动对应到不同环境的域名 IP 地址上去。

通常,对于公网域名来说,如果具备稳定的环境,如集成测试环境,直接通过第四种劫持方式指定到对应环境中去,这样最方便,这种方案在后续线上多环境建设中还会使用。

对于内部域名,则有多种方案,没有优劣,主要看场景和管理成本。我们选择的是第二  种,即绑定 hosts 的方式。每个环境会对应一套 hosts 配置,当选择不同环境进行联调或访问时,就将 hosts 配置下发到对应部署应用的主机上。

第四是自动化管理。按照我们之前分享的管理模式,这里虽然有这么多的线下环境,但我还是会把它们以应用为核心给管理起来,即应用的开发测试环境,应用的集成测试环境,应用的项目环境。这样一来,上面提到的不同环境的网段信息、配置信息、资源分配回收以及软件部署发布,都能够以应用为出发点去做。

最后,在实际操作中,仍然会很多细节问题,这些问题会跟业务场景有关,针对这些场景又有可能有不同的建设要求,比如消息的消费问题会涉及全业务流程验证等等。