我正在参与掘金创作者训练营第6期,点击了解活动详情
理论知识
定义
在快速迭代的互联网环境中,特别是在微服务体系中,服务从测试到线上正式环境的环境差异性较大,直接上线会造成多类风险耦合在一起的复杂型风险,所以很多公司采用了 开发环境 → 测试环境 → 预发布环境 → 灰度环境 → 正式环境的一套流程,主要目的是通过对环境的隔离来剥离耦合型风险,使不同种类型的风险分别在不同的环境暴露出来并加以解决。
本质上,预发布也算是线上环境/正式生产环境,只是其具有特殊的隔离特性(包括网络/数据/用户/行为等)。
必要性
- 验收的最终一致性(测试环境还有变动的可能性,导致验收结果的时效性)
- 暴露测试环境和线上环境的差异性导致的问题
- 解决一部分缺陷漏侧
- 解决部分测试环境无法测试的问题(例如第三方授权/第三方服务依赖等)
- 由于预发环境对研发是透明的,可以解决一部分研发的硬编码/坏习惯造成的问题
预发布环境和灰度环境的区别
| 预发布环境 | |
|---|---|
| 面向对象 | 测试/产品等内部人员 |
| 隔离性 | 物理隔离/机器隔离/网络隔离/真实用户无法访问 |
| 主要解决问题 | 漏侧/环境差异性 |
| 数据库 | 与线上共用/测试库/自建库 |
| 中间件 | 与线上共用(隔离)/测试环境/自建 |
| 网络 | 封闭网络,与线上隔离 |
| 后续步骤 | 可上灰度/如无灰度直接全量上线 |
几个关键的问题
数据库处理
数据库,根据目前的调研,预发布环境的数据库主要有两种措施
- 与线上共用同一套数据库
- 使用测试环境的数据库
因为数据都是通过业务逻辑来影响线上用户的,这里先屏蔽掉业务逻辑对线上用户的影响,只讨论单纯的数据结构的影响
与线上共用一套数据库
结论:尽量避免删改字段,如果相关需求,走废弃原字段,新增字段的方式
数据结构变更主要分为两种:
- 增加字段
- 删除/修改字段
由于增加字段对线上无影响,所以这种情况下,暂不考虑。
下面是增删字段的整体上线流程:
自建库/使用测试库
版本问题
版本问题是一个很重要但是又经常被忽略的问题。
版本问题主要有下面几个:
- 代码版本
- 数据库版本
- 中间件版本
- 依赖库/系统等版本
- 容器版本
版本问题需要按照名单check,保证版本一致
特殊的如删改字段的版本问题已经由上图给出
访问策略
- 单独的机器,单独部署,网络隔离
- 把预发布环境的访问域名设置成和线上环境的不一样,通过配置host来访问预发布环境
- 前端路由
依赖服务处理
根据预发布环境的定义,预发布属于线上正式环境,所以依赖服务与线上保持一致
依赖服务:
- 依赖的外部第三方服务
- 依赖的服务集群下的其他服务
中间件控制
中间件控制本着下面的几个原则:
- 线上数据和预发需要的数据不能互相影响
- 中间件版本需要保持严格的一致
所以可以采用两种策略来进行处理
- 自建
- 与线上使用同一套,但是要保证隔离
案例分析(以某物为例)
- 该公司的预发、灰度、线上使用的数据库和中间件全是同一套环境
- 发布时间在晚上,涉及表删改的采用停机发布的形式
- 定期发布大版本,大版本发布一天一夜,当次发布时,服务集群下的所有服务都采用同一个版本号
- 发布大版本时需要提前编排好服务发布顺序
- 大版本发布后,有值班计划,24小时值班
- 涉及表变更的,有严格的审批流程
- 大版本严格走 开发 → 测试 → 预发布 → 灰度 → 线上 的流程
通用的搭建流程
- 所需资源盘点
- 硬件资源
- 机器资源
- 数量
- CPU
- 内存
- 机器资源
- 网络资源
- 封闭网络
- 独立网络
- 环境资源
- 线上应用配置拷贝
- 线上中间件版本配置
- 数据库配置
- 网关/路由等设置
- 监控
- 硬件资源
- 搭建环境
- 服务流程试跑/整体流程联调