浅谈预发布环境搭建

4,262 阅读4分钟

我正在参与掘金创作者训练营第6期,点击了解活动详情

理论知识

定义

在快速迭代的互联网环境中,特别是在微服务体系中,服务从测试到线上正式环境的环境差异性较大,直接上线会造成多类风险耦合在一起的复杂型风险,所以很多公司采用了 开发环境 → 测试环境 → 预发布环境 → 灰度环境 → 正式环境的一套流程,主要目的是通过对环境的隔离来剥离耦合型风险,使不同种类型的风险分别在不同的环境暴露出来并加以解决。

本质上,预发布也算是线上环境/正式生产环境,只是其具有特殊的隔离特性(包括网络/数据/用户/行为等)。

必要性

  • 验收的最终一致性(测试环境还有变动的可能性,导致验收结果的时效性)
  • 暴露测试环境和线上环境的差异性导致的问题
  • 解决一部分缺陷漏侧
  • 解决部分测试环境无法测试的问题(例如第三方授权/第三方服务依赖等)
  • 由于预发环境对研发是透明的,可以解决一部分研发的硬编码/坏习惯造成的问题

预发布环境和灰度环境的区别

预发布环境
面向对象测试/产品等内部人员
隔离性物理隔离/机器隔离/网络隔离/真实用户无法访问
主要解决问题漏侧/环境差异性
数据库与线上共用/测试库/自建库
中间件与线上共用(隔离)/测试环境/自建
网络封闭网络,与线上隔离
后续步骤可上灰度/如无灰度直接全量上线

几个关键的问题

数据库处理

数据库,根据目前的调研,预发布环境的数据库主要有两种措施

  1. 与线上共用同一套数据库
  2. 使用测试环境的数据库

因为数据都是通过业务逻辑来影响线上用户的,这里先屏蔽掉业务逻辑对线上用户的影响,只讨论单纯的数据结构的影响

与线上共用一套数据库

结论:尽量避免删改字段,如果相关需求,走废弃原字段,新增字段的方式

数据结构变更主要分为两种:

  1. 增加字段
  2. 删除/修改字段

由于增加字段对线上无影响,所以这种情况下,暂不考虑。

下面是增删字段的整体上线流程:

自建库/使用测试库

版本问题

版本问题是一个很重要但是又经常被忽略的问题。

版本问题主要有下面几个:

  • 代码版本
  • 数据库版本
  • 中间件版本
  • 依赖库/系统等版本
  • 容器版本

版本问题需要按照名单check,保证版本一致

特殊的如删改字段的版本问题已经由上图给出

访问策略

  • 单独的机器,单独部署,网络隔离
  • 把预发布环境的访问域名设置成和线上环境的不一样,通过配置host来访问预发布环境
  • 前端路由

依赖服务处理

根据预发布环境的定义,预发布属于线上正式环境,所以依赖服务与线上保持一致

依赖服务:

  1. 依赖的外部第三方服务
  2. 依赖的服务集群下的其他服务

中间件控制

中间件控制本着下面的几个原则:

  1. 线上数据和预发需要的数据不能互相影响
  2. 中间件版本需要保持严格的一致

所以可以采用两种策略来进行处理

  1. 自建
  2. 与线上使用同一套,但是要保证隔离

案例分析(以某物为例)

  1. 该公司的预发、灰度、线上使用的数据库和中间件全是同一套环境
  2. 发布时间在晚上,涉及表删改的采用停机发布的形式
  3. 定期发布大版本,大版本发布一天一夜,当次发布时,服务集群下的所有服务都采用同一个版本号
  4. 发布大版本时需要提前编排好服务发布顺序
  5. 大版本发布后,有值班计划,24小时值班
  6. 涉及表变更的,有严格的审批流程
  7. 大版本严格走 开发 → 测试 → 预发布 → 灰度 → 线上 的流程

通用的搭建流程

  1. 所需资源盘点
    • 硬件资源
      • 机器资源
        • 数量
        • CPU
        • 内存
    • 网络资源
      • 封闭网络
      • 独立网络
    • 环境资源
      • 线上应用配置拷贝
      • 线上中间件版本配置
      • 数据库配置
      • 网关/路由等设置
      • 监控
  2. 搭建环境
  3. 服务流程试跑/整体流程联调