在项目的开发过程中,为了保证软件质量,服务端软件会被部署到多种环境中,目的是隔离开发、测试、正式环境。
按照我们公司目前的架构,服务端软件会经历 “联调环境” -> "测试环境" -> "正式环境" 的环境切换。
1. 联调环境,部署在本地服务器上,主要是用来给 APP 开发人员对接调试
2. 测试环境,部署在线上服务器的测试环境,主要是用来给测试人员进行功能测试
3. 正式环境,提供给正式用户使用
以前我们公司的方式是,在同一份代码的基础上,打不同环境的安装包出来,但这种方式很容易出错,例如,QA 使用一个正式环境的包进行测试,发现数据不正确,然后向开发人员进行反馈,最后几经周折才发现是用错了安装包。
二、任务需求
当 APP 打好包之后,在不同的环境下,访问同一接口的时候,APP 将自动请求相关环境下的服务:
1. 在联调环境中,APP 将自动请求联调服务器,api.local.odirus.me
2. 在测试环境中,APP 将自动请求测试服务器,api.test.odirus.me
3. 在正式环境中,APP 将访问正式服务器, api.online.odirus.me
三、解决方案
我们进行了第一次尝试,使用记录的方式,大致流程如下:
购买两台极路由,安装 Hosts 插件;在内网部署两台 Linux 服务器,安装 Nginx 软件。
1. 在第一台路由器 router-a 上修改记录: api.online.odirus.me -> nginx-1 服务器的 IP ,并且在 nginx-1 上做好 HTTP 转发规则:api.online.odirus.me -> api.local.odirus.me
2. 在第二台路由器 router-b 上修改记录: api.online.odirus.me -> nginx-2 服务器的 IP,并且在 nginx-2 上做好 HTTP 转发规则:api.online.odirus.me -> api.test.local.me
在使用APP的过程中,当设备连接 router-a 时,访问的接口服务将自动切换为 api.local.odirus.me;当设备连接 router-b 时,访问的接口服务奖自动切换为 api.test.local.me
这种方案,看似很美好,不过在实际工作过程中,会遇到很多诡异的问题,例如设备连接 router-a 的时候,APP 最终还是请求的 api.online.odirus.me 线上服务,所以极路由的 Hosts 插件还是不太稳定。
四、改进后的解决方案
经过摸索,我们认为自建 DNS 服务器将会更加稳定,大致流程如下:
在内网部署两台服务器,分别都安装 Nginx、dnsmasq,对应的IP、Nginx、dnsmasq 分别称为 server-1-ip, server-2-ip;server-1-nginx, server-2-nginx;server-1-dns, server-2-dns
1. 在第一台服务器上,设置 dnsmasq 的域名配置为 api.online.odirus.me -> server-1-ip,并且在 nginx-1 上做好 HTTP 转发规则:api.online.odirus.me -> api.local.odirus.me
2. 在第二胎服务器上,设置 dnsmasq 的域名配置为 api.online.odirus.me -> server-2-ip,并且在 nginx-2 上做好 HTTP 转发规则: api.online.odirus.me -> api.test.odirus.me
在使用APP的过程中,当设备的 dns 修改为 server-1-dns 时,访问的接口服务将自动切换为 api.local.odirus.me;当设备的 dns 修改为 server-2-dns 时,访问的接口服务奖自动切换为 api.test.local.me