当前位置: 首页 > news >正文

服务平滑发布与线上验证

发布策略可分为:

  • 蓝绿发布:将新版本服务器全部发好后,将旧版本服务器的流量统一切换到新版本上
  • 灰度发布(金丝雀发布):是一种滚动发布方式,首先部署部分新版本服务器,将部分流量切到新版本上进行灰度验证,后逐步增大灰度范围至全量

在业务服务的部署过程中,通常通过预发机器来验证新版本代码,验证完成后滚动发布线上机器。

但是发布过程中通常涉及多方服务的依赖,包括前后端、后端服务间、服务与数据库间。

前后端平滑发布

常见的场景是后端接口返回新增字段,此时需要后端先发布,前端再发布。

但若后端接口做了非前向兼容的变更呢?此时在原有接口基础上在进行改动线上不能达到平滑切换的目的,
因此需要新增“v2”接口,前端新版本均替换为调用后端的“v2”接口,因此再后端发布过程中,“v1”接口仍然能正常提供服务,
当前端发布完新版本后,流量会全走到“v2”接口,示意图如下:

请添加图片描述

二方包打包策略

二方包即公司内部服务之间RPC调用所需的依赖,通常为接口定义,具体实现包括Open Feign、Dubbo等。

在上线前需要将测试环境的SNAPSHOT版本的包替换为正式版本,需要注意的是SNAPSHOT版本通常是可覆盖的,
而正式版本只能追加不能变更包中代码的,所以SNAPSHOT版本应严禁上线。

当两个服务之间是单向依赖时,如A服务依赖B服务的二方包,只需B服务先上线并提供正式版本,A服务修改依赖B的二方包为
正式版本后上线。

而B的正式包什么时候打呢?以哪个分支打呢?有两种

  1. B服务上线后并合到master后,以master分支打包
  2. B服务预发验证完,上线前打包,以特征分支打包

使用方式1的弊端是当存在二方包循环依赖时,需要一方以SNAPSHOT上线
使用方式2的弊端是在多人开发时,B服务的二方包并不是最新的master代码,如果直接打包上线可能把已经上线的代码冲掉。

方式2的弊端可以在CD流程中增加校验来避免:当前上线分支是否包含master的最新commit。

所以推荐方式2+CD校验master最新commit方式。

MySQL online DDL

开发需求时经常需要对已有的MySQL表加字段、加索引等操作,

Mysql 8.0 onlineDDL支持的方式,一共有三种方式:Instant、In Place、Rebuilds Table【即copy,后面统一用copy说明】其中Instant最快,InPlace次之,copy最慢;

关于DDL的操作支持那种方式,需要参看官方文档:Online DDL Operations

如果执行不当将可能导致锁表,影响业务线上使用,可以通过指定方式来执行DDL:

ALTER TABLE xxx MODIFY COLUMN note varchar(63) DEFAULT '' COMMENT '备注',ALGORITHM=INPLACE,LOCK=NONE;

在语句上加上 ALGORITHM = INPLACE, LOCK = NONE;可以保证若语句不按INPLACE方式执行则立即失败。

此外,如果对表结构有较大变动,而又不想影响业务正常运行, 可以将源表复制出来一份, 数据完全复制到新表后再进行表名替换,替换是原子的,可参考gh-ost。

Git项目多服务发布

通常一个Git项目会有多个服务,当项目代码改动时,改动涉及的服务都应发布,否则会出现线上不同服务之间的代码来自不同版本,
如果只发布当前改动服务,其他服务在改动服务上线后可能会由于不兼容的变更而运行报错。

线上验证

在预发和上线后需要对代码进行验证,尽量在不影响线上用户的情况下完成。

在开发时就需要为后续的验证“开后门”,常用的方式有黑名单,白名单,特性开关,灰度,指定参数运行任务等。

黑名单,白名单,特性开关,灰度方式均通过配置中心来控制,能够做到实时变更;
而一些定时任务的验证需要添加参数,如果参数不为空则按参数运行任务,以此来指定对象进行验证,避免影响线上用户。


http://www.mrgr.cn/news/81547.html

相关文章:

  • JVM的详细介绍
  • Virtualbox安装ubuntu20虚拟机无法打开终端
  • 【探商宝】企业信息查询多维度解析---工商附加篇
  • 使用Streamlit部署机器学习模型
  • sentinel笔记10- 限流规则持久化(下)
  • 金仓数据库安装-Kingbase v9-centos
  • 秒鲨后端之MyBatis【1】环境的搭建和核心配置文件详解
  • tslib(触摸屏输入设备的轻量级库)的学习、编译及测试记录
  • 增强路由器 路由器升级宽带速度
  • Text2Reward学习笔记
  • 【强化学习】Stable-Baselines3学习笔记
  • Linux系统下安装webstorm
  • 华为管理变革之道:管理制度创新
  • 19、vue3组件通信
  • Java抽象工厂+单例模式
  • 【Java】Jackson序列化案例分析
  • 使用Grafana中按钮插件实现收发HTTP请求
  • 前端登录业务
  • 企业内训|高智能数据构建和多模态数据处理、Agent研发及AI测评技术内训-吉林省某汽车厂商
  • Chapter 03 复合数据类型-1
  • K8S部署CloudNativePG,忘记设置密码,修改管理员密码解决方案
  • [c++进阶(三)]单例模式及特殊类的设计
  • 安装k8s涉及命令(方便放到txt离线使用)
  • 攻防世界web第二题unseping
  • C++模板:编译时模拟Duck Typing
  • LLaMA-Factory GLM4-9B-CHAT LoRA 指令微调实战